AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Editfelder in Farmes einer Website ansprechen
Thema durchsuchen
Ansicht
Themen-Optionen

Editfelder in Farmes einer Website ansprechen

Ein Thema von P4CM4N · begonnen am 16. Jan 2008 · letzter Beitrag vom 21. Jan 2008
Antwort Antwort
Seite 3 von 3     123   
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#21

Re: Editfelder in Farmes einer Website ansprechen

  Alt 20. Jan 2008, 18:08
Hallo PacMan,

mit diesem Code navigiere ich zur Google-Seite und fülle das Eingabefeld q im Formular f:

Delphi-Quellcode:
unit MainFrm;

interface

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

type
  TDemoForm = class(TForm)
    Panel: TPanel;
    UrlEdit: TEdit;
    LoadButton: TButton;
    StatusBar: TStatusBar;
    WebBrowser: TWebBrowser;
    procedure LoadButtonClick(Sender: TObject);
    procedure WebBrowserDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

function GetFrameDoc(doc: IHTMLDocument2; v: OleVariant): IHTMLDocument2;
var
  win: IHTMLWindow2;
  u: IUnknown;
begin
  u := doc.frames.item(v);
  if Assigned(u)
  and Succeeded(u.QueryInterface(IHTMLWindow2, win))
    then Result := win.Document
    else Result := nil;
end;

// preconditions:
// - wb.Document fully loaded
// returns first vElement in first vForm in any frame
function GetInputElement(wb: IWebBrowser2; vForm, vElement: Variant): IHTMLInputElement;
var
  iFrame: Integer;
  doc, frameDoc: IHTMLDocument2;
  fe: IHTMLFormElement;
begin
  doc := wb.Document as IHTMLDocument2;
  if doc.frames.length = 0 then
  begin
    fe := doc.forms.item(vForm, 0) as IHTMLFormElement;
    if Assigned(fe)
      then Result := fe.item(vElement, 0) as IHTMLInputElement
      else Result := nil;
  end else
    for iFrame := 0 to Pred(doc.frames.length) do
    begin
      frameDoc := GetFrameDoc(doc, iFrame);
      fe := doc.forms.item(vForm, 0) as IHTMLFormElement;
      if Assigned(fe)
        then Result := fe.item(vElement, 0) as IHTMLInputElement
        else Result := nil;
      if Assigned(Result) then Exit;
    end;
end;

procedure TDemoForm.LoadButtonClick(Sender: TObject);
begin
  with WebBrowser do
    Navigate(UrlEdit.Text); // [url]http://www.google.de[/url]
end;

procedure TDemoForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  ie: IHTMLInputElement;
begin
  with Sender as TWebBrowser do
    if pDisp = DefaultInterface then
    begin
      ie := GetInputElement(DefaultInterface, 'f', 'q');
      if Assigned(ie)
        then ie.value := 'hasta la vista'
        else ShowMessage('bad luck');
    end;
end;

end.
Das müsste auch in einem FrameSet funktionieren, was ich aber nicht getestet habe. Wenn du damit immer noch Probleme hast, dann solltest du mal den URL geben.

Freundliche Grüße
  Mit Zitat antworten Zitat
P4CM4N

Registriert seit: 14. Jun 2007
49 Beiträge
 
#22

Re: Editfelder in Farmes einer Website ansprechen

  Alt 21. Jan 2008, 13:22
Kannst du mir vielleicht den Code erklären? Ich check da garnichts
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#23

Re: Editfelder in Farmes einer Website ansprechen

  Alt 21. Jan 2008, 13:34
Schreck lass nach - muss ich jede Zeile erklären?

Was genau verstehst du denn nicht?
  Mit Zitat antworten Zitat
P4CM4N

Registriert seit: 14. Jun 2007
49 Beiträge
 
#24

Re: Editfelder in Farmes einer Website ansprechen

  Alt 21. Jan 2008, 18:24
Nee, also die Zeile mit Unit und so is klar

Mit diesem Programm durchsuchst du google.de nach forms, bzw. nach dem eingabefeld (q). Die Frameanzahl kriegst du hierdurch oder?
Zitat:
function GetFrameDoc(doc: IHTMLDocument2; v: OleVariant): IHTMLDocument2;
var
win: IHTMLWindow2;
u: IUnknown;
begin
u := doc.frames.item(v);
if Assigned(u)
and Succeeded(u.QueryInterface(IHTMLWindow2, win))
then Result := win.Document
else Result := nil;
end;
Nur wie das dann geht versteh ich nicht.


Und woher weißt du denn, des die Form "f" heißt und das Eingabefeld "q"?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#25

Re: Editfelder in Farmes einer Website ansprechen

  Alt 21. Jan 2008, 18:43
Der einfache Teil der Arbeit ist die Ermittlung der Form- und Feldnamen: FireFox bietet dazu den Menübefehl "Extras | Seiteninformationen".

Die Anzahl der Frames erhalte ich über "doc.frames.length".
Mit GetFrameDoc() ermittle ich das Document eines bestimmten Frame.

Viele Code-Zeilen zeigen einfach nur Zugriffe auf das HTML DOM oder den Wechsel zwischen früher und später Bindung bei COM Objekten. Wenn das für dich noch Neuland ist, dann solltest du dich da mal einlesen. Das HTML DOM ist im MS Windows SDK beschrieben und für die COM Programmierung gibt es sicherlich Tutorials. Zu GetFrameDoc gibt es ein paar Threads in der DP, welche diese Funktion in einen Beispielkontext stellen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 03:09 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