Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Selectfelder mit TWebBrowser ansprechen ? (https://www.delphipraxis.net/40693-selectfelder-mit-twebbrowser-ansprechen.html)

Thomas G. 19. Feb 2005 14:58


Selectfelder mit TWebBrowser ansprechen ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich möchte für mein Programm einen WebBrowser implementieren der (natürlich in Grenzen) auch einige Dinge automatisiert erledigen kann.

Hier http://www.delphi-forum.de/viewtopic...asc&highlight= gibt es dazu ein super Tutorial wie man es z.B. machen kann, allerdings fehlt leider die Funktion zum Ansprechen von Selectfeldern ( ein Bild von einem solchen habe ich angehangen, manche nennen das ja auch Combo oder anders). Ist jemandem bekannt wie man ein solches Feld über die Scnittstelle des WebBrowsers ansteuern kann? Danke im voraus.

toms 19. Feb 2005 15:20

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Hi,

Hier ein paar nützliche Funktionen für
Editfelder, Radiobuttons, Checkboxen, Select Felder (Combobox, Dropdown)

Delphi-Quellcode:
unit WebControl;

interface

uses
  Windows, SysUtils, Graphics, Dialogs, Classes,
  EmbeddedWB, MSHTML_TLB, SHDocVw_TLB, OleCtrls;

// Editfeld
function ReadEditValue(Webbrowser:TEmbeddedWB;Editname:String):String;
procedure SetEditValue(Webbrowser:TEmbeddedWB;Editname,Value:String);
// Radiobutton
function ReadRadioValue(Webbrowser:TEmbeddedWB;Radioname:String):String;
procedure SetRadioStatus(Webbrowser:TEmbeddedWB;Radioname,Value:String;SetValue:Boolean);
// Checkbox
function ReadCheckboxValue(Webbrowser:TEmbeddedWB;Checkboxname:String):String;
function ReadCheckboxStatus(Webbrowser:TEmbeddedWB;Checkboxname:String):Boolean;
procedure SetCheckboxStatus(Webbrowser:TEmbeddedWB;Checkboxname:String;Status:Boolean);
// Select
function ReadSelectValue(Webbrowser:TEmbeddedWB;Selectname:String):String;
procedure SetSelectValue(Webbrowser:TEmbeddedWB;Selectname,SelectValue:String);


implementation

function ReadEditValue(Webbrowser:TEmbeddedWB;Editname:String):String;
var
  Document: IHTMLDocument2;
  edTest: IHTMLInputTextElement;
begin
// Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Editname, 0),
      IHTMLInputTextElement, edTest) then
    begin
      // Aktuellen Wert auslesen
      Result:=(edTest.value);
    end
    else
    begin
      ShowMessage('Element mit dem Namen "'+Editname+'" existiert ' +
        'nicht oder ist kein Text-Input-Element!');
      Result:='NIL';
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
    Result:='NIL';
  end;
end;

procedure SetEditValue(Webbrowser:TEmbeddedWB;Editname,Value:String);
var
  Document: IHTMLDocument2;
  edTest: IHTMLInputTextElement;
begin
// Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Editname, 0),
      IHTMLInputTextElement, edTest) then
    begin
      // Neuen Wert setzen
      edTest.value:= Value;
    end else begin
    ShowMessage('Element mit dem Namen "'+Editname+'" existiert ' +'nicht oder ist kein Text-Input-Element!');
    end;
  end else begin
    ShowMessage('Kein HTML-Dokument geladen!');
  end;
end;

// Wert den das RadioButton besitzt zurückgeben
function ReadRadioValue(Webbrowser:TEmbeddedWB;Radioname:String):String;
var
  Document: IHTMLDocument2;
  rbTestList: IHTMLElementCollection;
  rbTest: IHTMLOptionButtonElement;
  I: Integer;
begin
 // Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Radioname, EmptyParam),
      IHTMLElementCollection, rbTestList) then
    begin
      // Aktuellen Wert auslesen
      for I:= 0 to rbTestList.length - 1 do
      begin
        // Referenz auf i. RadioButton
        if Supports(rbTestList.item(I, EmptyParam),
          IHTMLOptionButtonElement, rbTest) then
        begin
          // Anzeigen, wenn dieser RadioButton ausgewählt
          if rbTest.checked then Result:=rbTest.value;
          //  ShowMessageFmt('Der RadioButton mit dem Wert %s' +
          //    ' ist ausgewählt!', [rbTest.value]);
        end
        else
        begin
          ShowMessage('Element, das "'+Radioname+'" heißt, ' +
            'aber weder RadioButton, noch CheckBox ist!"');
          Result:='NIL';
        end;
      end;
    end
    else
    begin
      ShowMessage('Es muss mindestens ein Element mit dem Namen "' +Radioname+
        '" existieren!');
       Result:='NIL';
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
    Result:='NIL';
  end;
end;

// Radiobutton der zu der Gruppe "Radioname" gehört und den Wert
// "Value" den Boolean Status "SetValue" geben
procedure SetRadioStatus(Webbrowser:TEmbeddedWB;Radioname,Value:String;SetValue:Boolean);
var
  Document: IHTMLDocument2;
  rbTestList: IHTMLElementCollection;
  rbTest: IHTMLOptionButtonElement;
  I: Integer;
begin
 // Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Radioname, EmptyParam),
      IHTMLElementCollection, rbTestList) then
    begin
      // Aktuellen Wert auslesen
      for I:= 0 to rbTestList.length - 1 do
      begin
        // Referenz auf i. RadioButton
        if Supports(rbTestList.item(I, EmptyParam),
          IHTMLOptionButtonElement, rbTest) then
        begin
          // Anzeigen, wenn dieser RadioButton ausgewählt
          //if rbTest.checked then Result:=rbTest.value;
        end
        else
        begin
          ShowMessage('Element, das "'+Radioname+'" heißt, ' +
            'aber weder RadioButton, noch CheckBox ist!"');
        end;
      end;
     // Neuen Wert setzen
      for I:= 0 to rbTestList.length - 1 do
      begin
        // Referenz auf i. RadioButton
        if Supports(rbTestList.item(I, EmptyParam),
          IHTMLOptionButtonElement, rbTest) then
        begin
          // Wir möchten den RadioButton mit dem Wert "3" aktivieren
          if rbTest.value = Value then
            rbTest.checked:= SetValue;
        end;
      end;
    end
    else
    begin
      ShowMessage('Es muss mindestens ein Element mit dem Namen "' +Radioname+
        '" existieren!');
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
  end;
end;


function ReadCheckboxValue(Webbrowser:TEmbeddedWB;Checkboxname:String):String;
var
  Document: IHTMLDocument2;
  CheckboxTest: IHTMLOptionButtonElement;
begin
 // Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Checkboxname, 0),
      IHTMLOptionButtonElement, CheckboxTest) then
    begin
      // Aktuellen Wert auslesen
      Result:=CheckboxTest.value;
      //If CheckboxTest.status=true then Showmessage('True') else
      Showmessage('False');
      //ShowMessage(CheckboxTest.status);
    end
    else
    begin
      ShowMessage('Element mit dem Namen "'+Checkboxname+'" existiert' +
        'nicht oder ist kein Checkbox-Input-Element!');
      Result:='NIL';
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
    Result:='NIL';
  end;
end;

function ReadCheckboxStatus(Webbrowser:TEmbeddedWB;Checkboxname:String):Boolean;
var
  Document: IHTMLDocument2;
  CheckboxTest: IHTMLOptionButtonElement;
begin
  Result:=False;
 // Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Checkboxname, 0),
      IHTMLOptionButtonElement, CheckboxTest) then
    begin
      // Aktuellen Wert auslesen
      Result:=CheckboxTest.status;
    end
    else
    begin
      ShowMessage('Element mit dem Namen "'+Checkboxname+'" existiert' +
        'nicht oder ist kein Checkbox-Input-Element!');
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
  end;
end;

procedure SetCheckboxStatus(Webbrowser:TEmbeddedWB;Checkboxname:String;Status:Boolean);
var
  Document: IHTMLDocument2;
  CheckboxTest: IHTMLOptionButtonElement;
begin
 // Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Checkboxname, 0),
      IHTMLOptionButtonElement, CheckboxTest) then
    begin
      CheckboxTest.status:=Status;
    end
    else
    begin
      ShowMessage('Element mit dem Namen "'+Checkboxname+'" existiert' +
        'nicht oder ist kein Checkbox-Input-Element!');
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
  end;
end;


function ReadSelectValue(Webbrowser:TEmbeddedWB;Selectname:String):String;
var
  Document: IHTMLDocument2;
  edTest: IHTMLSelectElement;
begin
// Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Selectname, 0),
      IHTMLSelectElement, edTest) then
    begin
      // Aktuellen Wert auslesen
      Result:=edTest.value;
      // Neuen Wert setzen
      //edTest.value:= 'NineBerry is Great!';
    end
    else
    begin
      ShowMessage('Element mit dem Namen "'+Selectname+'" existiert ' +
        'nicht oder ist kein Select-Element!');
      Result:='NIL';
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
    Result:='NIL';
  end;
end;

procedure SetSelectValue(Webbrowser:TEmbeddedWB;Selectname,SelectValue:String);
var
  Document: IHTMLDocument2;
  edTest: IHTMLSelectElement;
begin
// Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Selectname, 0),
      IHTMLSelectElement, edTest) then
    begin
      // Neuen Wert setzen
      edTest.value:= SelectValue;
    end
    else
    begin
      ShowMessage('Element mit dem Namen "'+Selectname+'" existiert ' +
        'nicht oder ist kein Select-Element!');
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
  end;
end;

Thomas G. 19. Feb 2005 16:54

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Hi toms,

das sieht ja schon mal sehr vielversprechend aus. Allerdings funktioniert es bei einem ersten Test bei mir noch nicht richtig, vielleicht weißt du ja was ich falsch mache.

Implementierung:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, MSHTML,
  StdCtrls, SHDocVw, OleCtrls;

function ReadSelectValue(Webbrowser:TWebBrowser;Selectname:String):String;

implementation


function ReadSelectValue(Webbrowser:TWebBrowser;Selectname:String):String;
var
  Document: IHTMLDocument2;
  edTest: IHTMLSelectElement;
begin
// Referenz auf Dokument
  if Supports(WebBrowser.Document, IHTMLDocument2, Document) then
  begin
    // Referenz auf Eingabe-Control-Element
    if Supports(Document.all.item(Selectname, 0),
      IHTMLSelectElement, edTest) then
    begin
      // Aktuellen Wert auslesen
      Result:=edTest.value;
      // Neuen Wert setzen
      //edTest.value:= 'NineBerry is Great!';
    end
    else
    begin
      ShowMessage('Element mit dem Namen "'+Selectname+'" existiert ' +
        'nicht oder ist kein Select-Element!');
      Result:='NIL';
    end;
  end
  else
  begin
    ShowMessage('Kein HTML-Dokument geladen!');
    Result:='NIL';
  end;
end;
Als Testbeispiel habe ich die die Selectfelder von der Web.de-Registrierungsseite benutzt ( https://user02.web.de/Registrierung/...email@register ) und wollte nun den Wert eines dieser Selectfelder ("cf_land") mit folgender Anweisung auslesen:


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 showmessage(ReadSelectValue(WebBrowser1,'cf_land'));
end;

Ausgeben tut er mir daraufhin jedoch nur eine leere Messagebox, gefunden haben muss er das entsprechende Selectfeld jedoch, sonst hätte er eine entsprechende Fehlermeldung zurückgegeben.

Thomas G. 20. Feb 2005 00:14

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Alles klar, habe es mit Hilfe hinbekommen. ReadCheckboxValue, ReadSelectValue und SetSelectValue sind nicht wirklich ausgereift bzw. im Falle der letzten beiden sogar nicht funktionsfähig. ReadRadioValue und SetRadioStatus habe ich nicht gebraucht und daher noch nicht probiert. Trotzdem danke für die Hilfe, letztendlich hat es mit etwas Friemelei ja funktioniert :-D

toms 20. Feb 2005 06:25

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Wie hast du es gelöst?

Thomas G. 20. Feb 2005 17:06

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Das edTest.value muss richtig edtest.SelectedIndex heißen. SelectedIndex ist vom Typ Integer, die Prozedur/Funktion muss dementsprechend noch angepasst werden.

toms 20. Feb 2005 17:10

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Zitat:

Zitat von Thomas G.
Das edTest.value muss richtig edtest.SelectedIndex heißen. SelectedIndex ist vom Typ Integer, die Prozedur/Funktion muss dementsprechend noch angepasst werden.

Aber SelectedIndex liefert ja nur den Index des Select Feldes.
Wie kriegt man aber den ausgewaehlten Text?

Thomas G. 20. Feb 2005 17:17

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Zitat:

Zitat von toms
Zitat:

Zitat von Thomas G.
Das edTest.value muss richtig edtest.SelectedIndex heißen. SelectedIndex ist vom Typ Integer, die Prozedur/Funktion muss dementsprechend noch angepasst werden.

Aber SelectedIndex liefert ja nur den Index des Select Feldes.
Wie kriegt man aber den ausgewaehlten Text?

Mhmm, also für meine Zwecke ist der SelectedIndex ausreichend, den Befehl um den String des Eintrages zu bekommen kenne ich auch nicht, notfalls müsste man ihn sich eben aus dem Quelltext des HTML-Dokumentes auslesen.

Sushibb 13. Mär 2005 13:22

Re: Selectfelder mit TWebBrowser ansprechen ?
 
Ich hab da ein kleines Problem. In meinem Quellcode hat die Select-Box keinen Namen. Ich hab versucht, das einfach einen Leerstring zu übergeben, aber das funzt nicht so recht. Gibt es ne Möglichkeit vorher alle Selectboxen auflisten zu lassen, die dort existieren, oder sonst irgendwie an die Box ranzukommen. Es gibt in der Seite auch nur diese eine Box...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.

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