繁体   English   中英

Delphi - 如何将 select 从 twebbrowser 获取到数组中?

[英]Delphi - How can I get a select from a twebbrowser into an array?

我的 twebbrowser 中有以下 select

<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");

如果有人有任何代码可以分享,那就太好了!

非常感谢

斯图

更新:在 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 SELECT(下拉列表)控件)变得容易.

使用名为WbTWebBrowser ,您可以通过以下方式获取您的 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:这是 web 页面“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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM