AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Browser "steuern" mit Lazarus
Thema durchsuchen
Ansicht
Themen-Optionen

Browser "steuern" mit Lazarus

Ein Thema von Glocke89 · begonnen am 3. Okt 2008 · letzter Beitrag vom 6. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Glocke89
Glocke89

Registriert seit: 2. Mär 2007
Ort: Thüringen
80 Beiträge
 
Lazarus
 
#1

Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 13:59
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
Christian
  Mit Zitat antworten Zitat
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 14:23
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;
Angehängte Dateien
Dateityp: pas mshtml_tlb_104.pas (2,08 MB, 27x aufgerufen)
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
Benutzerbild von Glocke89
Glocke89

Registriert seit: 2. Mär 2007
Ort: Thüringen
80 Beiträge
 
Lazarus
 
#3

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 14:37
Klingt schonmal relativ kompliziert
In der pas-Datei seh ich nicht wirklich durch ...
Aber der Code den du gepostet hast, der ist verständlich
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?
Christian
  Mit Zitat antworten Zitat
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 15:00
Delphi-Quellcode:
while iwbIE.ReadyState <> 4 do //ka ob das so jetzt richtig ist
  Application.ProcessMessages;

htmldDocument := iwbIE.Document as IHtmlDocument2;
while htmldDocument.ReadyState <> 'completedo
  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).
Angehängte Dateien
Dateityp: pas shdocvw_tlb_139.pas (181,8 KB, 15x aufgerufen)
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
Benutzerbild von Glocke89
Glocke89

Registriert seit: 2. Mär 2007
Ort: Thüringen
80 Beiträge
 
Lazarus
 
#5

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 15:10
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).
Christian
  Mit Zitat antworten Zitat
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 15:17
htmleBodyCode.innerHTML ist ein WideString
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
Benutzerbild von Glocke89
Glocke89

Registriert seit: 2. Mär 2007
Ort: Thüringen
80 Beiträge
 
Lazarus
 
#7

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 15:19
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
Christian
  Mit Zitat antworten Zitat
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 15:23
So wie ich das weiß, müsste das ganz einfach mit String := WideString gehen.

Delphi-Quellcode:
uses
  ActiveX, Shdocvw_tlb, MSHTML_TLB;
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
Benutzerbild von Glocke89
Glocke89

Registriert seit: 2. Mär 2007
Ort: Thüringen
80 Beiträge
 
Lazarus
 
#9

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 15:36
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
Christian
  Mit Zitat antworten Zitat
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Browser "steuern" mit Lazarus

  Alt 3. Okt 2008, 15:45
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 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
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:48 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