Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

endeffects 11. Aug 2004 14:10

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.

Basic-Master 11. Aug 2004 14:19

Re: TWebBrowser < undefinierter Bezeichner
 
ersetz das sleep(2000); durch
Delphi-Quellcode:
while wb.ReadyState <> READYSTATE_COMPLETE do
  Application.ProcessMessages;
mit sleep hälst du nur den prozess (mainthread) an, das hilft dir dann aber auch nix wenn die seite noch net geladen ist...

endeffects 11. Aug 2004 15:09

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;

endeffects 11. Aug 2004 17:05

Re: TWebBrowser < undefinierter Bezeichner
 
also ich hab nun nochmal ne ganze weile rumprobiert
und mittlerweile echt genervt von dem kram =(

Delphi-Quellcode:
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;
Der Aufruf von Application.ProcessMessages; funktioniert in
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.

shmia 11. Aug 2004 18:45

Re: TWebBrowser < undefinierter Bezeichner
 
Delphi-Quellcode:
var
  WebBrowser: TWebBrowser;
begin
  WebBrowser:= TWebBrowser.Create(nil);
  with WebBrowser do
     // irgendwas tun
  end;

  FreeAndNil(WebBrowser);
end;
Also ich würde auf keinen Fall das Objekt WebBrowser dynamisch zu Laufzeit erzeugen,
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.

endeffects 11. Aug 2004 19:04

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

Basic-Master 11. Aug 2004 21:35

Re: TWebBrowser < undefinierter Bezeichner
 
hab die funktion hier im forum gefunden, das könntest du dann statt Application.ProcessMessages; nehmen:
Delphi-Quellcode:
procedure ProcessMessages(hWnd: DWORD);
var
  Msg: TMsg;
begin
while PeekMessage(Msg, hWnd, 0, 0, PM_REMOVE) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
end;
end;
musst dann als parameter einfach Handle einsetzen..
hoffe konnte dir damit n bischen helfen :|

endeffects 11. Aug 2004 22:14

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?

emploi 13. Aug 2004 14:23

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:
WebBrowser1.OnDocumentComplete := meineProzedurWennFertigGeladen;
Und da schreibste dann rein was er machen soll!

greetz

emploi

endeffects 13. Aug 2004 16:04

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:

Inkompatible Typen: TwebBroswserDocumentComplete und procedure, untyped pointer
or untyped parameter.
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.
Seite 2 von 4     12 34      

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