![]() |
Re: TWebBrowser < undefinierter Bezeichner
Delphi-Quellcode:
sollte funktionieren
type
TMyThreads = class(TThread) private procedure Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); //deine prozedur und die andere müssen identisch sein (jedenfalls die Parameter..)! protected procedure Execute; override; end; implementation procedure TMyThreads.Execute; var WebBrowser: TWebBrowser; i:integer; begin OleInitialize(nil); WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do begin try Navigate('http://www.google.com'); OnDocumentComplete:= Submit; except //... end; end; end; procedure TMyThreads.Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin if URL = 'http://www.google.com' then begin (Sender As TWebBrowser).OleObject.document.forms.item(0).elements.item('q').value:='test'; (Sender As TWebBrowser).OleObject.Document.Forms.item(0).submit; end; end; |
Re: TWebBrowser < undefinierter Bezeichner
hi,
dein problem ist wenn du der OnDocumentComplete ne Prozedur zuweist dann musst die genau die gleiche schnittstelle haben wie die die vom Objektinspektor automatisch generiert wird! dh klick mal im Objektinspektor doppelklick auf das ereigniss DocumentComplete und schau dir die Schnittstelle an! Genau diese Schnittstelle muss deine eigene Prozedur auch haben! dann sollte es gehen! mfg emploi |
Re: TWebBrowser < undefinierter Bezeichner
oh danke danke, damit helft ihr mir sehr weiter :)
ich hab das ganze nun dank Eurer Hilfe wie folgt umgebaut und der compiler meckert nun auch nicht mehr. leider tritt das OnDocumentComplete Ereignis nie ein.
Delphi-Quellcode:
procedure TMyThreads.Execute;
var WebBrowser: TWebBrowser; i:integer; begin OleInitialize(nil); WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do try Navigate('http://www.google.com'); Fstatus:= 'Connecting to http://google.com'; Synchronize(UpdateLVCaption); OnDocumentComplete:= Submit; except FreeAndNil(WebBrowser); OleUninitialize; end; Fstatus:= 'finished.'; Synchronize(UpdateLVCaption); end; procedure TMyThreads.Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin // Tritt leider nie ein ************************** showmessage('Submit fired'); //************************************************ (Sender As TWebBrowser).OleObject.document.forms.item(0).elements.item('q').value:='test'; (Sender As TWebBrowser).OleObject.Document.Forms.item(0).submit; FreeAndNil(Sender); OleUninitialize; end; |
Re: TWebBrowser < undefinierter Bezeichner
möglicherweise endet die methode schon bevor
ondocumentcomplete ausgelöst wird |
Re: TWebBrowser < undefinierter Bezeichner
auf showmessage würde ich mich nicht verlassen, ist soweit ich mich erinner, ne an die VCL angekoppelte funktion, die in threads net funktioniert :gruebel: :roll:
[EDIT] btw seh ich gerad das freeandnil+couninitialize in dem event.. musste weg :angel2: [/EDIT] |
Re: TWebBrowser < undefinierter Bezeichner
Also ich kann mir zwar nicht vorstellen das es davon abhängig ist,
aber weise mal dem OnDocumentComplete direkt nach dem erzeugen deiner Submit Methode zu. Vielleicht geht das ja ;) Ansonsten könnte es auch passieren das das laden der seite länger dauert...
Code:
... und er das FreeAndNil eher aufruft bevor das Ereignis überhaupt auftreten kann!
procedure TMyThreads.Execute;
var WebBrowser: TWebBrowser; i:integer; begin OleInitialize(nil); WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do try Navigate('http://www.google.com'); Fstatus:= 'Connecting to http://google.com'; Synchronize(UpdateLVCaption); OnDocumentComplete:= Submit; except FreeAndNil(WebBrowser); OleUninitialize; end; Fstatus:= 'finished.'; Synchronize(UpdateLVCaption); end; procedure TMyThreads.Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin // Tritt leider nie ein ************************** showmessage('Submit fired'); //************************************************ (Sender As TWebBrowser).OleObject.document.forms.item(0).elements.item('q').value:='test'; (Sender As TWebBrowser).OleObject.Document.Forms.item(0).submit; FreeAndNil(Sender); OleUninitialize; end; Hab leider momentan keine zeit, bin immer nur mal sporadisch am pc. werd mir das morgen mal angucken wennes bis dahin nicht gelöst hast! mfg emploi [edit] ich seh grad der Basic war ja schneller mit der antwort :P [/edit] |
Re: TWebBrowser < undefinierter Bezeichner
also laut meinem packetsniffer wird
Navigate('http://www.google.com'); ausgeführt und anschließend wird Fstatus:= 'finished.'; übergeben. die ondocumentcomplete anweisung dazwischen wird nicht ausgeführt |
Re: TWebBrowser < undefinierter Bezeichner
Zitat:
dieser wird auch nicht angezeigt in meiner mainform:
Delphi-Quellcode:
darüber hinaus hab ich auch noch andere Events ausprobiert,
procedure TMyThreads.Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin Fstatus:= 'Submit() fired!'; Synchronize(UpdateLVCaption); end; immer mit dem selben Ergebnis :( |
Re: TWebBrowser < undefinierter Bezeichner
so hab mal bissel dran gebastelt.
schau dir das an und probier es ein bissel aus. sollte dann für dich klappen:
Code:
unit Unit2;
interface uses SysUtils, Classes, Controls, Forms, Dialogs, OleCtrls, SHDocVw, ActiveX; type myThread = class(TThread) private { Private-Deklarationen } protected procedure Execute; override; procedure Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); procedure UpdateCaption; public app : TApplication; end; implementation uses Unit1; { Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen nur in einer Methode namens Synchronize aufgerufen werden, z.B. Synchronize(UpdateCaption); und UpdateCaption könnte folgendermaßen aussehen: procedure myThread.UpdateCaption; begin Form1.Caption := 'Aktualisiert in einem Thread'; end; } { myThread } procedure myThread.Execute; var wb : TWebBrowser; begin OleInitialize(nil); wb := TWebBrowser.Create(Form1); try TWinControl(wb).Name := 'MyWebBrowser'; TWinControl(wb).Parent := Form1; wb.OnDocumentComplete := self.Submit; wb.Align := alClient; wb.Navigate('http://www.google.com'); while wb.ReadyState <> READYSTATE_COMPLETE do app.ProcessMessages; Synchronize(UpdateCaption); except FreeAndNil(wb); OleUninitialize; end; end; procedure myThread.UpdateCaption; begin Form1.Caption := 'Aktualisiert in einem Thread'; end; procedure myThread.Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin showmessage('test'); end; end. HauptUnit
Code:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls, Unit2; type TForm1 = class(TForm) procedure FormShow(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var myTestThread : myThread; begin myTestThread := myThread.Create(True); WITH myTestThread DO BEGIN myTestThread.app := Application; FreeOnTerminate := True; Resume; END; END; end. mfg emploi |
Re: TWebBrowser < undefinierter Bezeichner
hallo,
danke für deine mühe =), nun bin ich schon ein ganzes stück weiter dank deiner hilfe, leider gibts noch immer zugriffsverletzungen =( die threads werden in der hauptform nun wie folgt erzeugt:
Delphi-Quellcode:
die thread unit hab ich wie folgt geändert:
for Loop := 0 to length(ThreadArray) - 1 do
begin ThreadArray[Loop] := TMyThreads.Create(true); ThreadArray[Loop].app := Application; ... end;
Delphi-Quellcode:
Wenn ich den Form-Submit auskommentiere erhalte ich die Fehlermeldung:
procedure TMyThreads.Execute;
var WebBrowser: TWebBrowser; begin OleInitialize(nil); WebBrowser:= TWebBrowser.Create(nil); with WebBrowser do try OnDocumentComplete:= Submit; Navigate('http://www.google.com'); while WebBrowser.ReadyState <> READYSTATE_COMPLETE do app.ProcessMessages; Fstatus:= 'ReadyState done.'; Synchronize(UpdateLVCaption); except FreeAndNil(WebBrowser); OleUninitialize; end; Fstatus:= 'finished.'; Synchronize(UpdateLVCaption); end; procedure TMyThreads.Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin Fstatus:= 'sending.'; Synchronize(UpdateLVCaption); // (Sender As TWebBrowser).OleObject.document.forms.item(0).elements.item('q').value:='test'; // (Sender As TWebBrowser).OleObject.Document.Forms.item(0).submit; FreeAndNil(Sender); OleUninitialize; end; Zitat:
gibt es ebenfall eine Zugriffsverletzung. Zumindesten funktioniert das OnDocumentComplete Event jetzt. Des öfteren scheint es auch vorzukommen dass das Programm bzw der/die Threads in der ReadyState - while Schleife einfrieren. Hast Du vielleicht noch eine Idee wie man diese Fehler beheben könnte? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 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