Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - [Konsolenanwendung] Problem mit TNotifyEvent


Jukka - Mo 04.12.06 18:11
Titel: [Konsolenanwendung] Problem mit TNotifyEvent
Hallo

Ich habe eine Konsolenanwendung in der ich einen WebBrowser erzeug. Dieser navigiert auf eine Seite und soll dann ganz einfach den Quelltext speichern.

Ich habe das OnDownloadComplete (bzw OnDocumentComplete) Event genutzt, die prozedur dafür geschrieben und es dem Browser (nach Create) zugewiesen. Jedoch hab eich nun diesen Fehler:

Zitat:
[Fehler] Project1.dpr(24): Inkompatible Typen: 'TWebBrowserDocumentComplete' und 'procedure, untyped pointer or untyped parameter' <- Bei OnDocumentComplete

oder:

[Fehler] Project1.dpr(24): Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter' <- Bei OnDownlaodComplete



Der Code ist folgendermaßen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
program Project1;

{$APPTYPE CONSOLE}
uses
  SysUtils, ShDocVw, OleCtrls, Classes;

var
  Browser: TWebBrowser;

procedure BrowserDocumentComplete(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Text := Browser.OleObject.Document.Body.InnerHTML;
  sl.SaveToFile(paramstr(0)+'test.html');
  sl.Free;
end;

BEGIN
  WriteLn('Starte Test...');
  try
    Browser := TWebBrowser.Create(nil);
    Browser.OnDocumentComplete := BrowserDocumentComplete(Browser);
    Browser.Navigate('http://www.google.de');
  except
    WriteLn(' -> Test fehlgeschlagen');
    readln;
    exit;
  end;
  WriteLn(' -> Test erfolgreich!');
  readln;
end.



Hab ich einen grundsetzlichen Fehelr das das in Konsolen icht geht oder spinnt da was?


Ju


Xion - Mo 04.12.06 18:13

hi

Delphi-Quelltext
1:
  Browser.OnDocumentComplete := BrowserDocumentComplete;                    

ohne dem Parameter, den tut er automatisch dazu


Jukka - Mo 04.12.06 18:18

Tat ich bereits da kam dieser Fehler:

Zitat:
[Fehler] Project1.dpr(24): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'


wulfskin - Mo 04.12.06 18:31

Hallo Jukka,

abgesehen davon, dass es die Lösung nicht sehr schön ist, glaube ich auch nicht, dass sie funktionieren würde, bzw. nur über Umwege.
Das Problem ist, dass die Methode zu keiner Klasse gehört. Das heisst, du müsstest eine Klasse erstellen und dann deren Methode dort zuweisen (mehr als umständlich).
Viel einfacher und schöner ist die Lösung mit Suche in: Delphi-Forum INTERNETREADFILE.

Gruß Hape!


Jukka - Mo 04.12.06 18:37

Hm ja aber das Problem ich das ich Das Programm als "SchnellProgramm" zum upload von Dateien auf meine Seite nutzen will (sogesehn ein 1-klick-hoster).

Nun das Problem ist, wäre es Windows allein würde ich ganz einfach eien anwendung machen, opendialog rein und fertig. Jedoch soll das programm auch unter Linux (debian konsole) lauffähig sein, sprich durch eingabe eines komandos, und der Upload läuft über formular


wulfskin - Mo 04.12.06 18:40

user profile iconJukka hat folgendes geschrieben:
Jedoch soll das programm auch unter Linux (debian konsole) lauffähig sein, sprich durch eingabe eines komandos, und der Upload läuft über formular
Und du glaubst, dass Programm läuft auf Linux, wenn du die TWebBrowser-Komponente benutzt? :shock:


Jukka - Mo 04.12.06 18:43

mit Wine schon, kenne programme die so arbeiten, nur halt in C geschreiben udn ich kann kein c


jakobwenzel - Mo 04.12.06 19:05

IMHO muss die Prozedur, die du dem Ereignis zuweist Teil einer Klasse sein.


Jukka - Mo 04.12.06 19:30

Danke, die zuweisung es Events geht jetzt jedoch ..


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
program Project1; 
{$APPTYPE CONSOLE} 
uses
  SysUtils, ShDocVw, OleCtrls, Classes; 

type
  TBrowserClass = class
    WebBrowser: TWebBrowser;
    procedure BrowserDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
  end;

var
  Browser: TBrowserClass;

procedure TBrowserClass.BrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var 
  sl: TStringList; 
begin
  sl := TStringList.Create;
  sl.Text := WebBrowser.OleObject.Document.Body.InnerHTML;
  sl.SaveToFile(paramstr(0)+'test.html'); 
  sl.Free; 
end

BEGIN
  WriteLn('Starte Test...');
  try
    with Browser.Create do begin
      WebBrowser.OnDocumentComplete := BrowserDocumentComplete;
      WebBrowser.Navigate('http://www.google.de');
    end;
  except
    WriteLn(' -> Test fehlgeschlagen');
    readln;
    exit;
  end;
  WriteLn(' -> Test erfolgreich!'); 
  readln;
end.


DAs erzeugt einen Fehler: (auch ohne with, bei bversuchen ohne try)
Zitat:
---------------------------
Project1.exe - Fehler in Anwendung
---------------------------
Die Anweisung in "0x00403b42" verweist auf Speicher in "0xfffffffc". Der Vorgang

"read" konnte nicht auf dem Speicher durchgeführt werden.


Klicken Sie auf "OK", um das Programm zu beenden.
Klicken Sie auf "Abbrechen", um das Programm zu debuggen.
---------------------------
OK Abbrechen
---------------------------



Kann es vielleicht sein das der WebBrowser in eienr Konsolenanwendung nicht erzeugt werden kann?


Narses - Mo 04.12.06 21:26

Moin!

Du hast in einer Konsole keinen MessageLoop :mahn:, das mit den Events wird also nix. :?

Wenn du doch das Prog eh unter Wine laufen lassen willst, kannst du auch gleich eine Formular-Anwendung draus machen, oder... ? :roll: ;)

cu
Narses


Jukka - Mo 04.12.06 21:30

Gibt wine denn unter debian was unter putty gesteuert wird denn ein bild zurück? Denn meines wissens habe ich soetwas nochnet gesehn, bzw ein interface womit man das direkt steruen kann


wulfskin - Mo 04.12.06 22:13

Hallo,

warum nimmst du nicht gleich ein Linux Programm und bastelst dir ein Script dafür zusammen. Es gibt ein gutes Konsolenprogramm für Debian, hab aber gerade den Namen vergessen. Ich frag morgen mal meinen Freund und geb dir bescheid.

Aber könntest du nochmal genau beschreiben, was du eigentlich machen willst? Dieses Gefrimmel hier muss ja nicht sein, ich wette, wir finden was für dich ohne diese ganzen Umwege!

Zur Not kannst du die Lösung von mir oben nehmen, die geht sicherlich auch problemlos mit wine, ist aber auch nicht sehr schön!

Gruß Hape!


Jukka - Mo 04.12.06 22:18

Ich habe nehmen wir mal an eine InternetSeite, Da steht ein Textfeld und ein SubmitButton. In das Feld soll halt eien Datei eingetragen werden die auf dem PC/Server was auch imemr ist. Und die wird dann hochgeladen udn gibt den link aus.


NEhmen wir mal ein beispiel:

Ich hätte jetzt einen Root mit debian, und will der eine datei auf Rapidshare hochladen, da geht das aber nicht weil ich das nicht bedienen kann, kein Interface . Das programm soll das machen und dann den Downloadlink zurückgeben.

Geht das einfacher?


wulfskin - Mo 04.12.06 22:21

user profile iconJukka hat folgendes geschrieben:
Ich habe nehmen wir mal an eine InternetSeite, Da steht ein Textfeld und ein SubmitButton. In das Feld soll halt eien Datei eingetragen werden die auf dem PC/Server was auch imemr ist. Und die wird dann hochgeladen udn gibt den link aus.


NEhmen wir mal ein beispiel:

Ich hätte jetzt einen Root mit deian, und will dor eine datei auf Rapidshare hochladen, da geht das aber nicht weil ich das nicht bedienen kann weil ich kein Interface habe. Das programm doll das machen und dann den Downloadlink zurückgeben.

Geht das einfacher?
Geht das formatiert mit weniger Rechtschreibfehler?

Und warum muss das alles über einen extra Server gehen und nicht direkt?

Gruß Hape!


Jukka - Mo 04.12.06 22:25

Sorry wegen den Fehlern habs auch eben erst bemerkt.

Naja. Wenne s jetzt mehere GB wären und die sollen alle auf den 1-klick-Hoster und ich würde alles vom Root laden und dann mit einer DSL 1000 Leitung einzeln hochladen. Da würde das Programm/Script viel schneller gehen.