Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Not enough acutal parameters beim Vergleich von Methodenzeigern (https://www.delphipraxis.net/187285-not-enough-acutal-parameters-beim-vergleich-von-methodenzeigern.html)

Rainer Wolff 16. Nov 2015 15:33

Delphi-Version: XE

Not enough acutal parameters beim Vergleich von Methodenzeigern
 
Ich steh grad auf der Leitung:

Ich habe verschiedene Sortierfunktionen, die ich einem Methodenzeiger zuweise und damit dann meine Generic List sortiere. Verschiedene Zuweisung ergibt auch verschiedene Sortierreihenfolgen, soweit sollte alles ok sein.
Wenn ich aber abfragen will, auf welche Funktion mein Zeiger zeigt, sagt mir der Compiler:
E2035 Not enough actual parameters.:roll:

Code:
function SortByName(const left, right: TTypinfoTreeview):Integer; // Analog dazu SortByNameDesc
begin
  if left.Modell>right.Modell then
    Result:=1
  else if left.Modell=right.Modell then
    Result:=0
  else
    Result:=-1;
end;

TTreeviewService = class(TinterfacedObject, ITypTreeViewInterface)
private
  ...
  fSortFunction: TComparison<TTypinfoTreeview>;
  ...
end;

procedure TTreeviewService.SortByModell;
begin
  if fSortFunction=SortByName then // Hier kommt E2035 not enough actual parameters
    fSortFunction:=SortbyNameDesc
  else
    fSortFunction:=SortbyName;
end;

TiGü 16. Nov 2015 16:21

AW: Not enough acutal parameters beim Vergleich von Methodenzeigern
 
Wenn du Zeiger vergleichen möchtest, dann vergleiche doch auch ruhig Zeiger. :-D

Delphi-Quellcode:
procedure TTreeviewService.SortByModell;
begin
  if @fSortFunction = @SortByName then // läuft!
    fSortFunction := SortbyNameDesc
  else
    fSortFunction := SortByName;
end;

Der schöne Günther 16. Nov 2015 16:42

AW: Not enough acutal parameters beim Vergleich von Methodenzeigern
 
Es kompiliert, aber das ist sicher nicht was er will. Das vergleicht doch nur die Adressen einer Variable mit der Adresse einer Routine im Code-Bereich deiner Anwendung.

Hast du das mal ausprobiert? Es müsste doch dann "Es sind die gleichen" ausgegeben werden, oder?

Delphi-Quellcode:
program Project5;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.Generics.Defaults;

function someComparison(const left, right: Integer): Integer;
begin
   Result := 42;
end;

var
   myComparison: TComparison<Integer>;
begin
   myComparison := someComparison;
   if (@myComparison = @someComparison) then
      WriteLn('Es sind die gleichen');
end.

TiGü 16. Nov 2015 17:15

AW: Not enough acutal parameters beim Vergleich von Methodenzeigern
 
Es kompiliert, mehr war doch nicht gefordert, oder? :twisted:

...ich gehe jetzt in die dunkle Ecke und schäme mich...
:|

Stevie 16. Nov 2015 17:34

AW: Not enough acutal parameters beim Vergleich von Methodenzeigern
 
Das wird so nicht funktionieren. Außerdem nehme ich an, dass TComparison<TTypinfoTreeview>; aus Generics.Defaults stammt und somit kein Methodenzeiger ist sondern eine anonyme Methode. Und die kann man sowieso nicht so einfach auf den Pointer einer Funktion überprüfen, da sie niemalsnich gleich sein werden.

Wenn du zwischen auf- und absteigender Sortierung wechseln willst, dann würd ich vorschlagen, das Ergebnis der Compare Methode mit 1/-1 zu multiplizieren und schon hast du den Wechsel.

Rainer Wolff 16. Nov 2015 17:53

AW: Not enough acutal parameters beim Vergleich von Methodenzeigern
 
Zitat:

Zitat von Stevie (Beitrag 1321599)
Das wird so nicht funktionieren. Außerdem nehme ich an, dass TComparison<TTypinfoTreeview>; aus Generics.Defaults stammt und somit kein Methodenzeiger ist sondern eine anonyme Methode. Und die kann man sowieso nicht so einfach auf den Pointer einer Funktion überprüfen, da sie niemalsnich gleich sein werden.

Richtig, TComparison kommt aus Generics.Defaults.
Zitat:

Zitat von Stevie (Beitrag 1321599)
Wenn du zwischen auf- und absteigender Sortierung wechseln willst, dann würd ich vorschlagen, das Ergebnis der Compare Methode mit 1/-1 zu multiplizieren und schon hast du den Wechsel.

Leider will ich nicht nur auf- und absteigend, sondern auch nach verschiedenen Feldern sortieren.

Eine nicht so elegante Lösung, die mir hier einfallen würde, wäre dann eine zusätzliche Variable, die die Sortierreihenfolge enthält.
Oder wie kann ich den Vergleich sonst vielleicht machen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 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