Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TWebbrowser für Speedtest in Console (https://www.delphipraxis.net/65630-twebbrowser-fuer-speedtest-console.html)

Harry M. 19. Mär 2006 02:42


TWebbrowser für Speedtest in Console
 
Ich möchte gerne eine kleines Progrämmchen machen welches über www.wieistmeineip.de einen Speedtest durchführt. Als "normale" VCL-Anwendung habe ich es zum laufen bekommen. Ich möchte aber das Tool als Console haben, und da fangen die problem an... :lol:

Dies habe ich bis jetzt an Code:

Delphi-Quellcode:
program SpeedTest;

{$APPTYPE CONSOLE}

uses
  OleCtrls, SHDocVw;

type
  TMyClass = class
    Browser: TWebBrowser;
  private
    { Private declarations }
    procedure WebBrowserDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);

  protected
   {...}
  public
    constructor Create; reintroduce;
    destructor Destroy; override;
  end;

constructor TMyClass.Create;
begin
  Browser := TWebBrowser.Create(nil);
  Browser.OnDocumentComplete := WebBrowserDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  Browser.Navigate('http://wieistmeineip.de/speedtest/run.php');
end;

destructor TMyClass.Destroy;
begin
  Browser.free;
  inherited destroy;
end;

procedure TMyClass.WebBrowserDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
begin
  // das 'writeln' ist nur testweise
  // der eigendliche Code wertet nach dem
  // 2. Durchlauf die Ergebnisse der SpeedTests aus
  // da beim 1. Durchlauf nur 'Test läuft' ankommt

  writeln('Document compled');
end;

begin
  TMyClass.Create;
end.
Jetzt stehe ich vor dem Problem, das ich dem Browser kein Ereignis zuweisen kann:
[Fehler] SpeedTest.dpr(26): Undefinierter Bezeichner: 'Sender'

Der Fehler tritt in dieser Zeile auf:

Delphi-Quellcode:
Browser.OnDocumentComplete := WebBrowserDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
Wo liegt mein Problem??

Harry M. 19. Mär 2006 05:27

Re: TWebbrowser für Speedtest in Console
 
Problem wiefolgt gelöst:
Delphi-Quellcode:
program SpeedTest2;

{$APPTYPE CONSOLE}

uses
  SysUtils, OleCtrls, SHDocVw, ActiveX;


type
  TClass = class(TWebBrowser)
    Browser: TWebbrowser;
    procedure WebBrowserDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);

  end;

procedure TClass.WebBrowserDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
begin
  // das 'writeln' ist nur testweise
  // der eigendliche Code wertet nach dem
  // 2. Durchlauf die Ergebnisse der SpeedTests aus
  // da beim 1. Durchlauf nur 'Test läuft' ankommt

  writeln('Document compled');
end;



begin          
  CoInitialize(nil);

  with TClass.Create(nil) do begin

    Browser := TWebBrowser.Create(nil);

    Browser.OnDocumentComplete := WebBrowserDocumentComplete;
    Browser.Navigate('http://wieistmeineip.de/speedtest/run.php');


    writeln('Taste drücken zum beenden...');
    readln;

    Browser.Free;
    end;

  OleUninitialize;
end.
Komischerweise wird WebBrowserDocumentComplete nicht durchlaufen... :gruebel: :wiejetzt:

Harry M. 19. Mär 2006 19:40

Re: TWebbrowser für Speedtest in Console
 
*husch-pusch*

marabu 19. Mär 2006 20:03

Re: TWebbrowser für Speedtest in Console
 
Hallo Harry,

in einer Konsolanwendung gelten andere Gesetze als in einer GUI-Anwendung. Ohne Nachrichtenschleife und ohne grafische Oberfläche kannst du mit TWebBrowser nicht allzuviel anfangen. Vielleicht geht es ja auch ohne:

Delphi-Quellcode:
program myip;

{$APPTYPE CONSOLE}

uses
  ActiveX,
  Classes,
  MSHTML,
  Windows,
  idHTTP,
  SysUtils;

const
  URL = 'http://www.wieistmeineip.de';

var
  s: TStream;
  doc: IHTMLDocument2;

{$I Proc.ProcessMessages.pas}
{$I Func.LoadDocument.pas}
{$I Func.UrlDownload.pas}

begin
  CoInitialize(nil);
  s := TMemoryStream.Create;
  if UrlDownload(URL, s) = 200 then
  begin
    doc := CoHTMLDocument.Create as IHTMLDocument2;
    if LoadDocument(doc, s) then
    begin
      WriteLn(Format('%s (%.0n)', [doc.title, 1.0 * s.Size]));
    end else WriteLn('LoadDocument() failed')
  end else WriteLn('UrlDownload() failed');
  s.Free;
end.
Die Include-Dateien kannst du dir hier besorgen.

Grüße vom marabu

Harry M. 20. Mär 2006 05:16

Re: TWebbrowser für Speedtest in Console
 
Hey marabu


Thx für die Mühe. Das löst zwar nicht ganz das Problem aber das Haptproblem.

Ich weiss jetzt das ich vom Server eine eindeutige ID bekomme mit welcher ich dann mit http://wieistmeineip.de/speedtest/show.php?+ID das Result abfragen kann kann. Der Rest läst sich regeln. Der Consolen-Webbrowser rennt ja jetzte.

"Consolen-WebBrowser" :wall: :wall: :wall: :mrgreen:

Hast Du vielleicht noch einen Tip woher weiß ich wie lange der Test dauert??

marabu 20. Mär 2006 06:02

Re: TWebbrowser für Speedtest in Console
 
Guten Morgen.

Der Test wird so lange dauern wie er dauert - es werden ja feste Datenmengen übertragen. Der Wechsel des URL von run.php nach ergebnis.php dürfte interessant sein.

marabu

Harry M. 20. Mär 2006 07:33

Re: TWebbrowser für Speedtest in Console
 
Morgen,

Das Problem stellt sich gegenwärtig so dar:

Hauptseite wird übertragen, ich bekomme meine ID danach endet das Programm.

Wenn ich jetzt die Sache mit dem TWebbrowser nachstelle und mir in ein Memo bei WebBrowserBeforeNavigate2
die URL mitloggen lasse komme ich halt auf das Ergebnis das zuerst die \run.php dann die \show.php+id
angesteut wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 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