![]() |
callback funktion bringt fehler
hallo zusammen,
nachdem mir in einem anderen Tread empfohlen wurde zur Lösung des dortigen Problems eine callback-funtion zu verwenden, und ich keine Ahnung davon hatte, hab ich zum besseren Verständnis und nach Vorlage aus einem alten dephi2 -Buch ;-)mal versucht so eine Funktion zu erstellen. Hier soll einfach beim button-klick der übergebene String "hallo Welt" in eine Listbox eingetragen werden. Leider bekomme ich bem Kompilieren den Fehler:
Delphi-Quellcode:
was mache ich falsch?
mainform.pas(35,41) Error: Wrong number of parameters specified for call to "MyCallback"
hier der quelltext:
Delphi-Quellcode:
die zweite unit:
unit mainform;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, testklasse; type { TForm1 } TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } function MyCallback(s:String) : integer; stdcall ; testklasse: Ttestklasse; end; var Form1: TForm1; implementation procedure TForm1.Button1Click(Sender: TObject); begin testklasse:= Ttestklasse.create(self); testklasse.GetWert(self.MyCallback); testklasse.free; end; function TForm1.MyCallback(s:String) : integer; stdcall; begin self.listbox1.items.add(s); end; initialization {$I mainform.lrs} end.
Delphi-Quellcode:
unit testklasse;
{$mode objfpc}{$H+} interface uses Classes, SysUtils; Type TTestCallback = function(s:string): integer; Type Ttestklasse = class(TPersistent) public constructor Create(AOwner:TPersistent); published Destructor Destroy; override; procedure GetWert(TestCallback:TTestCallback); end; implementation {@********************************************************} { constructor Ttestklasse } { } { } {********************************************************@} constructor Ttestklasse.Create(AOwner:TPersistent); begin inherited Create; // extra wichtig, denn sonst kein Event; // do noch nix end; {@********************************************************} { destructor Ttestklasse } { } { } {********************************************************@} destructor Ttestklasse.Destroy; begin // do noch nix // Always call the parent destructor after running your own code inherited; end; procedure Ttestklasse.GetWert(TestCallback:TTestCallback); begin TestCallback('hallo Welt'); end; end. |
Re: callback funktion bringt fehler
1. TTestCallback ist ein Funktionszeiger, kein Methodenzeiger. Nimm also entweder dein MyCallback aus der Klasse heraus oder verwandle TTestCallback mit der of-object-Klausel in einen Methodenzeiger.
2. Die Aufrufkonvention ist falsch. Bei MyCallback hast du stdcall genommen, bei TTestCallback Register (oder wie auch immer das bei FreePascal heißt). 3. Was soll dieses Rumgemurkse in TTestKlasse? Warum leitest du von TPersistent ab, warum führst du einen Konstruktor ein und überschreibst den Destruktor? Warum published? Weißt du überhaupt, was du tust? Der Hinweis "extra wichtig, sonst kein Event" ist übrigens unzutreffend. 4. FreePascal verlangt im Gegensatz zu Delphi ein @ bei der Ermittlung eines Methodenzeigers; das müsste also @self.MyCallback heißen. |
Re: callback funktion bringt fehler
Zitat:
den constructor und destructor hab ich einfach mal aus einem anderen konstruct stehen lassen, ich dachte da der eh nix macht ists wurscht ;-) und für den Versuch ist es doch auch egal von was die klasse abgeleitet ist, oder ? Gruss KH |
Re: callback funktion bringt fehler
Natürlich. Allerdings brauchst du in diesem Experiment keine Klasse. Du kannst GetWert auch zu einer normalen Routine machen.
|
Re: callback funktion bringt fehler
|
Re: callback funktion bringt fehler
Zitat:
ich habe jetzt so wie lazarus es verlangt nach testklasse.GetWert(@self.MyCallback); geändert. jetzt bekomme ich folgenden Fehler: mainform.pas(35,42) Error: Incompatible type for arg no. 1: Got "<procedure variable type of function(AnsiString):LongInt of object;Register>", expected "<procedure variable type of function(AnsiString):LongInt;Register>" |
Re: callback funktion bringt fehler
Zitat:
ich wollte das Ganze einfach zuvor mal ausprobieren, bevor ich im Projekt "rumpfusche" ;-) |
Re: callback funktion bringt fehler
Siehe Punkt 1 und 2 von #2.
|
Re: callback funktion bringt fehler
Zitat:
Gruss KH |
Re: callback funktion bringt fehler
Wenn du schon mit Klassen arbeitest, dann würde ich Ereignisse nehmen und keine Callbacks.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr. |
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