2011-07-20 183 views
2

我有以下選擇在我的twebbrowser德爾福 - 我怎樣才能從twebbrowser中選擇一個數組?

<Select name="ship_to_method"> 
<option value="1941">Royal Mail Standard Delivery at £1.45 </option> 
<option value="1942">Courier Standard Delivery at £4.64 </option> 
<option value="1943">Royal Mail Priority Delivery at £1.66 </option> 
<option value="1944">Courier Priority Delivery at £5.15 </option> 
</select> 

的期權數量和值動態變化,

我怎樣才能得到的選項到一個數組,所以我有..

option_ids=(1941,1942,1943,1944); 

option_texts=("Royal Mail Standard Delivery at £1.45","Courier Standard Delivery at £4.64","Royal Mail Priority Delivery at £1.66","Courier Priority Delivery at £5.15"); 

如果任何人有任何代碼分享,那就太棒了!

千恩萬謝

斯圖

+0

的關鍵是獲取數據的保持,以及使用DOM實際上很容易。使用'(TWebBrowser.Document作爲IHTMLDocument2)'你得到一個[IHTMLDocument2](http://msdn.microsoft.com/en-us/library/aa752574(v = vs.85).aspx)接口,請點擊鏈接文檔。 –

+0

TWebBrowser的最佳參考資料位於:http://www.cryer.co.uk/brian/delphi/twebbrowser/index.htm請閱讀[DOM](http://www.cryer.co.uk/)布賴恩/德爾福/ twebbrowser/twebbrowser_oleobject.htm)。 –

+0

嗯yeah ive玩過這個,我試着得到select.innerText,但它返回內部選擇文本所有在一個塊 – stuayre

回答

2

更新:在一年2017+,TEmbeddedWb是沒有這樣一個偉大的選擇。取而代之的是Delphi中的DCEF(鉻瀏覽器)。

我知道如何在使用TEmbeddedWB,最初是由現已解散的網站www.bsalsa.com,仍然可以在sourceforgegithub,這是一種更高的性能和更多的功能齊備的IE封裝替換TWebBrowser你所使用的是這樣的:

procedure Dummy; 
var 
    element: IHTMLElement; 
begin 
    element := EmbeddedWB1.GetActiveElement; 
end; 

一旦你的元素,是微不足道的得到IHTMLElement它的HTML。

我把所有的TWebBrowser從我的應用程序中拿出來,放入TEmbeddedWB中進行了十幾個重大錯誤修復,並且像這樣的功能,比如在這種情況下,它只是讓獲得主動控件(就像這個html選擇(下拉列表)控制)容易。

+0

不幸的是該網站是關閉的 – Ampere

+1

看到上面的鏈接到github和sourceforge –

+0

非常感謝。你知道它是否仍然使用Delphi的現代版本進行編譯? – Ampere

2

使用TWebBrowser名爲Wb你可以得到你的ID和文字是這樣的:

uses MSHTML; 

var 
    Disp: IDispatch; 
    SelEl: IHTMLSelectElement; 
    i: Integer; 
    OptionEl: IHTMLOptionElement; 
    option_ids: array of WideString; 
    option_texts: array of WideString; 
begin 
    // load test web page containing your SELECT 
    Wb.Navigate('c:\temp\select.htm'); 
    // wait for browser to finish loading 
    while Wb.ReadyState <> READYSTATE_COMPLETE do 
    Application.ProcessMessages; 
    // search the document for the SELECT element with the given name 
    Disp:=(Wb.ControlInterface.Document as IHTMLDocument2).all.item('ship_to_method', EmptyParam); 

    // EDIT: the following two lines are demonstrating how to get the element with focus 
    // simulate user selection by setting focus to SELECT element 
    (Disp as IHTMLElement2).focus; 
    // now ask document for active element which should be the SELECT element 
    Disp:=(Wb.ControlInterface.Document as IHTMLDocument2).activeElement; 

    // basic error checking and acquiring of IHTMLSelectElement interface which is needed to access single OPTIONs within the SELECT 
    if Assigned(Disp) and Supports(Disp, IHTMLSelectElement, SelEl) then 
    begin 
    // prepare array 
    SetLength(option_ids, SelEl.length); 
    SetLength(option_texts, SelEl.length); 
    // get OPTIONs from SELECT 
    for i:=0 to SelEl.length-1 do 
    begin 
     OptionEl := SelEl.Item(i,EmptyParam) as IHTMLOptionElement; 
     // voila - read value and text of option element, store in arrays 
     option_ids[i] := OptionEl.Value; 
     option_texts[i] := OptionEl.Text; 
    end; 
    end; 
    // option_ids now contains your IDs 
    // option_texts now contains your texts 
end; 

編輯:添加option_texts爲好。

EDIT2:這是網頁「select.htm」:

<html> 
<head> 
</head> 
<body> 
<Select name="ship_to_method"> 
    <option value="1941">Royal Mail Standard Delivery at £1.45 </option> 
    <option value="1942">Courier Standard Delivery at £4.64 </option> 
    <option value="1943">Royal Mail Priority Delivery at £1.66 </option> 
    <option value="1944">Courier Priority Delivery at £5.15 </option> 
</select> 
</body> 
</html> 
+0

如果文檔中有兩個或二十七個選擇標籤,並且您想獲得重點標籤,那麼TWebBrowser可以告訴您想要HTML目前關注嗎?OP討論了「什麼是選擇「,我不知道它們的意思是什麼?聚焦?活動? –

+0

'IHTMLDocument2'有一個屬性'activeElement',可能就是這樣,所以'Disp'必須通過Disp:=(Wb .ControlInterface.Document as IHTMLDocument2).activeElement;' –

+0

@Warren P MSDN聲明如下:「即使焦點從父項轉移到另一個應用程序,活動元素仍將焦點保留在父文檔中如果焦點返回到父項documen t,焦點也會返回到相同的活動元素。「因此,頁面上的一個元素始終處於活動狀態,如果父文檔具有焦點,則它具有焦點。如果另一個頁面具有焦點,那麼該元素只是活動的,而不是焦點。 –

相關問題