Y
yybug
Unregistered / Unconfirmed
GUEST, unregistred user!
1、老板要我做一个编辑软件:在利用word的基础上,增加一些功能,如增加一个词语库
,在写文章时可以通过菜单或弹出菜单,显示出来,用户点击一段文字后,能自动添加到
正在编辑的文本中。
我的想法是 利用olecontainer 调用word。可后来发现几个问题:首先是消耗资源太大,程序
经常无法运行;自己做的菜单显示异常,编辑时窗体中除了olecontainer,其他的控件都
看不到了
大家有没有好点的办法,做一个这样的软件,很好控制使用word。
2、下面程序运行中,循环变量 在中途莫名其妙,变成了一个很大的数字,程序如下,大家
看看错在那里?
procedure TfrmSend.wbSendSMSDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
myi,myj :integer; //循环使用
iInputCount:integer; //计算<Input> 的次数
ovDoc :OleVariant; //取得网页的内容
sSendCode :AnsiString; //发送手机号码
sPassword :AnsiString; //发送短消息的密码
sRecCode :AnsiString; //接收代码
begin
case iSendSMS of 0:
begin
Inc(iSendSMS);
ovDoc:=TWebBrowser(Sender).Document;
iInputCount:=0;
myj:= ovDoc.All.Length-1;
for myi:=0 To myj do begin
if (ovDoc.All.Item(myi).tagName = 'TEXTAREA')and //一定大写
(ovDoc.All.Item(myi).name='msg')then begin //大小写与原文一致
ovDoc.All.Item(myi).Value:=DeleteCR(memSendContent.Lines.Text);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='text')and //大小写与原文一致
(ovDoc.All.Item(myi).Name='mob1')then begin
sRecCode:=PRecCodeInfo(cmbRecCode.Items.Objects[cmbRecCode.ItemIndex])^.sRecCode;
ovDoc.All.Item(myi).Value:=Trim(sRecCode);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='text')and //大小写与原文一致
(ovdoc.All.Item(myi).Name='user')then begin
sSendCode:=PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sSendCode;
ovDoc.All.Item(myi).Value:=Trim(sSendCode);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='password')and //大小写与原文一致
(ovDoc.All.Item(myi).Name='passwd')then begin
sPassword:=PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sPassword;
ovDoc.All.Item(myi).Value:=Trim(sPassword);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='submit')and //大小写与原文一致
(ovDoc.All.Item(myi).value=' 发送 ')then begin
if iInputCount=4 then
ovDoc.All.Item(myi).Click;
Inc(iInputCount);
end;
end;
end;
1:
begin
ovDoc:=(Sender as TWebBrowser).Document;
Inc(iSendSMS);
if(Pos('发送成功',ovDoc.All.item.innerhtml)<>0) then
sbSendSMS.Panels.Items[0].Text:='发送成功'
else
sbSendSMS.Panels.Items[0].Text:='发送失败';
end;
end;
end;
这个程序的功能是 程序利用sina的网页 发手机短消息。
3、我想通过下面程序找到别的程序中某个按钮的句柄,现只能找到 button、combobox的
,但找不到speedButton和menu的
为什么?
有办法解决吗?
function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
myStr:String;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
if Form1.CheckBox2.Checked then begin
Form1.ListBox1.Items.Add(Buffer);
GetWindowText(hwnd,buffer1,100);
Form1.ListBox1.Items.Add(Buffer1);
end;
//找到目标窗口的目标控件
if (StrPas(Buffer)='TButton') or (Buffer='Button') then begin
GetWindowText(hwnd,buffer1,100);
if form1.isConnect then
myStr:=form1.Edit13.text
else
myStr:=form1.Edit14.Text;
if not Form1.CheckBox3.Checked then begin
if POS(Trim(myStr), buffer1)<>0 then begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end
else begin
if Trim(myStr)=buffer1 then begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end
end;
end;
end;
procedure Tform1.pushButton(sender:Tobject;myWindowsChar);
var
myHandle,tmphandle,Fbuttonhandle:Hwnd;
begin
myHandle:=FindWindow(nil,myWindows); //就是窗口的Caption
if myHandle<>0 then begin
tmpHandle := myHandle;
//在这里循环取到想要的句柄为止
//取按钮的FButtonHandle
EnumChildWindows(tmpHandle,@GetButtonHandle,Integer(@Fbuttonhandle));
// FButtonHandle := tmpHandle;
SendMessage(FButtonHandle,WM_LBUTTONDOWN{MOUSEEVENTF_LEFTDOWN},0,0);
SendMessage(FButtonHandle,WM_LBUTTONUP{MOUSEEVENTF_LEFTUP},0,0);
end;
end;
以上3问题,望高手相助,谢谢!
,在写文章时可以通过菜单或弹出菜单,显示出来,用户点击一段文字后,能自动添加到
正在编辑的文本中。
我的想法是 利用olecontainer 调用word。可后来发现几个问题:首先是消耗资源太大,程序
经常无法运行;自己做的菜单显示异常,编辑时窗体中除了olecontainer,其他的控件都
看不到了
大家有没有好点的办法,做一个这样的软件,很好控制使用word。
2、下面程序运行中,循环变量 在中途莫名其妙,变成了一个很大的数字,程序如下,大家
看看错在那里?
procedure TfrmSend.wbSendSMSDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
myi,myj :integer; //循环使用
iInputCount:integer; //计算<Input> 的次数
ovDoc :OleVariant; //取得网页的内容
sSendCode :AnsiString; //发送手机号码
sPassword :AnsiString; //发送短消息的密码
sRecCode :AnsiString; //接收代码
begin
case iSendSMS of 0:
begin
Inc(iSendSMS);
ovDoc:=TWebBrowser(Sender).Document;
iInputCount:=0;
myj:= ovDoc.All.Length-1;
for myi:=0 To myj do begin
if (ovDoc.All.Item(myi).tagName = 'TEXTAREA')and //一定大写
(ovDoc.All.Item(myi).name='msg')then begin //大小写与原文一致
ovDoc.All.Item(myi).Value:=DeleteCR(memSendContent.Lines.Text);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='text')and //大小写与原文一致
(ovDoc.All.Item(myi).Name='mob1')then begin
sRecCode:=PRecCodeInfo(cmbRecCode.Items.Objects[cmbRecCode.ItemIndex])^.sRecCode;
ovDoc.All.Item(myi).Value:=Trim(sRecCode);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='text')and //大小写与原文一致
(ovdoc.All.Item(myi).Name='user')then begin
sSendCode:=PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sSendCode;
ovDoc.All.Item(myi).Value:=Trim(sSendCode);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='password')and //大小写与原文一致
(ovDoc.All.Item(myi).Name='passwd')then begin
sPassword:=PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sPassword;
ovDoc.All.Item(myi).Value:=Trim(sPassword);
Inc(iInputCount);
end;
if (ovDoc.All.Item(myi).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(myi).type='submit')and //大小写与原文一致
(ovDoc.All.Item(myi).value=' 发送 ')then begin
if iInputCount=4 then
ovDoc.All.Item(myi).Click;
Inc(iInputCount);
end;
end;
end;
1:
begin
ovDoc:=(Sender as TWebBrowser).Document;
Inc(iSendSMS);
if(Pos('发送成功',ovDoc.All.item.innerhtml)<>0) then
sbSendSMS.Panels.Items[0].Text:='发送成功'
else
sbSendSMS.Panels.Items[0].Text:='发送失败';
end;
end;
end;
这个程序的功能是 程序利用sina的网页 发手机短消息。
3、我想通过下面程序找到别的程序中某个按钮的句柄,现只能找到 button、combobox的
,但找不到speedButton和menu的
为什么?
有办法解决吗?
function GetButtonHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;
var
buffer: array[0..255] of Char;
buffer1: array[0..255] of Char;
myStr:String;
begin
Result := True;
//得到目标窗口的控件
GetClassName(hwnd,buffer,256);
if Form1.CheckBox2.Checked then begin
Form1.ListBox1.Items.Add(Buffer);
GetWindowText(hwnd,buffer1,100);
Form1.ListBox1.Items.Add(Buffer1);
end;
//找到目标窗口的目标控件
if (StrPas(Buffer)='TButton') or (Buffer='Button') then begin
GetWindowText(hwnd,buffer1,100);
if form1.isConnect then
myStr:=form1.Edit13.text
else
myStr:=form1.Edit14.Text;
if not Form1.CheckBox3.Checked then begin
if POS(Trim(myStr), buffer1)<>0 then begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end;
end
else begin
if Trim(myStr)=buffer1 then begin
PInteger(lparam)^ := hwnd; //得到目标控件的Hwnd(句柄)
Result:=False; //终止循环
end
end;
end;
end;
procedure Tform1.pushButton(sender:Tobject;myWindowsChar);
var
myHandle,tmphandle,Fbuttonhandle:Hwnd;
begin
myHandle:=FindWindow(nil,myWindows); //就是窗口的Caption
if myHandle<>0 then begin
tmpHandle := myHandle;
//在这里循环取到想要的句柄为止
//取按钮的FButtonHandle
EnumChildWindows(tmpHandle,@GetButtonHandle,Integer(@Fbuttonhandle));
// FButtonHandle := tmpHandle;
SendMessage(FButtonHandle,WM_LBUTTONDOWN{MOUSEEVENTF_LEFTDOWN},0,0);
SendMessage(FButtonHandle,WM_LBUTTONUP{MOUSEEVENTF_LEFTUP},0,0);
end;
end;
以上3问题,望高手相助,谢谢!