我的代码找不到该字段(Delphi - Webbrowser)

时间:2010-08-19 15:50:47

标签: html delphi

我正在使用此代码使用WebBrowser控件填写某些WebPages的字段:

procedure TFrmMain.SetValue(const document: IHTMLDocument2;

  const formNumber: Integer;

  const fieldName, newValue: string);
var
  form: IHTMLFormElement;
  field: IHTMLElement;
begin
  form := WebFormGet(formNumber, document);
  field := form.item(fieldName, '') as IHTMLElement;
  if field = nil then
    exit;
  if field.tagName = 'INPUT' then (field as IHTMLInputElement)
    .value := newValue
  else if field.tagName = 'SELECT' then (field as IHTMLSelectElement)
    .value := newValue
  else if field.tagName = 'TEXTAREA' then (field as IHTMLTextAreaElement)
    .value := newValue;
end;

但是“SetValue”方法无法填写此WebPage的字段! : http://commenting.iranblog.com/services/commenting/commenting.aspx?BlogID=67436&PostID=754352

  SetValue(W.document as IHTMLDocument2, 0, 'name', 'ThisIsANewValueForField');

事实上,我认为这段代码无法找到此网页的字段名称,但我不知道原因!

2 个答案:

答案 0 :(得分:1)

名称为“name”的唯一字段是定义为

的字段
<input onKeyPress=FKeyPress() id=name onBlur=hideLanguageButton() 
      onFocus=showLanguageButton(this) maxlength=50 size=50 
      name=name>

但是这是在页面上唯一表单(表单_ctl0)的结束表单标记(</form>)之后,因此在技术上不是第一种形式。因此,在页面上加载第一个表单的IHTMLFormElement将不包含“name”字段。

答案 1 :(得分:1)

如果WebFormGet返回nil,那么您在该变量上调用一个方法,这肯定会使您的程序崩溃。您没有说您的代码崩溃,因此我们可以假设WebFormGet成功获取了表单。

但如果WebFormGet 没有返回nil,那么您永远不会将任何值分配给field ,所以它的编译器分配默认值为nil。您检查field = nil是否退出。

因此,我们可以立即得出结论,您现在报告的问题与您正在测试的特定网页完全无关。您的代码将在所有页面上失败。并不是说你的代码不能找到字段;您的代码甚至不会查找字段。

您可能已经在调试器中发现了这个问题。不要害怕使用你拥有的工具。您可以在该过程中设置断点,并一次一行地执行代码。在每一行,确认你所期望的真实是真的。您期望field引用您命名的字段,但它总是nil。然后,您可以回顾前面的代码以发现原因。您将查看field可以获得非空值的所有可能方法,然后找出为什么没有发生这些事情。您最终会仔细仔细地重新阅读您的代码,以发现 无法让field获得某个值。

如果您解决了该问题,但代码仍无效,请重复相同的过程。使用调试器逐步执行代码,并确保每个步骤都按预期工作。如果它不起作用,请尝试确定失败的原因。