![]() |
bind arguments
Hi,
es geht um das Sortieren einer Liste bzw. ganz allgemein um Funktions- /Methodenzeiger. Von der C++ STL ist man Funktionsobjekte von fast jedem Algorithmus gewöhnt und benutzt fleißig Funktionen wie binder1st, mem_fun oder tr1::bind. Nun suche ich vergeblich nach einer entsprechenden Funktionalität in Delphi. Ein Beispiel:
Delphi-Quellcode:
Die Frage ist nicht wie das Beispiel zu lösen ist, sondern ob Prinzipiell die Möglichkeit besteht Argumente an Funktionen zu binden.function MyCompare(asc:Boolean; lh, rh: Pointer): Integer; begin if asc then // so else // anders end; type MyCompareClass=class asc:Boolean; constructor Create(a:Boolean); function Compare(lh, rh:Pointer):Integer; end; procedure MyProc(); var L:TObjectList; C:MyCompareClass; begin L := TObjectList.Create(); // .... // binde false an MyCompare L.Sort(Bind(@MyCompare, false)); C := MyCompareClass.Create(false); // Binde Objektzeiger an Methode L.Sort(Bind(@MyCompareClass.Create, @C)); C.Free; L.Free; end; Besonders interresant wäre ein Objekt an eine Methode zu binden um diese als Vergleichsfunktion für Sort verwenden zu können. Danke&Gruß :hi: ps:Delphi 5 :roll: |
Re: bind arguments
vielleicht hilft Dir dieses Beispiel weiter:
Delphi-Quellcode:
Näheres findest Du in der Hilfe zu TList.sort
type
t_Sortliste=class(tlist) ...... function BaseSort(s1,s2:pointer):integer; var i : integer; begin result:=0; for i:=t_Sortrecord(s1^).slines.Count-1 downto 0 do if t_Sortrecord(s1^).slines[i]>t_Sortrecord(s2^).slines[i] then result:=1 else if t_Sortrecord(s1^).slines[i]<t_Sortrecord(s2^).slines[i] then result:=-1; end;{-- BaseSort ---------------------------} ..... procedure t_Sortliste.DatenSort; begin sort(BaseSort); end; Gruß K-H |
Re: bind arguments
Ich weiß wie tlist.sort funktioniert. Das war nicht die Frage.
Sort erwartet einen Zeiger auf eine Funktion der Signatur wie die von dir gezeigte BaseSort. Ich möchte aber eine Funktion mit andere Signatur, wie z.B. MyCompareClass.Compare aus meinem Beispiel verwenden. Dazu gibt es in C++ bspw. bind Funktionen die in diesem Falle einen Objektzeiger an die Methode binden und eine "Funktion" zurückgeben, die dann die passende Signatur hat. Ich möchte also aus einer Methode unter Verwendung eines Objektes eine Funktion machen, die ich als Vergleichsfunktion verwenden kann. Ob das ganze für Argumente beliebiger Art funktioniert können wir ja erstmal nicht weiter betrachten. |
Re: bind arguments
Zitat:
Ansonsten müsstest du wohl auf die Referenzzählung von Interfaces setzen, um einen Garbage Collector ersetzen zu können. Aber wenn du so funktional programmieren willst, ist Delphi 5 sicherlich die falsche Wahl. |
Re: bind arguments
Zitat:
Ich hab noch ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 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