AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Selectfelder mit TWebBrowser ansprechen ?
Thema durchsuchen
Ansicht
Themen-Optionen

Selectfelder mit TWebBrowser ansprechen ?

Ein Thema von Thomas G. · begonnen am 19. Feb 2005 · letzter Beitrag vom 13. Mär 2005
Antwort Antwort
Thomas G.

Registriert seit: 19. Feb 2005
6 Beiträge
 
#1

Selectfelder mit TWebBrowser ansprechen ?

  Alt 19. Feb 2005, 14:58
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.
Angehängte Grafiken
 
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 19. Feb 2005, 15:20
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
  Mit Zitat antworten Zitat
Thomas G.

Registriert seit: 19. Feb 2005
6 Beiträge
 
#3

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 19. Feb 2005, 16:54
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.
  Mit Zitat antworten Zitat
Thomas G.

Registriert seit: 19. Feb 2005
6 Beiträge
 
#4

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 20. Feb 2005, 00:14
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 20. Feb 2005, 06:25
Wie hast du es gelöst?
Thomas
  Mit Zitat antworten Zitat
Thomas G.

Registriert seit: 19. Feb 2005
6 Beiträge
 
#6

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 20. Feb 2005, 17:06
Das edTest.value muss richtig edtest.SelectedIndex heißen. SelectedIndex ist vom Typ Integer, die Prozedur/Funktion muss dementsprechend noch angepasst werden.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 20. Feb 2005, 17:10
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
  Mit Zitat antworten Zitat
Thomas G.

Registriert seit: 19. Feb 2005
6 Beiträge
 
#8

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 20. Feb 2005, 17:17
Zitat von toms:
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.
  Mit Zitat antworten Zitat
Sushibb

Registriert seit: 27. Jul 2004
13 Beiträge
 
Delphi 6 Personal
 
#9

Re: Selectfelder mit TWebBrowser ansprechen ?

  Alt 13. Mär 2005, 13:22
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...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 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