Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Lazarus] Method fingerprint als type

Pagina: 1
Acties:
  • 124 views sinds 30-01-2008
  • Reageer

  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 01-11 14:53
Ik ben voor een opdracht bezig op applicatie te maken mbv Lazarus, maar hierbij stuit ik op rare problemen die lijken te worden veroorzaakt door de Free Pascal compiler. Het gaat om de volgende code:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
TOnSomething = procedure(Sender: TObject; Item: TObject) of Object;

procedure TForm1.Button1Click(Sender: TObject);
var
  FEvent: TOnSomething;
begin
  FEvent := AddEvent;
end;

procedure TForm1.AddEvent(Sender: TObject; Item: TObject);
begin
  ShowMessage('Add');
end;   


De "FEvent := AddEvent" toekenning genereert deze foutmelding: Wrong number of parameters specified. De compiler schijnt niet door te hebben dat deze toekenning gaat over het opslaan van een referentie ipv het resultaat van de functie aanroep.
Deze code werkt bijvoorbeeld wel in Delphi, maar FP compiler wil het maar niet slikken. Heeft iemand een idee hoe dit probleem verholpen kan worden?

[ Voor 11% gewijzigd door AquilaDus op 02-10-2006 18:09 ]


Verwijderd

Klinkt als een foutje in Free Pascal, maar 't is dan ook niet gebruikelijk om een procedure/function of object (dat wat ze in C# een delegate noemen) als locale variabele van een procedure te declareren...
Declareer FEvent 's als een private member van TForm1?

  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01 18:01

Ivo

En als je nu de pointer naar AddEvent toekent aan FEvent?
Delphi:
1
FEvent := @AddEvent

  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 01-11 14:53
Verwijderd schreef op maandag 02 oktober 2006 @ 18:44:
Klinkt als een foutje in Free Pascal, maar 't is dan ook niet gebruikelijk om een procedure/function of object (dat wat ze in C# een delegate noemen) als locale variabele van een procedure te declareren...
Declareer FEvent 's als een private member van TForm1?
Het voorbeeld wat ik geef is ook niet de toepassing zoals ik hem wil gebruiken. Ik wil hem eigenlijk in een lijst wegschrijven die dan objecten van het type TOnSomething bevatten. Hierbij kreeg ik namelijk dezelfde error. Ik heb toen die lokale variable gemaakt om het probleem te achterhalen. Maar zelfs als ik de declaratie van deze variabele verplaats naar de klasse definitie blijft hij de error geven.

Verwijderd

Ivo, dan pikt Delphi 't niet meer: "Variable required"... ;)

  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01 18:01

Ivo

Verwijderd schreef op maandag 02 oktober 2006 @ 18:52:
Ivo, dan pikt Delphi 't niet meer: "Variable required"... ;)
Ah, met Freepascal werkt het:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program test;

type
  TFunc = procedure();

procedure proc();
begin
  writeln('test');
end;

var
  f: TFunc;

begin
  f := @proc;
  f();
end.

  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 01-11 14:53
Ivo schreef op maandag 02 oktober 2006 @ 18:50:
En als je nu de pointer naar AddEvent toekent aan FEvent?
Delphi:
1
FEvent := @AddEvent
Geweldig. Mijn held voor vandaag. Dit werkt. Alleen apart dat Delphi dit niet nodig heeft.

  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 01-11 14:53
Verwijderd schreef op maandag 02 oktober 2006 @ 18:52:
Ivo, dan pikt Delphi 't niet meer: "Variable required"... ;)
Dat is niet zo'n ramp voor mijn doel.

Verwijderd

Ivo schreef op maandag 02 oktober 2006 @ 18:55:
Ah, met Freepascal werkt het:
Dat werkt in Delphi ook prima hoor, maar jouw TFunc is geen procedure of object...

Maar ja, als 't in FP wel werkt is 't probleem opgelost. En hebben Florian en z'n mensen weer iets om op te lossen. Blijkbaar is FP dus toch niet zo Delphi-compatibel als ze willen. :)

Verwijderd

Verwijderd schreef op maandag 02 oktober 2006 @ 18:52:
Ivo, dan pikt Delphi 't niet meer: "Variable required"... ;)
en: FEvent := pointer(AddEvent) ??

of maak er een property ( Event) van, misschien dat ie de code dan wel goed herkend ?

en btw, waarom nog lazarus?
we hebben nu delphi explorer:
www.turboexplorer.com

[ Voor 29% gewijzigd door Verwijderd op 02-10-2006 19:48 ]


Verwijderd

Verwijderd schreef op maandag 02 oktober 2006 @ 19:37:
en: FEvent := pointer(AddEvent) ??
Dan krijg je ongeveer de foutmelding die AquilaDus eerst kreeg: "Not enough actual parameters".
of maak er een property ( Event) van, misschien dat ie de code dan wel goed herkend ?
Dat gaat ongetwijfeld probleemloos werken, anders was FP nooit zo Delphi 5 compatibel geworden als 't nu is (de VCL staat stijf van de TNotifyEvents). Maar AquilaDus wil die events toevoegen aan een lijst, waarschijnlijk vergelijkbaar met de manier waarop je in C#/java delegates/listeners kunt toevoegen?

In Delphi is dat prima te doen (al is 't gebruikelijker dat de delegate een pointer naar de vorige delegate bewaart en die dan aanroept nadat 'ie zelf klaar is), en in FP kan 't zo te zien ook, maar syntactisch dus net even anders.
en btw, waarom nog lazarus?
we hebben nu delphi explorer:
www.turboexplorer.com
Lazarus en Free Pascal zijn open source. Turbo Delphi is wel gratis, maar is time limited (al vind ik die limiet van 10 jaar geen ramp ;)), en je krijgt niet de source van de gebruikte libraries, etc.

  • mariusdustbin
  • Registratie: April 2003
  • Laatst online: 13-11 18:57
Verwijderd schreef op maandag 02 oktober 2006 @ 18:44:
Klinkt als een foutje in Free Pascal, maar 't is dan ook niet gebruikelijk om een procedure/function of object (dat wat ze in C# een delegate noemen) als locale variabele van een procedure te declareren...
Declareer FEvent 's als een private member van TForm1?
Een late reactie, maat het is te op te lossen door de delphi compatible mode te zetten. dit doe je door in plaats van {$mode objfpc}{$H+} {$mode delphi}{$H+} te gebruiken. Lost direct een paar andere problemen op.
Pagina: 1