Zuweisen von Event klappt nicht

Für Fragen rund um die Ide und zum Debugger
Antworten
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Zuweisen von Event klappt nicht

Beitrag von Targion »

Hallo.
Ich arbeite mit den Synapse-Komponenten, um eine Datei aus dem Internet herunterzuladen usw.
Mit folgendem Code weise ich der Komponente ein Event zu:

Code: Alles auswählen

HTTP.Sock.OnStatus:=SockCallBack;
SockCallBack ist so definiert:

Code: Alles auswählen

procedure SockCallBack (Sender: TObject; Reason:   THookSocketReason; const  Value: string);

Code: Alles auswählen

unit1.pas(656,33) Error: Wrong number of parameters specified for call to "SockCallBack"
Was mache ich falsch? Ich habe das Ereignis überprüft, die Parameter stimmen.
Zuletzt geändert von Targion am Do 7. Feb 2008, 20:15, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Wenn du im objfpc Mode bist, musst du
HTTP.Sock.OnStatus:=@SockCallBack;
schreiben, sonst Delphi Modus in der IDE einschalten oder im Code {$mode objfpc} mit {$mode delphi} ersetzen.

Den Rest dazu liest du hier: http://synapse.ararat.cz/doku.php/public:howto:onstatus" onclick="window.open(this.href);return false;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Ja, das Dokument kannte ich vorher schon.
Wenn ich in den "Delphi-Modus" schalte oder @SockCallBack benutze bekomme ich jetzt jedoch folgende Meldung:

Code: Alles auswählen

unit1.pas(656,21) Error: Incompatible types: got "TForm1.SockCallBack(TObject, THookSocketReason,const AnsiString)" expected "<procedure variable type of procedure(TObject, THookSocketReason,const AnsiString) of object;Register>"
So eine Meldung hatte ich noch nie...

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Wie sieht denn dein Code aus?

Folgender Test klappt;

procedure TForm1.Button1Click(Sender: TObject);
var sock: TTCPBlockSocket;
begin
sock:= TTCPBlockSocket.create;
sock.OnStatus:=@HookSock;
sock.free;
end;

procedure TForm1.HookSock(Sender: TObject; Reason: THookSocketReason;
const Value: string);
begin
//
end;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Hmm. Dein Code funktioniert (In genau dieser Form) auch nicht. Das muss also mit den Typn zusammenhängen. Dies steht bei mir als Deklaration oben:

Code: Alles auswählen

type
 
    THookSocketReason = (
    HR_ResolvingBegin,
    HR_ResolvingEnd,
    HR_SocketCreate,
    HR_SocketClose,
    HR_Bind,
    HR_Connect,
    HR_CanRead,
    HR_CanWrite,
    HR_Listen,
    HR_Accept,
    HR_ReadCount,
    HR_WriteCount,
    HR_Wait,
    HR_Error
    );
 
    THookSocketStatus = procedure(Sender: TObject; Reason: THookSocketReason;
    const Value: string) of object;
 
  { TForm1 }
 
  TForm1 = class(TForm)
[...]
Hoffentlich ist da ein Fehler drin... Sonst weis ich nicht, wo ich noch suchen könnte. :roll: :oops:

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Du musst doch das Zeug nicht nochmal definieren, das ist doch in blcksock schon gemacht. Aber anwenden solltest du's. Lies mal was über Objectpascal.

Code: Alles auswählen

TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    procedure HookSock(Sender: TObject; Reason: THookSocketReason;
      const Value: string);
  end;
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var sock: TTCPBlockSocket;
begin
sock:= TTCPBlockSocket.create;
sock.OnStatus:=@HookSock;
sock.free;
end;
 
procedure TForm1.HookSock(Sender: TObject; Reason: THookSocketReason;
const Value: string);
begin
//
end;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

:roll: Och ne! Dass das Zeug in blcksock nochmal drin ist, hätte ich eigentlich wissen müssen... Aber ich habe das event nach der von dir verlinkten Seite erstellt, da stand nichts von blcksort... Klar, dass die Typen nicht passten. Danke für die Hilfe (und dass du nicht die Nerven verloren hast)
Ab in die Versenkung mit dem Thread :wink:

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

theo hat geschrieben:Wenn du im objfpc Mode bist, musst du
HTTP.Sock.OnStatus:=@SockCallBack;
schreiben, sonst Delphi Modus in der IDE einschalten oder im Code {$mode objfpc} mit {$mode delphi} ersetzen.
Sind bei der Verwendung von {$mode delphi} irgendwelche Probleme zu erwarten, oder darf man das ruhig standardmäßig machen ?

-Michael

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

mschnell hat geschrieben:Sind bei der Verwendung von {$mode delphi} irgendwelche Probleme zu erwarten, oder darf man das ruhig standardmäßig machen ?
Kann ich nicht genau sagen, da ich nicht genau weiss, was alles davon betroffen ist.
Im Allgemeinen denke ich aber, dass es kein Problem sein sollte.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Es ist aber unschön, weil man sich damit wieder selbst ein Bein stellen kann. Der Mode Delphi erlaubt nämlich einige Sachen die der compiler durchaus falsch auslegen kann und dann suchst du dir nen wolf nach nem Bug der eigentlich gar nicht da ist.

Wenn du probleme hast, ein Event zu deklarieren lass es die CodeTools für dich machen.

Schreib einfach

MeineKomponente.OnIrgendwas := < und drück dann hier Strg+Umschalt+C

Damit wird das Event komplett richtig deklariert und reingesprungen und du musst dir nicht mehr den Kopf zerbrechen wie man Events richtig deklariert :p.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Manche wollen Sourcode schreiben, der sich sowohl mit Lazarus als auch mit Delphi kompilieren lässt....
-Michael

Antworten