Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Funktionen als Felder einer Klasse (https://www.delphipraxis.net/193832-funktionen-als-felder-einer-klasse.html)

Benmik 13. Sep 2017 16:43

Funktionen als Felder einer Klasse
 
Folgendes Szenario:
Delphi-Quellcode:
type
  TFunk = function(Wert:integer):string;

TIstwas = class(TObject)
  FZahlZuText:@TFunk;
end;

TMachwasListe = class(TObjectList<TIstwas>)
end;

procedure TuWas;
var Istwas:TIstwas;Text:string;
begin
  ...
  Istwas := TIstwas.Create;
  Istwas.FZahlZuText := @Funkt;
  MachwasListe.Add(Istwas);
  Text := MachwasListe[0].FZahlZuText(5);
end;

function Funkt(Wert:integer):string;
begin
  Result := IntToStr(Wert);
end;
Das funktioniert einfach nicht, weil der Parameter nicht an die Funktion weitergegeben wird. Ich habe alles Mögliche probiert, unter anderem "of object" (Methodenzeiger?). Der Parameter funktioniert nicht oder es gibt eine Zugriffsverletzung, wenn "Result" in der Funktion zugewiesen wird.
Was funktioniert, ist
Delphi-Quellcode:
procedure Funkt(const Wert:integer;var Result:string
, aber auch nur in der const/var Kombination. Ich bin mir sicher, dass den alten Hasen das alles klar ist, kann mir einer das mal erklären?

Olli73 13. Sep 2017 17:07

AW: Funktionen als Felder einer Klasse
 
Lass mal die beiden "@" weg...

himitsu 13. Sep 2017 17:31

AW: Funktionen als Felder einer Klasse
 
Pointer-Typen werden nicht mit @ deklariert, sondern mit ^

Und
Zitat:

Delphi-Quellcode:
Istwas.FZahlZuText := @Funkt;

...

function Funkt(Wert:integer):string;
begin
  Result := IntToStr(Wert);
end;

Du kannst nur etwas verwenden, was "vor" der Verwendungsstelle bekannt ist.
Also
Delphi-Quellcode:
function Funkt
muß darüber oder es muß darüber wenigstens eine Forward-Deklaration dafür geben.

Benmik 13. Sep 2017 17:42

AW: Funktionen als Felder einer Klasse
 
Jetzt funktioniert es natürlich. Vielen Dank euch beiden.
Warum funktioniert eigentlich die Prozedur mit dem var-Parameter?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz