![]() |
Re: TWebBrowser < undefinierter Bezeichner
naja eigentlich wollte ich damit nix pushen,
fehlt auch irgendwie die hälfte bei dem posting ich hatte das ganze nun wie folgt ausprobiert, aber ich häng noch immer an der selben stelle
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ShDocVw, StdCtrls, activex; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var wb: TWebBrowser; begin wb := TWebBrowser.Create(Form1); TWinControl(wb).Name := 'MyWebBrowser'; TWinControl(wb).Parent := Form1; wb.Align := alClient; wb.Navigate('http://www.google.com'); sleep(2000); wb.OleObject.document.forms.item(0).elements.item('q').value:='test'; end; end. |
Re: TWebBrowser < undefinierter Bezeichner
ersetz das sleep(2000); durch
Delphi-Quellcode:
mit sleep hälst du nur den prozess (mainthread) an, das hilft dir dann aber auch nix wenn die seite noch net geladen ist...
while wb.ReadyState <> READYSTATE_COMPLETE do
Application.ProcessMessages; |
Re: TWebBrowser < undefinierter Bezeichner
hallo, danke für die hilfe, das sleep hier eher unangebracht ist war mir schon
klar, das dadurch allerdings diese zugriffsverletzung verursacht wird ist mir neu, wie zu erwarten war funktioniert der aufruf Application.ProcessMessages; in den threads nicht der einbau von OnDocumentComplete ist mir auch ein rätsel
Delphi-Quellcode:
procedure TMyThreads.Grabber();
var WebBrowser: TWebBrowser; begin OleInitialize(nil); WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do try Navigate('http://www.google.com'); OnDocumentComplete:= //?????? OleObject.Document.Forms.item(0).submit; ??????/// except //nix end; Fstatus:= 'done.'; Synchronize(UpdateLVCaption); FreeAndNil(WebBrowser); OleUninitialize; end; |
Re: TWebBrowser < undefinierter Bezeichner
also ich hab nun nochmal ne ganze weile rumprobiert
und mittlerweile echt genervt von dem kram =(
Delphi-Quellcode:
Der Aufruf von Application.ProcessMessages; funktioniert in
procedure TMyThreads.Execute();
var WebBrowser: TWebBrowser; begin OleInitialize(nil); WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do try Navigate('http://www.google.com'); while ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages; OleObject.document.forms.item(0).elements.item('q').value:='test'; OleObject.Document.Forms.item(0).submit; except end; FreeAndNil(WebBrowser); OleUninitialize; end; dem Thread nicht und mit einer Delay Funktion aus diesem Forum wird die while Schleife nie verlassen. der Ansatz mit Hilfe von ReadyStats <> Readystats_Complete klingt ja vielversprechend, aber wie kann damit im besagten Thread auf ein positives Ergebnis warten bzw wie kann man Delphi veranlassen auf das Eintreten des OnDocumentComplete Events zu warten. |
Re: TWebBrowser < undefinierter Bezeichner
Delphi-Quellcode:
Also ich würde auf keinen Fall das Objekt WebBrowser dynamisch zu Laufzeit erzeugen,
var
WebBrowser: TWebBrowser; begin WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do // irgendwas tun end; FreeAndNil(WebBrowser); end; damit arbeiten und gleich wieder zerstören. Hinter dem WebBrowser stecken sehr viele DLLs, Schnittstellen, Resourcen, .... Deshalb sollte man das Ding nur einmal erzeugen und erst dann zerstören, wenn auch das Formular zerstört wird. Vielleicht ist Navigate noch nicht ganz fertig und du ziehst dem BrowserObjekt sozusagen den Stuhl unterm Hinern weg. |
Re: TWebBrowser < undefinierter Bezeichner
naja, wie gesagt, das ganze läuft in threads,
ich denke da läßt sich das erzeugen wärend der laufzeit nicht vermeiden leider hast du recht damit das navigate(); nicht ausreichend zeit bekommt um die aufgerufene seite vollständig zu laden, da ich nicht weiß wie ich bei einem dynamisch erzeugten twebbrowser auf das event OnDocumentComplete reagieren kann bzw es einzubinden habe - oder "ReadyState <> READYSTATE_COMPLETE" in die warteschleife schicken aber leider konnte ich dazu bisher nichts finden |
Re: TWebBrowser < undefinierter Bezeichner
hab die funktion hier im forum gefunden, das könntest du dann statt Application.ProcessMessages; nehmen:
Delphi-Quellcode:
musst dann als parameter einfach Handle einsetzen..
procedure ProcessMessages(hWnd: DWORD);
var Msg: TMsg; begin while PeekMessage(Msg, hWnd, 0, 0, PM_REMOVE) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end; hoffe konnte dir damit n bischen helfen :| |
Re: TWebBrowser < undefinierter Bezeichner
ich weiß nicht ob ich bei der ganzen geschichte etwas
falsch verstehe, aber eigentlich macht es doch keinen unterschied ob ich den twebbrowser wärend der laufzeit erzeuge oder statisch, ich müßte doch trotzdem events wie ondocumentcomplete nutzen können oder lieg ich damit völlig falsch? |
Re: TWebBrowser < undefinierter Bezeichner
Ist ja auch kein Problem das du das nutzen möchtest!
Gibt zwei Möglichkeiten! 1. Du übergibst deinem Thread die Application. Somit kannst du dann auch Applications.ProcessMessages benutzen. Hab ich aber nicht ausprobiert und kann ich auch nicht sagen ob das in einem Extra Thread dann genauso funktioniert, wie wenn du nur den Hauptthread hast! 2. du bist ja mit dem OnDocumentComplete garnicht mal so weit von der lösung weg! das WebBrowser1.OnDocumentComplete benötigt nur der zuweisung einer Prozedur. Funktioniert nach dem Schema wie im ObjektInspektor! da Klickst du ja normalerweise Doppelklick auf "OnDocumentComplete" und Delphi erstellt dir von hand eine Prozedur und weisst WebBrowser1.OnDocumentComplete automatisch dieser Prozedur zu. Mach du das doch einfach von hand:
Code:
Und da schreibste dann rein was er machen soll!
WebBrowser1.OnDocumentComplete := meineProzedurWennFertigGeladen;
greetz emploi |
Re: TWebBrowser < undefinierter Bezeichner
hallo,
danke für die antwort, die variante 2 hatte ich auch schon ausprobiert, allerdings bekomm ich dann folgende Fehlermeldung: Zitat:
Delphi-Quellcode:
type
TMyThreads = class(TThread) private { Private-Deklarationen } ... procedure Submit(); ... protected procedure Execute; override; ... end; implementation procedure TMyThreads.Execute; var WebBrowser: TWebBrowser; i:integer; begin OleInitialize(nil); WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do try Navigate('http://www.google.com'); OnDocumentComplete:= Submit(); except //fehlt noch end; FreeAndNil(WebBrowser); OleUninitialize; end; procedure TMyThreads.Submit; // Compiler-Fehler: Unbekannte Anweisung: 'OleObject'. OleObject.document.forms.item(0).elements.item('q').value:='test'; OleObject.Document.Forms.item(0).submit; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 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