Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebBrowser < undefinierter Bezeichner (https://www.delphipraxis.net/27500-twebbrowser-undefinierter-bezeichner.html)

Basic-Master 13. Aug 2004 17:06

Re: TWebBrowser < undefinierter Bezeichner
 
Delphi-Quellcode:
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;
sollte funktionieren

emploi 13. Aug 2004 17:08

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

endeffects 13. Aug 2004 17:46

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;

endeffects 13. Aug 2004 18:13

Re: TWebBrowser < undefinierter Bezeichner
 
möglicherweise endet die methode schon bevor
ondocumentcomplete ausgelöst wird

Basic-Master 13. Aug 2004 19:35

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]

emploi 13. Aug 2004 19:49

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:
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;
... und er das FreeAndNil eher aufruft bevor das Ereignis überhaupt auftreten kann!

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]

endeffects 13. Aug 2004 19:56

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

endeffects 14. Aug 2004 08:51

Re: TWebBrowser < undefinierter Bezeichner
 
Zitat:

auf showmessage würde ich mich nicht verlassen
na ich hab das vorher auch mit dem übergeben des status probiert,
dieser wird auch nicht angezeigt in meiner mainform:


Delphi-Quellcode:
procedure TMyThreads.Submit(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  Fstatus:= 'Submit() fired!';
  Synchronize(UpdateLVCaption);
end;
darüber hinaus hab ich auch noch andere Events ausprobiert,
immer mit dem selben Ergebnis :(

emploi 14. Aug 2004 13:10

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

endeffects 16. Aug 2004 11:20

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:
  for Loop := 0 to length(ThreadArray) - 1 do
  begin
    ThreadArray[Loop] := TMyThreads.Create(true);
    ThreadArray[Loop].app := Application;
    ...
  end;
die thread unit hab ich wie folgt geändert:

Delphi-Quellcode:
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;
Wenn ich den Form-Submit auskommentiere erhalte ich die Fehlermeldung:

Zitat:

Im Projekt ... ist eine Exception der Klasse EAccessViolation aufgetreten.
Meldung: Zugriffsverletzung bei Adresse 70AB7CCB in Modul SHLWAPI.dll.
Lesen von Adresse 00000018. ...
Wenn ich das OLE Objekt wieder aktiviere um es dann aus`zufüllen und abzuschicken
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.
Seite 3 von 4     123 4      

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