Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi bind arguments (https://www.delphipraxis.net/149016-bind-arguments.html)

hansmaad 12. Mär 2010 12:34


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:

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;
Die Frage ist nicht wie das Beispiel zu lösen ist, sondern ob Prinzipiell die Möglichkeit besteht Argumente an Funktionen zu binden.
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:

p80286 12. Mär 2010 16:40

Re: bind arguments
 
vielleicht hilft Dir dieses Beispiel weiter:

Delphi-Quellcode:
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;
Näheres findest Du in der Hilfe zu TList.sort
Gruß
K-H

hansmaad 14. Mär 2010 15:06

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.

Khabarakh 14. Mär 2010 19:49

Re: bind arguments
 
Zitat:

Zitat von hansmaad
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.

Du könntest natürlich wie die STL deine eigenen "Funktions"-Records schreiben - aber sicherlich nicht mit einer Delphi-Version, die keine Generics kennt. Dann könntest du auch gleich die neuen anonymen Methoden benutzen ;) .
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.

hansmaad 15. Mär 2010 09:02

Re: bind arguments
 
Zitat:

Zitat von Khabarakh
.. ist Delphi 5 sicherlich die falsche Wahl.

Ich kanns es mir in diesem Fall leider nicht aussuchen.
Ich hab nochdiesen Beitrag gefunden. Den dort verlinkten schweizer Code hatte ich auch schon gesehen, aber sofort abgelehnt. Es scheint wohl keine sinnvolle Lösung zu geben.. :|


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