TTreeNodeCompare - Function of object

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

TTreeNodeCompare - Function of object

Beitrag von Eclipticon »

Hi,

ich hab meine eigene Funktion mit der Signature von TTreeNodeCompare geschrieben, die wie folgt definiert ist:

Code: Alles auswählen

type TTreeNodeCompare = function(
  Node1: TTreeNode;
  Node2: TTreeNode
):Integer of object;
Wenn ich die aber in einem TTreeNode.CustomSort() uebergebe, mault der Compiler immer, dass ich die falsche Anzahl von Parametern fuer meine Funktion angegeben haette ... wie mach ich das richtig?

Bedeutet "function of object" eigentlich dass die Funktion eine Methode sein muss? Ich hab' das Problem sowohl, wenn ich sie als methode als auch als globale Funktion verwende ...

Danke!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TTreeNodeCompare - Function of object

Beitrag von m.fuchs »

Eclipticon hat geschrieben:Wenn ich die aber in einem TTreeNode.CustomSort() uebergebe, mault der Compiler immer, dass ich die falsche Anzahl von Parametern fuer meine Funktion angegeben haette ... wie mach ich das richtig?
Nun, dazu müsste man wissen, wie du es jetzt machst. Warum hast du deine Methode oder wenigstens den Kopf nicht mal mit angegeben?
Eclipticon hat geschrieben:Bedeutet "function of object" eigentlich dass die Funktion eine Methode sein muss?
Ja.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: TTreeNodeCompare - Function of object

Beitrag von Eclipticon »

m.fuchs hat geschrieben:
Eclipticon hat geschrieben:Wenn ich die aber in einem TTreeNode.CustomSort() uebergebe, mault der Compiler immer, dass ich die falsche Anzahl von Parametern fuer meine Funktion angegeben haette ... wie mach ich das richtig?
Nun, dazu müsste man wissen, wie du es jetzt machst. Warum hast du deine Methode oder wenigstens den Kopf nicht mal mit angegeben?
Weil der "Absenden"-Button so leicht in Versuchung fuehrt ;-)

Code: Alles auswählen

TSomeObject = class(TObject)
  public
     function MyTreeNodeCompare(Node1, Node2: TTreeNode): integer;
  end;
 
  // ...
 
  SomeObject := TSomeObject.Create;
  MyTreeView.Items.FindTopLvlNode('Lazarus').CustomSort(SomeObject.MyTreeNodeCompare); // Compilerfehler hier
m.fuchs hat geschrieben:
Eclipticon hat geschrieben:Bedeutet "function of object" eigentlich dass die Funktion eine Methode sein muss?
Ja.
Und das hat welchen Grund/Vorteil, dass das so deklariert ist?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TTreeNodeCompare - Function of object

Beitrag von m.fuchs »

Eclipticon hat geschrieben:

Code: Alles auswählen

MyTreeView.Items.FindTopLvlNode('Lazarus').CustomSort(SomeObject.MyTreeNodeCompare); // Compilerfehler hier
Änder das mal ab in:

Code: Alles auswählen

MyTreeView.Items.FindTopLvlNode('Lazarus').CustomSort(@SomeObject.MyTreeNodeCompare);
Dann wird auch der Methode CustomSort ein Parameter übergeben, der ein Zeiger auf die von dir erstellte Methode ist.
Dein Aufruf bedeutet, dass deine Methode aufgerufen und ihr Ergebnis(!) an CustomSort werden soll. Das funktioniert aber schon deshalb nicht, weil deine Methode ja Parameter braucht. Abgesehen davon, dass das nicht das ist was du möchtest.

Eclipticon hat geschrieben:
m.fuchs hat geschrieben:
Eclipticon hat geschrieben:Bedeutet "function of object" eigentlich dass die Funktion eine Methode sein muss?
Ja.
Und das hat welchen Grund/Vorteil, dass das so deklariert ist?
Dass die Leute objektorientiert programmieren können. Da ging wohl der Entwickler davon aus, wer ObjectPascal benutzt wird keine einfachen Funktionen mehr schreiben, sondern eigene Klassen die die Sortiermethode enthalten.

mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: TTreeNodeCompare - Function of object

Beitrag von Scotty »

Ist es sinnvoll, die Sortierung einer Klasse anzuvertrauen? Wäre nicht eine einfache Funktion sinnvoller?

Code: Alles auswählen

type TSomeClass=...
 
function DoCompare(Node1, Node2: TTreeNode): integer; //keine Methode von TSomeClass
begin
  Result:=CompareValue(TSomeType(Node1.Data).Value,TSomeType(Node2.Data).Value);
end;
 
procedure TSomeClass.<irgendwas>
begin
  MyTreeView.Items.FindTopLvlNode('Lazarus').CustomSort(@DoCompare);
end;

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TTreeNodeCompare - Function of object

Beitrag von m.fuchs »

Scotty hat geschrieben:Ist es sinnvoll, die Sortierung einer Klasse anzuvertrauen?
Warum nicht?
Scotty hat geschrieben:Wäre nicht eine einfache Funktion sinnvoller?
Warum?

Es gibt durchaus Gründe die für die Methode einer Klasse sprechen:
  • Die LCL ist objektorientiert, warum soll man damit plötzlich brechen? (Ok, ist ein schwaches Argument).
  • Ich baue mir eine Klasse, in der ich mehrere Sortiermethoden zusammenfassen. Ähnlicher Code an einer Stelle vereint.
  • Ich habe ein größeres System mit Mulit-Culture-Fähigkeit. Es gibt eine Klasse TCulture mit einer abstrakten Methode DoCompare(Node1, Node2: TTreeNode): Integer;. Dann gibt es einige Abkömmlinge dieser Klasse (TGermanCulture, TEnglishCulture, TFrenchCulture, ...) die alle DoCompare unterschiedlich implementieren (sprachabhängig). Beim Programmstart wird (aus den Systemeinstellungen) eine der abgeleiteten Klassen erzeugt und dient als Sprach-/Kulturvorlage für das ganez Programm. Und natürlich wird auch die Sortierfunktion übergeben. Das wäre ohne Objektorientierung nicht so schön machbar.
  • ... (es gibt sicher noch viele andere Beispiele)
Natürlich würde es auch ohne Objektorientierung funktionieren. Aber dann würden sich auch wieder Leute beschweren, warum sie eine blöde Funktion statt einer Methode eines Objekts übergeben müssen.

Oder man hätte gleich eine überladene Funktion gebaut, die einmal eine @function und einmal eine @function of object akzeptiert. Aber warum die Mühe, eine Methode in einer Klasse ist doch genauso schnell erstellt wie eine herkömmliche Funktion.

Letztendlich ein Architektur-philosophisches Streitthema.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: TTreeNodeCompare - Function of object

Beitrag von Scotty »

m.fuchs hat geschrieben:Warum nicht?
Ich kenne ausschließlich Beispiele mit einfachen Funktionen (finde aber gerade keinen einzigen Beleg dafür :roll: ). Ansonsten sind die Vorteile einer Klasse offensichtlich, vielleicht ändere ich das bei mir auch dahingehend.

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: TTreeNodeCompare - Function of object

Beitrag von Eclipticon »

Thanks!

Antworten