Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - reference to procedure?


Christian213 - Fr 02.08.13 10:39
Titel: reference to procedure?
Hallo,

in Delphi ab 2009 scheint folgendes möglich:

Delphi-Quelltext
1:
type TNTDownLoadProgressCallBack = reference to procedure(Current, Total: Cardinal);                    

Das funzt in Lazarus (noch) nicht. Wo genau ist der Unterschied zu einer Typdefinition wie:

Delphi-Quelltext
1:
type TNTDownLoadProgressCallBack = procedure(Current, Total: Cardinal);                    

Und wie könnte man die o.g. Definition ohne "reference to" abbilden?

Danke :-)


Nersgatt - Fr 02.08.13 10:44

user profile iconChristian213 hat folgendes geschrieben Zum zitierten Posting springen:
Wo genau ist der Unterschied zu einer Typdefinition wie:


Das gibt an, dass es sich um eine anonyme procedure/function handelt.
Du könntest also in Delphi ein Function schreiben, die Dir nach Auswertung der Parameter jeweils verschiedene functions/procedures zurückgibt. Diese Rückgabetyp definiert man mit reference to
Wie Du das in Lazarus abbilden kannst, weiß ich leider nicht, da ich nicht mit Lazarus arbeite.


Christian213 - Fr 02.08.13 10:54

Hallo Jens,

Danke für die Antwort.
Funktionsdefintionen als Übergabeparameter benutze ich in Lazarus ja bereits, dort habe ich als Typedefinition dann einfach

Delphi-Quelltext
1:
type TMeineProcedur = procedure(A, B: Integer);                    

oder wie auch immer. Das funktioniert auch, solange der Variablentyp und die Anzahl bei der Zielfunktion passen.
Nur wo ist der Unterschied zu einer "anonymen Prozedur"? Kann ich das "reference of" evtl. einfach weglassen?


Nersgatt - Fr 02.08.13 11:42

Eine anonyme procedure kannst Du ohne Namen erstellen.

Das sähe ungefährt so aus:


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:
type Tproc = reference to procedure(A : Integer);

procedure TuWas;
var
  bla : Tproc;
begin

  if Aussentemperatur > 30°C then
  begin
    bla := procedure(A : Integer)
      begin
        MachwasmitA(A);
      end;
  end
  else 
  begin
    bla := procedure(A : integer)
      begin
        MasWasAnderesMitA(A);
      end;
  end;

  bla(42);
end;


Christian213 - Fr 02.08.13 12:24

Ok, dann kann ich in meinem konkreten Fall darauf wirklich verzichten.
Wunderbar, vielen Dank nochmal.


Martok - Fr 02.08.13 14:45

Lazarus hat dafür "is nested" als suffix (so wie "of object"), was es dir erlaubt, lokale Funktionen weiterzugeben.

Das ist quasi die Version, die etwas näher an der Sprache Pascal dran bleibt ;)