Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Browser "steuern" mit Lazarus (https://www.delphipraxis.net/121734-browser-steuern-mit-lazarus.html)

Glocke89 3. Okt 2008 12:59


Browser "steuern" mit Lazarus
 
Hallo zusammen

(hoffentlich ist das hier der richtige Bereich^^)

Ich möchte mit Lazarus meinen Browser bzw. einen Tab oder ein Fenster im Browser steuern.
Browser: Mozilla Firefox 3.0.3 (jeder andere Browser wäre mir auch recht aber FF würde ich bevorzugen)
IDE: Lazarus Free Pascal 0.9.22 Beta

Unter "steuern" verstehe ich:
  • Öffnen von Links (über Adressleiste eintragen und "Enter drücken")
  • Suchen von Code-Stücken im HTML-Quellcode bzw. Auslesen des Quellcodes in ein Memo (dann kann ich ja selber drinne normal suchen)
  • Ausfüllen von Formularen (also solche Eingabefelder zB mit Zahlen füllen) (--> Eingabefelder sind über JavaScript)
  • Buttons Klicken (--> Buttons sind über JavaScript)

Das ganze ginge sicher auch über JavaScript irgendwie zu machen aber ich bin ehrlich gesagt zu faul mich mit JavaScript auseinanderzusetzen. Und da ich am besten Ahnung von Pascal / Object Pascal / Delphi (oder wie immer man das nenne will) habe, möchte ich es damit machen.

Was ich suche:
  • Downloadmöglichkeit für vorgefertigte Komponenten (--> Browser überhaupt erstmal ansteuern können), die Lazarus-Seite hilft mir da kaum weiter
  • ein Tutorial wie ich mit den Komponenten arbeite (eine Auflistung von Methoden etc. würde mich auch helfen - grundlegende Kenntnisse im Umgang mit Objekten habe ich).

Also wer was hat dann immer rein damit :dp:

TurboMartin 3. Okt 2008 13:23

Re: Browser "steuern" mit Lazarus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Für den IE könnte ich dir mit folgendem helfen:

Delphi-Quellcode:
type
  TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; wParam: wParam; out pObject): HRESULT; stdcall;

function TfrmMain.GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  Msg: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin

  //OLE-DLL laden
  hInst := LoadLibrary('Oleacc.dll');
  @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');

  //geladen?
  if @ObjectFromLresult <> nil then
  begin

    try

      //Message-Handler
      Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);

      //Rückgabe
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
          IWebbrowser2, IE);

    finally

      //OLE-DLL entladen
      FreeLibrary(hInst);
    end;
  end;
end;

procedure Work(Sender: TObject);
var
  wndMain: hWnd;
  wndChild: hWnd;
  htmldDocument: IHtmlDocument2;
  iwbIE: IWebBrowser2;
  htmleBodyCode: IHTMLElement;
begin
  //IE suchen
  wndMain := FindWindow('IEFrame', nil);
  if wndMain <> 0 then
  begin

    //Tab suchen, welcher sich zur Zeit im Vordergrund befindet
    wndChild := FindWindowEx(wndMain, 0, 'TabWindowClass', nil);
    wndChild := FindWindowEx(wndChild, 0, 'Shell DocObject View', nil);
    wndChild := FindWindowEx(wndChild, 0, 'Internet Explorer_Server', nil);

    //Tab gefunden?
    if wndChild <> 0 then
    begin

      //IEInterface bekommen
      GetIEFromHWnd(WndChild, iwbIE);
      if iwbIE <> nil then
      begin

        //hier kannst du dann mit iwbIE arbeiten
      end;
    end;
  end;
end;

Glocke89 3. Okt 2008 13:37

Re: Browser "steuern" mit Lazarus
 
Klingt schonmal relativ kompliziert :|
In der pas-Datei seh ich nicht wirklich durch ...
Aber der Code den du gepostet hast, der ist verständlich :mrgreen:
Kannst du mir vielleicht sagen wie ich zB an den Quellcode des im aktiven Tab befindlichen HTML-Dokumentes komme (mit welcher Methode etc.) oder eine URL in einen Tab lade?

TurboMartin 3. Okt 2008 14:00

Re: Browser "steuern" mit Lazarus
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
while iwbIE.ReadyState <> 4 do //ka ob das so jetzt richtig ist
  Application.ProcessMessages;

htmldDocument := iwbIE.Document as IHtmlDocument2;
while htmldDocument.ReadyState <> 'complete' do
  Application.ProcessMessages;

htmlBodyCode := htmldDocument.body;
Damit hast Du jetzt den HTML-Body.

Die Unit aus dem ersten Beitrag, und die ich jetzt nch angehangen habe (leider vergessen) musst Du nur einbinden(beides Typlib).

Glocke89 3. Okt 2008 14:10

Re: Browser "steuern" mit Lazarus
 
Zitat:

Zitat von TurboMartin
Damit hast Du jetzt den HTML-Body.

In welcher Form (sorry wenn die Frage blöd ist ^^).
Von welchem Typ ist htmleBodyCode? Kann ich den Inhalt in ein Memo-Feld ausgeben? Wenn ja wie?
(Aber ich glaube schonmal das geht in die Richtung wie ich es angedacht habe).

TurboMartin 3. Okt 2008 14:17

Re: Browser "steuern" mit Lazarus
 
htmleBodyCode.innerHTML ist ein WideString

Glocke89 3. Okt 2008 14:19

Re: Browser "steuern" mit Lazarus
 
Inwiefern ist ein Widestring mit Memo.Lines (müsste TStrings oder so sein) kompatibel?

/EDIT: Kann mir einer aus dem Stehgreif sagen, wie ich die beiden *.pas einbinde? Hab sowas noch nie gemacht :?

TurboMartin 3. Okt 2008 14:23

Re: Browser "steuern" mit Lazarus
 
So wie ich das weiß, müsste das ganz einfach mit String := WideString gehen.

Delphi-Quellcode:
uses
  ActiveX, Shdocvw_tlb, MSHTML_TLB;

Glocke89 3. Okt 2008 14:36

Re: Browser "steuern" mit Lazarus
 
Hab das eben mal versuchen wollen aber es kommen nur zwei Fehler:
Zitat:

Shdocvw_tlb.pas(55,2) Warning: Illegal compiler directive "$VARPROPSETTER"
Shdocvw_tlb.pas(1,1) Fatal: Can't find unit OleCtrls
/EDIT: bezieht sich beides auf SHDocVw_TLB.pas

TurboMartin 3. Okt 2008 14:45

Re: Browser "steuern" mit Lazarus
 
Zitat:

Zitat von Glocke89
Hab das eben mal versuchen wollen aber es kommen nur zwei Fehler:
Zitat:

Shdocvw_tlb.pas(55,2) Warning: Illegal compiler directive "$VARPROPSETTER"
Aus der Hilfe:

Die Compiler-Direktive VARPROPSETTER ist aktiviert. Dies ermöglicht die Verwendung des Schlüsselworts var in der Parameterliste der Methoden zum Setzen der Eigenschaft. Dadurch wird eine Compiler-Optimierung deaktiviert, die eine Übergabe von Parametern per Wert statt per Referenz verursachen würde. Die Direktive VARPROPSETTER muss bei der Erstellung von TLB-Units für Komponenten aktiviert sein, die in einer anderen Sprache als Delphi programmiert sind.

Daher, du müsstest mal schauen ob es eine andere dafür bei Lazarus zu finden ist. Ansonsten probier mal diese zu deaktieviren (Irgendwas vors $ schreiben oder das $ wegmachen
Zitat:

Zitat von Glocke89
Shdocvw_tlb.pas(1,1) Fatal: Can't find unit OleCtrls

/EDIT: bezieht sich beides auf SHDocVw_TLB.pas

Tja, OleCtrls ist aus der VCL. Aber Du müsstest eine ähnliche Unit auch bei Lazarus finden. Bind einfach mal alle mit Ole im Namen ein :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 Uhr.
Seite 1 von 2  1 2      

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