線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3429
推到 Plurk!
推到 Facebook!

如何在搜尋網頁上輸入條件後取得結果

尚未結案
',SL); Memo1.Text:=SL.Text; For i:=0 to SL.Count-1 do begin StringGrid1.Cells[i+1,0]:=SL[i]; StringGrid1.Cells[K, 0 ] := inttostr(K); K := K + 1; if StringGrid1.ColCount < K then StringGrid1.ColCount := K; end; SL.Free; end; procedure TForm1.Button6Click(Sender: TObject); var SL:TStringList; i,K:integer; begin K:=0; SL:=TStringList.Create; IsolateTextBetweenTags(Richedit1.text, '',SL); Memo1.Text:=SL.Text; //測試用 For i:=0 to SL.Count-1 do begin if (i Mod 2)=0 then StringGrid1.Cells[1,i+1]:=SL[i] else StringGrid1.Cells[2,i+1-1]:=SL[i]; K := K + 1; StringGrid1.Cells[0,K] := inttostr(K); if StringGrid1.RowCount < K then StringGrid1.RowCount := K; end; SL.Free; end; initialization OleInitialize(nil); finalization OleUninitialize; end. 網海無涯,唯學是岸! 發表人 - qoo1234 於 2004/07/24 03:30:01
senix
一般會員


發表:28
回覆:25
積分:10
註冊:2002-03-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-22 12:02:40 IP:219.80.xxx.xxx 未訂閱
請教各位前輩~ 假設把一搜尋網頁傳入WebBrowser物件後, 1.如何把搜尋條件自動傳入該網頁並且執行, 最後取得結果在傳回WebBrowser物件?? 2.如果結果有分頁的狀況,又該如何把資料取出? (我只會取單頁資料^^) 3.原始碼Compile沒錯,但執行到 Edits :=WebBrowser1.OleObject.Document.all.Item('Yr', 0); 就出現 Access violation...的錯誤訊息 附上原始碼,請幫忙看看,謝謝指點^_~ uses SHDocVw, MSHTML procedure TBDP708F.Label1Click(Sender: TObject); var Docs, Edits : OleVariant; str_Year,str_Month,str_Day:string; Flags: OLEVariant; begin str_Year :=InttoStr(StrtoInt(Copy(edtFinishDate.text,1,4))-1911); str_Month:=Copy(edtFinishDate.text,6,2); str_Day :=Copy(edtFinishDate.text,9,2); Docs :=WebBrowser1.Document; Flags:=0; //傳入搜尋網頁 WebBrowser1.Navigate(WideString ('http://otcbnd.gretai.org.tw/c/d09.asp'), Flags, Flags, Flags, Flags); while strOK1='' do // 還未執行完成時 begin Application.ProcessMessages; end; //傳入搜尋條件 民國___年___月___日 Edits :=WebBrowser1.OleObject.Document.all.Item('Yr', 0); Edits.Value :=str_Year; Edits :=WebBrowser1.OleObject.Document.all.Item('Mon', 0); Edits.Value :=str_Month; Edits :=WebBrowser1.OleObject.Document.all.Item('Day', 0); Edits.Value :=str_Day; //執行搜尋網頁http://otcbnd.gretai.org.tw/c/d09.asp WebBrowser1.OleObject.Document.GetElementByID('btnsubmit').Click; //取得結果 http://otcbnd.gretai.org.tw/c/d09show.asp~~略 //==此結果可能會分頁== end;
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-22 12:57:58 IP:218.163.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw_TLB, EmbeddedWB;    type
  TForm1 = class(TForm)
    WebBrowser1: TEmbeddedWB;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation
 uses MSHtml;
{$R *.dfm}    function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;  
begin  
  Result := False;
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then  
  begin  
    Exit;  
  end;
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do  
  begin  
    FormItem := WebBrowser.OleObject.Document.forms.Item(I);  
    for j := 0 to FormItem.Length - 1 do  
    begin  
      try
        if FormItem.Item(j).Name = FieldName then  
        begin  
          FormItem.Item(j).Value := Value;  
          Result := True;  
        end;  
      except  
        Exit;  
      end;  
    end;  
  end;  
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
 WebBrowser1.Navigate('http://otcbnd.gretai.org.tw/c/d09.asp');
end;    procedure TForm1.Button2Click(Sender: TObject);
var
  hd:IHtmlDocument2;
  f: IHTMLFormElement;
begin
  FillForm(WebBrowser1,'Yr',Edit1.Text);
  FillForm(WebBrowser1,'Mon',Edit2.Text);
  FillForm(WebBrowser1,'Day',Edit3.Text);
  hd := WebBrowser1.Document as IHtmlDocument2;
  f := hd.forms.item(0, 0) as IHTMLFormElement;
  f.submit;
end;    end.
 
網海無涯,唯學是岸!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-22 18:32:58 IP:218.163.xxx.xxx 未訂閱
2.如果結果有分頁的狀況,又該如何把資料取出? (我只會取單頁資料^^)    
procedure TForm1.Button3Click(Sender: TObject);
var
 Document : IHtmlDocument2;
 Link : IHTMLElement;
 StrLinks : string;
 Target,Nothing: OleVariant;
 i : integer;
begin
  StrLinks:='';
  Target := '_self';
  Nothing := '';
  Document := WebBrowser1.Document as IHTMlDocument2;
  for i := 0 to Document.Links.Length - 1 do
  begin
   Link := Document.Links.Item(i, 0) as IHTMLElement;
   StrLinks := Link.ToString;
   if StrLinks<>''then
    WebBrowser1.Navigate(StrLinks, Nothing, Target, Nothing, Nothing)
   else
    showmessage('這是最後一頁');
  end;
end;
網海無涯,唯學是岸! 發表人 - qoo1234 於 2004/07/23 00:15:40
senix
一般會員


發表:28
回覆:25
積分:10
註冊:2002-03-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-23 10:37:11 IP:219.80.xxx.xxx 未訂閱
謝謝qoo1234前輩的指點,但是按照範例 會找不到SHDocVw_TLB, EmbeddedWB???我有use喔^^    如果依原始碼加以修改,即可完成取回結果的功能, but傳回的網頁都停在最後一頁(約三頁),而且轉入memo的資料 都是只有...只有第二頁,請問是哪出了問題? 可以依頁序轉入memo嗎??    ===再次附上原始碼=== uses SHDocVw, MSHTML    procedure TBDP708F.btnImportClick(Sender: TObject); var Docs, Edits : OleVariant; str_Year,str_Month,str_Day:string; Flags: OLEVariant; begin str_Year :=InttoStr(StrtoInt(Copy(edtFinishDate.text,1,4))-1911); str_Month:=Copy(edtFinishDate.text,6,2); str_Day :=Copy(edtFinishDate.text,9,2); Docs :=WebBrowser1.Document; Flags:=0; //傳入搜尋網頁 WebBrowser1.Navigate(WideString ('http://otcbnd.gretai.org.tw/c/d09.asp'), Flags, Flags, Flags, Flags); while strOK1='' do // 還未執行完成時 begin Application.ProcessMessages; end; //傳入搜尋條件 民國___年___月___日 Edits :=WebBrowser1.OleObject.Document.all.Item('Yr', 0); Edits.Value :=str_Year; Edits :=WebBrowser1.OleObject.Document.all.Item('Mon', 0); Edits.Value :=str_Month; Edits :=WebBrowser1.OleObject.Document.all.Item('Day', 0); Edits.Value :=str_Day;     //執行搜尋網頁http://otcbnd.gretai.org.tw/c/d09.asp WebBrowser1.OleObject.Document.GetElementByID('btnsubmit').Click; Get_FinishRate; //取得結果 http://otcbnd.gretai.org.tw/c/d09show.asp  //==此結果可能會分頁== end;    procedure TBDP708F.Get_FinishRate;    var      hd: IHTMLDocument2; //uses MSHTML;      intRow,intLength,intCont:integer; begin    //Memo1.Clear;    meoResoult.Clear;    strOK1:='';    strOK2:='';    Flags:=0;    WebBrowser1.Navigate(WideString                ('http://otcbnd.gretai.org.tw/c/d09show.asp'),                 Flags, Flags, Flags, Flags);    while strOK1='' do // 還未執行完成時        begin           Application.ProcessMessages;        end;    HD := WebBrowser1.Document as IHTMLDocument2;    Memo1.Text := HD.body.innerText;    //WebBrowser1.Refresh; end;    procedure TBDP708F.WebBrowser1DocumentComplete(Sender: TObject;   const pDisp: IDispatch; var URL: OleVariant); begin    strOK1 := 'OK'; end;    
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-23 14:31:59 IP:218.163.xxx.xxx 未訂閱
http://www.euromind.com/iedelphi/index.htm    網海無涯,唯學是岸!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-24 03:19:46 IP:218.163.xxx.xxx 未訂閱
僅供參考,有時間在測試!
 
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, OleCtrls, SHDocVw_TLB, EmbeddedWB, ExtCtrls,
  Grids;    type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    StringGrid1: TStringGrid;
    Edit4: TEdit;
    Panel1: TPanel;
    WebBrowser1: TEmbeddedWB;
    RichEdit1: TRichEdit;
    Button3: TButton;
    Splitter1: TSplitter;
    Button4: TButton;
    Button5: TButton;
    Memo1: TMemo;   //測試用
    Button6: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation
  uses MSHtml,ActiveX;
{$R *.dfm}    function FillForm(WebBrowser: TEmbeddedWB; FieldName: string; Value: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;  
begin  
  Result := False;
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
  begin  
    Exit;  
  end;
  for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do  
  begin  
    FormItem := WebBrowser.OleObject.Document.forms.Item(I);  
    for j := 0 to FormItem.Length - 1 do  
    begin  
      try
        if FormItem.Item(j).Name = FieldName then  
        begin  
          FormItem.Item(j).Value := Value;  
          Result := True;  
        end;  
      except  
        Exit;  
      end;
    end;
  end;
end;    Procedure IsolateTextBetweentags( Const S: String;
                                  Tag1, Tag2: String; list:TStrings );
Var
 pScan, pEnd, pTag1, pTag2: PChar;
 foundText: String;
 searchtext: String;
begin
 searchtext := Uppercase(S);
 Tag1:= Uppercase( Tag1 );
 Tag2:= Uppercase( Tag2 );
 pTag1:= PChar(Tag1);
 pTag2:= PChar(Tag2);
 pScan:= PChar(searchtext);
 Repeat
  pScan:= StrPos( pScan, pTag1 );
  If pScan <> Nil Then begin
   Inc(pScan, Length( Tag1 ));
   pEnd := StrPos( pScan, pTag2 );
   If pEnd <> Nil Then begin
    SetString( foundText, Pchar(S) + (pScan- PChar(searchtext) ), pEnd-pScan );
    list.Add( foundText );
    pScan := pEnd + Length(tag2);
   end
   else
    pScan := Nil;
  end;
 Until pScan = Nil;
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
 WebBrowser1.Navigate('http://otcbnd.gretai.org.tw/c/d09.asp');
end;    procedure TForm1.Button1Click(Sender: TObject);
var
  hd:IHtmlDocument2;
  f: IHTMLFormElement;
begin
  FillForm(WebBrowser1,'Yr',Edit1.Text);
  FillForm(WebBrowser1,'Mon',Edit2.Text);
  FillForm(WebBrowser1,'Day',Edit3.Text);
  hd := WebBrowser1.Document as IHtmlDocument2;
  f := hd.forms.item(0, 0) as IHTMLFormElement;
  f.submit;
end;    procedure TForm1.Button3Click(Sender: TObject);
var
 Document : IHtmlDocument2;
 Link : IHTMLElement;
 StrLinks : string;
 Target,Nothing: OleVariant;
 i : integer;
begin
  StrLinks:='';
  Target := '_self';
  Nothing := '';
  Document := WebBrowser1.Document as IHTMlDocument2;
  for i := 0 to Document.Links.Length - 1 do
  begin
   Link := Document.Links.Item(i, 0) as IHTMLElement;
   StrLinks := Link.ToString;
   if StrLinks<>''then
    WebBrowser1.Navigate(StrLinks, Nothing, Target, Nothing, Nothing)
   else
    showmessage('這是最後一頁');
  end;
end;    procedure TForm1.Button4Click(Sender: TObject);
var AStream:TMemoryStream;
begin
 Memo1.Clear;
 AStream:=TMemoryStream.Create;
 try
  (WebBrowser1.Document as IPersistStreamInit).Save(TStreamAdapter.Create(AStream),false);
  AStream.Seek(0,soFromBeginning);
  RichEdit1.Lines.LoadFromStream(AStream);
 finally
   AStream.Free;
 end;
 IsolateTextBetweenTags(Richedit1.text,'

','[/h3]',Memo1.Lines); //測試用 Edit4.Text:=Trim(Memo1.Text); end; procedure TForm1.Button5Click(Sender: TObject); var SL:TStringList; i,K:integer; begin SL:=TStringList.Create; IsolateTextBetweenTags(Richedit1.text, '

', '', '
senix
一般會員


發表:28
回覆:25
積分:10
註冊:2002-03-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-24 12:21:16 IP:219.80.xxx.xxx 未訂閱
好感動喔~真的... qoo1234真是個好人,謝謝 感動~~好感動
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-22 23:14:48 IP:222.248.xxx.xxx 未訂閱
qoo1234大大,以及各位高手们,请帮帮小弟,看看问题出在什么地方, 都快郁闷死我了,摆脱了,谢谢!!! 我也是想对一个网页进行自动输入,然后执行某个网页中的按钮,最后将 查询的结果再另存为一个文本的格式。但我在第一步的自动输入的部分就 遇到问题了。我的这个网页是由3个frames组成的(我测试过,如果是一个 frame就没有问题的),请看:http://sc.hkex.com.hk/gb/www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp 当我找到相应的输入文本框以后,并输入数据,但在文本框上却没有显示 数据,不知道这是为什么呢?下面是我的原代码,请看一下: procedure TMain_Frm.Button1Click(Sender: TObject); begin WebBrowser1.Navigate('http://sc.hkex.com.hk/gb/www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp'); end; procedure TMain_Frm.Button2Click(Sender: TObject); var Document : IHtmlDocument2; Edits,ole_index : OleVariant; frame_dispatch: IDispatch; frame_win: IHTMLWindow2; frame_doc: IHTMLDocument2; begin document := WebBrowser1.Document as IHTMLDocument2; ole_index := 2; frame_dispatch := document.Frames.Item(ole_index); if frame_dispatch <> nil then begin frame_win := frame_dispatch as IHTMLWindow2; frame_doc := frame_win.document; Edits :=frame_doc.all.Item('WidCoID', 0); Edits.Value:='5'; end; end; (我想要的很简单,就是打开这个网页后,在“今日股价”下面的“代码” 的地方自动输入数字,例如:‘5’等,然后,自动再执行“去”按钮, 最后将查询到结果,再自动存储到一个文本中就可以了。 可我在第一步自动输入数字这部分就卡住了,请各位大大帮忙看看怎么回 事,万分感谢!!!!!!!!!)
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-22 23:21:27 IP:222.248.xxx.xxx 未訂閱
qoo1234大大,以及各位高手们,请帮帮小弟,看看问题出在什么地方, 都快郁闷死我了,摆脱了,谢谢!!! 我也是想对一个网页进行自动输入,然后执行某个网页中的按钮,最后将 查询的结果再另存为一个文本的格式。但我在第一步的自动输入的部分就 遇到问题了。我的这个网页是由3个frames组成的(我测试过,如果是一个 frame就没有问题的),请看: www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp 当我找到相应的输入文本框以后,并输入数据,但在文本框上却没有显示 数据,不知道这是为什么呢?下面是我的原代码,请看一下: procedure TMain_Frm.Button1Click(Sender: TObject); begin WebBrowser1.Navigate('www.hkex.com.hk/invest/index_c.asp?id=company/quotemenu_page_c.asp'); end; procedure TMain_Frm.Button2Click(Sender: TObject); var Document : IHtmlDocument2; Edits,ole_index : OleVariant; frame_dispatch: IDispatch; frame_win: IHTMLWindow2; frame_doc: IHTMLDocument2; begin document := WebBrowser1.Document as IHTMLDocument2; ole_index := 2; frame_dispatch := document.Frames.Item(ole_index); if frame_dispatch <> nil then begin frame_win := frame_dispatch as IHTMLWindow2; frame_doc := frame_win.document; Edits :=frame_doc.all.Item('WidCoID', 0); Edits.Value:='5'; end; end; (我想要的很简单,就是打开这个网页后,在“今日股价”下面的“代码” 的地方自动输入数字,例如:‘5’等,然后,自动再执行“去”按钮, 最后将查询到结果,再自动存储到一个文本中就可以了。 可我在第一步自动输入数字这部分就卡住了,请各位大大帮忙看看怎么回 事,万分感谢!!!!!!!!!)
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-23 09:06:03 IP:211.148.xxx.xxx 未訂閱
我贴的上面程式中,我跟踪了一下,在Edits中是有地址的,不是$0000000, 也就是说找到了相应的输入文本框,但是就是不能将我想要的数据传送到 此文本框上,不知道为什么?有哪位大大明白的,请指点一下小弟,谢谢!
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-23 09:22:30 IP:211.148.xxx.xxx 未訂閱
上面的程式也可以写成: Edits:=WebBrowser1.OleObject.Document.Frames.Item(2).Document.all.Item('WidCoID', 0); Edits.Value:='5'; 请帮忙看看,是什么原因不能将数据传送到输入文本框中? 万分感谢!!!!!
I_Love_You
一般會員


發表:18
回覆:87
積分:21
註冊:2002-07-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-11-23 12:09:15 IP:211.148.xxx.xxx 未訂閱
我的问题解决了,刚才不断看资料,不断测试,自动输入和自动按钮 已经搞定,这里我要说的就是: 首先感谢qoo1234大大提供的范例; 其次就是下面网站的资料: http://www.cryer.co.uk/brian/delphi/twebbrowser/twebbrowser_oleobject.htm 还有一个重要原因,记得一定要安装MSHTML.lib,我就因为这个所以 才遇到问题的。 下面是我的原代码: for I := 0 to WebBrowser1.OleObject.Document.Frames.Item(2).Document.all.tags('form').Length - 1 do begin FormItem := WebBrowser1.OleObject.Document.Frames.Item(2).Document.forms.Item(I); for J := 0 to FormItem.Length - 1 do begin try if FormItem.Item(J).Name = 'WidCoID' then begin FormItem.Item(J).Value := '5'; end; if FormItem.Item(J).Type = 'button' then begin FormItem.Item(J).Onclick; end; except Exit; end; end; end;
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-04-26 13:51:20 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-18 13:16:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!