Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Auswahlliste TWebbrowser (https://www.delphipraxis.net/118184-auswahlliste-twebbrowser.html)

goenner90 2. Aug 2008 03:16


Auswahlliste TWebbrowser
 
Hallo,
sagen wir mal ich habe eine Auswahlliste, so wie diese hier:

Delphi-Quellcode:
<body>

<h1>W&auml;hlen Sie Ihren Favoriten!</h1>

<form action="select.htm">
 



    <select name="top5" size="3">
      <option>Heino</option>
      <option>Michael Jackson</option>
      <option>Tom Waits</option>
      <option>Nina Hagen</option>
      <option>Marianne Rosenberg</option>
    </select>
  </p>
</form>

</body>
</html>
[Quelle: selfhtml.org]

und zwar ist meine Frage , wie ich da jetzt etwas über den twebbrowser auswähle in Formularen . Ausfüllen von edits geht ja recht einfach aber das hab ich nicht hinbekommen....[ auf der Site sind mehrere Forms also net nur eins , das wird ja wichtig sein denke ich ;-) ]

Ich Freu mich auf eure Antworten.

mfg Goenner90

toms 2. Aug 2008 06:15

Re: Auswahlliste TWebbrowser
 
Ich habe mal folgende Funktion zum Auswählen eines Items aus einer Liste geschrieben:

Delphi-Quellcode:
function WB_select_SelectItem(WB: TWebBrowser; SelectName, ItemName: string): boolean;
var
  iForms, iFormItems, iSelectItems: Word;
  FormItem: OleVariant;
begin
  Result := False;
  for iForms := 0 to WB.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := WB.OleObject.Document.forms.Item(iForms);
    for iFormItems := 0 to FormItem.Length - 1 do
    begin
      if (FormItem.Item(iFormItems).type = 'select-one') and
        (FormItem.Item(iFormItems).Name = SelectName) then
      begin
        for iSelectItems := 0 to FormItem.Item(iFormItems).Options.Length - 1 do
        begin
          if SameText(FormItem.Item(iFormItems).Options.Item(iSelectItems).Text, ItemName) then
          begin
            FormItem.Item(iFormItems).SelectedIndex := iSelectItems;
            Result := True;
            Break;
          end;
        end;
      end;
    end;
  end;
end;

Aufruf für obiges Beispiel würde so aussehen:

Delphi-Quellcode:
 WB_select_SelectItem(Webbrowser1, 'top5','Tom Waits');

goenner90 2. Aug 2008 15:51

Re: Auswahlliste TWebbrowser
 
Danke Toms,
du hast es einfach drauf ;-)

toms 26. Dez 2008 09:44

Re: Auswahlliste TWebbrowser
 
Update: Das OnChange Ereignis des DropDowns wird nicht ausgelöst, wenn ein Item per Code ausgewählt wird.

Delphi-Quellcode:
uses
  mshtml_tlb, ActiveX;

function TriggerEvent(WB: TWebbrowser; Element: OleVariant; EventName: WideString): Boolean;
var
  Doc4: IHTMLDocument4;
  Doc2: IHTMLDocument2;
  EventObj: IHTMLEventObj;
  varEventObj, pEventObject: OleVariant;
begin
  Result := False;
  if (Succeeded(WB.Document.QueryInterface(IID_IHTMLDocument4, Doc4))) then
  begin
    // TVariantArg(ret).vt := VT_UINT;
    // TVariantArg(ret).lVal := 0;
    varEventObj := Unassigned;
    EventObj := Doc4.CreateEventObject(varEventObj);
    if (Succeeded(WB.Document.QueryInterface(IID_IHTMLDocument2, Doc2))) then
    begin
      pEventObject := EventObj;
      try
        Result := Element.fireEvent(EventName, pEventObject);
      except
        Result := False;
      end;
    end;
  end;
end;

function WB_select_SelectItem(WB: TWebbrowser; SelectName, ItemName: string; TriggerOnChangeEvent: Boolean): boolean;
var
  iForms, iFormItems, iSelectItems: Word;
  FormItem: OleVariant;
begin
  Result := False;
  for iForms := 0 to WB.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := WB.OleObject.Document.forms.Item(iForms);
    for iFormItems := 0 to FormItem.Length - 1 do
    begin
      if (FormItem.Item(iFormItems).type = 'select-one') and
        (FormItem.Item(iFormItems).Name = SelectName) then
      begin
        for iSelectItems := 0 to FormItem.Item(iFormItems).Options.Length - 1 do
        begin
          if SameText(FormItem.Item(iFormItems).Options.Item(iSelectItems).Text, ItemName) then
          begin
            FormItem.Item(iFormItems).SelectedIndex := iSelectItems;
            // The onchange event does not fire when the selected option of
            // the select object is changed programatically
            // http://msdn.microsoft.com/en-us/library/ms536912(VS.85).aspx
            if TriggerOnChangeEvent then
              // Trigger OnChange event:
              TriggerEvent(WB, FormItem.Item(iFormItems), 'onchange');
            Result := True;
            Break;
          end;
        end;
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WB_select_SelectItem(Webbrowser1,'url','Germany', True);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Webbrowser1.Navigate('http://www.mathworks.com/company/worldwide/');
end;

Dave729 30. Aug 2010 08:24

AW: Auswahlliste TWebbrowser
 
Hallo

srry wenn ich das Thema jetzt mal wieder aufwecken muss.

Hab alles gemacht wie es hier steht (von Toms beitrag). Nur, das kleine Problem was ich habe ist das :

Zitat:

[Warning] Unit1.pas(157): Return value of function 'WB_ClickLink' might be undefined
[Error] Unit1.pas(309): Undeclared identifier: 'IHTMLDocument4'
[Error] Unit1.pas(315): Undeclared identifier: 'IID_IHTMLDocument4'
ActiveX und MSHTML sind in uses drin.
Ich weiss net warum er das nicht erkennt.
Kann mir bitte einer helfen.

Ps.: Hab Delphi Version 6

MfG Dave729

toms 5. Sep 2010 07:23

AW: Auswahlliste TWebbrowser
 
Zitat:

Undeclared identifier: 'IHTMLDocument4'
Hallo, bei deiner MSHTML Unit handelt es sich um eine etwas ältere Version, welche neuere Interfaces etc.(von IE 7/8) noch nicht kennt.

Lösung: Eine neuere MSHTML importieren.

Jacques Murell 14. Aug 2011 10:38

AW: Auswahlliste TWebbrowser
 
Hallo nochmal,

ich hoffe Ihr könnt mir nochmal kurz helfen. Der von toms gepostete Code funktioniert tadellos, solange das SELECT-Element auch wirklich auf einem Form liegt, also von <form></form> umschlossen ist. Ist das nicht der Fall, stürzt die Funktion gnadenlos mit Fehler beim Lesen von Adresse 0000000 ab.

Bei meiner Webseite ist das der Fall, es liegt kein Form vor, das Element steht einfach so im Quelltext:
Code:
<SELECT style="WIDTH: 100px" onchange="javascript:location.href='getData.php?l='+this.options[this.selectedIndex].value" size=1 name=l>
Wie kann ich dies nun ansteuern? Ich hatte es noch direkt versucht:
Delphi-Quellcode:
Element(OleVariant) := WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(WideString('l'));
Element.value := Element.options.Item(2).value;
Leider stürzt auch hier der Debugger gnadenlos ab. Wie kann das SelectItem nun setzen?

himitsu 14. Aug 2011 11:00

AW: Auswahlliste TWebbrowser
 
Erstmal kann man soeine lange Verschachtelung, wie
Delphi-Quellcode:
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(WideString('l'));
locker in seine Einzelzeile zerlegen und dann schauen wo es wirklich knallt.
Delphi-Quellcode:
Zugriff auf $00000xxxx
sagt dir doch, daß da irgendwo etwas nil ist und du dennoch gnadenlos versuchst drauf zuzugreifen ... also wunder dich blos nicht über die gnadenlose Reaktion vom Delphi.

Delphi-Quellcode:
WebBrowser1.OleObject.Document.Forms.
... du sagtest doch, daß es keine Form gibt, also greif auch nicht darauf zu :!:
Wenn das SELECT eine ID hätte, dann könnte man es über diese global (und nicht in einer nichtexistierenden Form) über seine ID suchen oder man sucht eben global über den TagNamen.

Jacques Murell 14. Aug 2011 11:20

AW: Auswahlliste TWebbrowser
 
Ja das stimmt natürlich. ;)

Delphi-Quellcode:
Element := WebBrowser1.OleObject.Document.GetElementsByName('l'); // Scheint zu klappen

  selcount := Element.options.Length; // Jetzt kracht es hier, was ich nicht verstehe da diese Zeile bei anderen Select-Elementen die auf Forms liegen klappt
:-(

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EOleError mit der Meldung 'Die Methode 'Options' wird vom Automatisierungsobjekt nicht unterstützt' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Jacques Murell 14. Aug 2011 12:16

AW: Auswahlliste TWebbrowser
 
Problem gelöst, danke euch.

Delphi-Quellcode:
WebBrowser1.OleObject.Document.GetElementsByName('l').Item(0).SelectedIndex := 3;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz