请问这样的字符串怎么样分割???急。(200分)

  • 主题发起人 主题发起人 smartguolei
  • 开始时间 开始时间
S

smartguolei

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好,我现在要输入一些IP地址及MAC地址,因为要在大型的路由器上进行,为了确保操作无失误,我打算采用postmessage的方法进行模拟输入,例如:IP地址:edit1.text=192.168.2.45
转换成ASCII值,也就是键值:edit2.text=$31$39$32$6e$31$36$38$6e$32$6e$34$35
我想把这一串键值分割出来,然后进行达到下列结果
postmessage(h,wm_keydown,$31,0); //send 1
postmessage(h,wm_keydown,$39,0); //send 9
postmessage(h,wm_keydown,$32,0); //send 2
postmessage(h,wm_keydown,$6e,0);//输入.键
postmessage(h,wm_keydown,$31,0); //send 1
postmessage(h,wm_keydown,$36,0); //send 6
postmessage(h,wm_keydown,$38,0); //send 8
postmessage(h,wm_keydown,$6e,0);//输入.键
postmessage(h,wm_keydown,$32,0); //send 2
postmessage(h,wm_keydown,$6e,0);//输入.键
postmessage(h,wm_keydown,$34,0); //send 4
postmessage(h,wm_keydown,$35,0); //send 5
我怎么进行分割啊。然后读取出来达到下列效果,我怎么做啊。用什么循环啊我就200分啊。
 
procedure SplitString(s:string;delim:char;ts:TStrings);
var i:integer;
t:string;
begin
t:='';
for i:=1 to length(s) do
begin
if (s<>delim) then t:=t+s else
begin
ts.add(t);
t:='';
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
ts:TStringList;
begin
s:='$31$39$32$6e$31$36$38$6e$32$6e$34$35';
ts:=TStringList.Create;
SplitString(s,'$',ts);
showmessage(ts.Text);
ts.Free;
end;

你试试看.
 
var t:array[1..100]of string;
i:integer;
tstr:=$31$39$32$6e$31$36$38$6e$32$6e$34$35;
tstr:=copy(tstr,pos('$',tstr)+1,len(tstr);
repreat
inc(i);
t:=copy(tstr,1,pos('$',tstr)-1);//存放分解的数据
tstr:=copy(tstr,pos('$',tstr)+1,len(tstr);
until pos('$',tstr)=0;
t[i+1]:=tstr;//最后一组数据
 
你这是要将一个字符串转换成一个个数值表示而已吧
可以用Ord()函数取ASCII值
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
i: Integer;
begin
s := Edit1.Text;
for i := 1 to Length(s) do
if s = '.' then
postmessage(Edit2.Handle,wm_keydown,$6e,0) //我也不太明白"."非要$6e来表示,用原值$2e就是显示不出来,
else
postmessage(Edit2.Handle,wm_keydown,Ord(S),0);
end;
 
谢谢大家的回复。
to tommy
你好。我用你的方法,没有问题。为试了为什么我减号显示不出来。'-'
procedure TForm1.Button4Click(Sender: TObject);
var
s: String;
i: Integer;
h:Thandle;
begin
h:= FindWindow(nil, 'c:/windows/system32/cmd.exe'); //程序标题
s := Edit1.Text;
for i := 1 to Length(s) do
if s = '.' then

postmessage(h,wm_keydown,$6e,0) //我也不太明白"."非要$6e来表示,用原值$2e就是显示不出来,
else
if s='-' then
postmessage(h,wm_keydown,$6c,0)//这是空格
else
postmessage(h,wm_keydown,Ord(S),0);
end;
假如我在edit1.text里输入 192.168.2.45 00-12-50-83-95
程序运行后,我在cmd.exe里看到的是192.168.2.45 0012508395 空格没有显示出来
谢谢你的热心回复。

按这里返回
 
to tommy
还有一个问题是。
假如我在edit1.text里输入 192.168.2.45 00-ec-ac-45-3s-4f
程序运行后,我在cmd.exe里看到的是>192.168.2.45 00531345346 如果是字母就显示的不正确。
 
我查了一下keydown消息键值与字符的数值是不一样的,所以会出现这样的情况;
根据你的描述,你是想将命令行输入改在编辑框中进行,应该使用WM_Char消息,
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
i: Integer;
h:Thandle;
begin
h:= FindWindow(nil, 'c:/windows/system32/cmd.exe'); //程序标题
if h <> 0 then
begin
s := Edit1.Text;
for i := 1 to Length(s) do
begin
PostMessage(h, WM_CHAR, Ord(S), 0);//使用WM_CHAR消息
end;
PostMessage(h, WM_CHAR, $0D, 0); //发回车符
end;
end;
 
因为你的字符串都是$后面加两个字符,比较笨的但最有效的方法是用copy函数,但是如果你的字符串格式每次都不一样,这就需要具体情况具体分析,没有统一的算法
 
我是用可变数组解决的,忘记原来写的代码了,大概是这样
type
StrArray: array of string;

function split(...): StrArray;
var
a: array of string;
i: integer;
begin
i:= 0
循环
查找第一个串
i:= i+1;
Setlength(a,i);
a[i-1] := s;
Result := a;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
681
import
I
I
回复
0
查看
856
import
I
后退
顶部