关于WebBrowser中的newWindow2的问题 |
尚未結案
|
interfox2005
一般會員 發表:4 回覆:9 積分:2 註冊:2005-02-28 發送簡訊給我 |
各位先知,我在写一个程序,想自动完成一个局域网b/s结构软件的自动操作,但是登陆进入以后,有一个操作需要弹出一个页面,我在newWindow2中代码如下:
fm:TForm;
fm:=TForm1.Create(self);
ppDisp := fm.WebBrowser1.DefaultInterface;
fm.Show;
fm.SetFocus; fm窗体能够准确捕捉到并且操作正常。
在弹出窗体错作完成后用系统信息:SendMessage(WM_Close)关闭窗体。 但是当我第二次点击需要弹出页面的的按钮时fm窗体不显示,在newwindow2设置断点程序没有调用这个事件, 后来我将fm定义成全局变量,在mainform的create事件中调用:
fm:=TForm.create(self);
newWindow2中使用
ppDisp := fm.WebBrowser1.DefaultInterface;
fm.Show;
fm.SetFocus;
在fm操作完成后使用fm.visible:=false;但是程序出错,我该怎么办?
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
interfox2005
一般會員 發表:4 回覆:9 積分:2 註冊:2005-02-28 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
大致試了一下, 無法複製出您的問題情況.
我用 Win2000 Server, D6 Update 2 RTL 3.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, SHDocVw, Unit2; type TForm1 = class(TForm) Button1: TButton; WebBrowser1: TWebBrowser; procedure Button1Click(Sender: TObject); procedure WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); procedure FormCreate(Sender: TObject); private { Private declarations } Fm: TForm2; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // Fm.Hide; Fm.Visible := False; end; procedure TForm1.WebBrowser1NewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); begin ppDisp :=fm.WebBrowser1.DefaultInterface; fm.Show; fm.SetFocus; end; procedure TForm1.FormCreate(Sender: TObject); begin webbrowser1.Navigate('C:\Documents and Settings\Administrator\桌面\dum.htm'); fm := TForm2.Create(self); end; end. dum.htm: < html> < SCRIPT LANGUAGE="JScript"> function foo() { open('http://www.aidc.com.tw/');} < /SCRIPT> < BODY > Click this page and window.open() is called. < /BODY> < /html> |
interfox2005
一般會員 發表:4 回覆:9 積分:2 註冊:2005-02-28 發送簡訊給我 |
各位先知,为了把问题说的明白些,我把代码帖出来:
点击“浏览”按钮:
WebBrowser1.Navigate('http://10.173.11.1:8080/jtwz/violate/approve.do');
flag:='false';
while (not (flag='ok')) do
begin
Application.ProcessMessages;
end;
Document := WebBrowser1.Document as IHTMLDocument2;
FormElements := (Document.Forms.Item('myFrm', 0) as IHTMLElement).All as IHTMLElementCollection;
for i := 0 to FormElements.Length - 1 do
begin
FormElem := FormElements.Item(i, 0);
if not VarIsEmpty(FormElem) and FormElem.isTextEdit then
begin
if(FormElem.Value='提交') then
FormElem.onclick();
end;
end;
在newwindow2中处理如下:
procedure TfmVoiceTel.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
var fm:TForm2;
begin
fm:=TForm2.create(self);
fm.WebBrowser1.RegisterAsBrowser:=true;
ppDisp := fm.WebBrowser1.DefaultInterface;
fm.Show;
fm.SetFocus;
end;
在Form2中如下:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
WebBrowser1.OleObject.Document.tbform.xxx.value:='1';
WebBrowser1.OleObject.Document.tbform.yyy.value:='2';
WebBrowser1.OleObject.Document.tbform.submit();
Timer2.Enabled:=true;
end;
由于提交后系统有“保存成功”的系统提示,所以向系统发送一个回车键,然后关掉窗口,如下:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
keybd_event(VK_RETURN, 0, 0 ,0);
keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP ,0);
SendMessage(handle,WM_Close,0,0);
Timer2.Enabled:=false;
end;
以上代码在系统第一次执行时是正确的,但是当第二次点击“浏览”时Form2不弹出,在newwindow2处设置断点但是拦截不住。
b/s结构的软件的源代码是在点击“提交”时先用window.open('','aaa','')打开一个窗口,然后定义原网页的
form.target='aaa';
form.submit();
第二次处理方法:
定义fm:TForm2为公用变量,在
在主Form的create事件中创建Form2:
fm:=TForm2.create(self);
然后在newwindow2事件中去掉相应部分。
在Form2的Timer2Timer事件中将SendMessage()改为self.hide;
还是不行,还有什么别的办法吗?
|
interfox2005
一般會員 發表:4 回覆:9 積分:2 註冊:2005-02-28 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
interfox2005
一般會員 發表:4 回覆:9 積分:2 註冊:2005-02-28 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |