Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TTreeView - in abgeleiteter Komponente OnCompare nutzen (https://www.delphipraxis.net/109365-ttreeview-abgeleiteter-komponente-oncompare-nutzen.html)

taaktaak 28. Feb 2008 20:38


TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Moin, Moin,

seit einigen Stunden bastle ich an einer Komponente, die von TTreeView abgeleitet ist. Hiermit wird das TreeView um ein StandardPopup erweitert, das zusätzliche Layout- und Sortierfunktionalitäten zur Verfügung stellt. Dank der Unterstützung von shmia ist nun auch das Verbinden von Komponenten-Popup und Anwendungs-Popup gelungen.

In der Testphase habe ich alle Funktionalitäten nicht in einer abgeleitete Komponente, sondern in einer normalen Unit programmiert und erst nachdem dort alles fehlerfrei ablief, alles in eine Komponente "gepackt". Dummerweise komme ich aber am letzten Punkt überhaupt nicht weiter:

Um eine auf- und absteigende Sortierung, wahlweise mit/ohne Berücksichtigung der Groß-/Kleinschreibung zu ermöglichen habe ich in der Testphase im OnCompare-Event folgenden Code hinterlegt (SortFlag=1 or -1 >> auf- oder absteigend sortieren):

Delphi-Quellcode:
procedure Tfo~~.TreeView1Compare(Sender:TObject;Node1,Node2:TTreeNode;
                                 Data:Integer;var Compare:Integer);
begin
  if CaseSensitiveSort then Compare:=CompareStr (Node1.Text,Node2.Text)*SortFlag
                       else Compare:=CompareText(Node1.Text,Node2.Text)*SortFlag;
end;
Und an diesem Punkt, diese zwei Zeilen in der abgeleiteten Komponente zu placieren, scheitere ich, kurz vor dem Ziel, kläglich! In TTreeView ist OnCompare als Property deklariert. In TCustomTreeView als Property vom Typ TTVCompareEvent. Ich habe schon die unmöglichsten Versuche gemacht, die obenstehenden zwei Zeilen in die abgeleiteten Komponente einzubauen - es ist mir nicht gelungen. Das ist doch bestimmt keine Hexerei, das hinzubekommen?!

:wall: Tja, nun benötige ich wieder 'mal Hilfestellung aus dem Forum - please help!

marabu 29. Feb 2008 07:04

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Moin Ralph,

du möchtest den Code für das Ereignis OnCompare() in deiner abgeleiteten Komponente fest verdrahten? Dann veröffentliche einfach die Property OnCompare nicht und besetze sie im Konstruktor mit deinem Code:

Delphi-Quellcode:
type
  TMyTreeView = class(TCustomTreeView)
  private
    CompareNodes(Sender:TObject; Node1, Node2: TTreeNode;
        Data: Integer; var Compare: Integer);
  published
    // ...
    property OnCollapsing;
    // property OnCompare;
    property OnContextPopup;
    // ...
  end;

constructor TMyTreeView.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FOnCompare := CompareNodes;
end;

procedure TMyTreeView.CompareNodes(Sender:TObject; Node1, Node2: TTreeNode;
    Data: Integer; var Compare: Integer);
begin
  if CaseSensitiveSort
    then Compare := AnsiCompareStr(Node1.Text, Node2.Text) * SortFlag
    else Compare := AnsiCompareText(Node1.Text, Node2.Text) * SortFlag;
end;
Getippt und nicht getestet.

Freundliche Grüße

taaktaak 29. Feb 2008 07:53

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Moin, Moin marabu!

Schaut gut aus, vielen Dank schon mal. Allerdings geht es damit noch nicht wirklich voran:
  • Wenn ich von TCustomTreeView ableite, dann meckert der Compiler innerhalb des Codes des aufrufenden Programms, über den undefinierten Bezeichner "Items" - die Ableitung muss daher wohl von TTreeView erfolgen.
  • Der Private-Deklaration von CompareNodes muss doch "procedure" vorangestellt werden? Sonst weigert sich der Compiler weiterzumachen.
  • Füge ich "procedure" ein, wird bis zum constructor übersetzt und über das "unbekannte FOnCompare" gemeckert.
Argggg, drehe mich schon wieder im Kreis :cry:
Kannst du noch mal kurz über meinen Fall nachdenken?

Liebe Grüße aus Hamburg

marabu 29. Feb 2008 08:23

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Hallo Ralph,

was die Items betrifft, so schau dir mal den Quelltext der Unit ComCtrls an. Grundsätzlich ist es guter Stil von TCustomTreeView abzuleiten. In der Ableitung legt man dann fest, welche Properties publiziert werden und welche nicht. Leitest du von TTreeView ab, dann hast du siesen Freiheitsgrad nicht mehr. Das gilt so für alle VCL-Komponenten.

Das mit dem fehlenden Schlüsselwort "procedure" tut mir leid - ich lerne noch...

Bei meinem Beispiel-Code habe ich alles weggelassen, was nicht direkt mit der Problem-Facette zu tun hat. Du musst dich an der Klasse TTreeView orientieren, mein Code ist zu unvollständig.

Freundliche Grüße

taaktaak 29. Feb 2008 18:39

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Moin, Moin.

Ich habe mir die guten Ratschläge von marabu zu Herzen genommen und bin ein kleines Stück weiter gekommen.
  • Meine Komponente wird nun von TCustomTreeView abgeleitet. Das Meckern des Compilers hörte selbstverständlcih sofort auf, nachdem in meiner Ableitung nun alle Properties in gleichem Umfang wie in TTreeView veröffentlicht werden.
  • Beim vertikutieren unserer ehemals ansehnlichen Rasenfläche heute nachmittag wurde mir auch klar, warum die Zuweisung FOnCompare:=CompareNodes nicht funktionieren kann: FOnCompare ist als "private" deklariert und nur innerhalb der gleichen Unit auch für andere Klassen erreichbar. Aber in die Unit ComCtrls gehört meine neue Komponente sicherlich nicht 'rein. Bei Überprüfung meiner Vermutung bin ich dann auch über den Begriff FRIENDS gestoßen - ich gehe jetzt mal davon aus, dass dies auch die Bedeutung des ersten Buchstabens von FOnCompare ist; F steht für FRIEND - korrekt???
  • Beim Studium des uralten "Handbuch Komponentenentwicklung" (für Borland Delphi 1.0) bin ich dann auf folgendes gestoßen, was möglicherweise für meinen "Fall" relevant ist: ...allerdings können Implemetierungsmethoden nicht einfach überschrieben werden, sondern der Zugriff auf den ererbten Eigenschaftswert muß über die Eigenschaft selbst erfolgen...
Wenn ich mir in ComCtrls die Deklaration von OnCompare anschaue...

Delphi-Quellcode:
property OnCompare: TTVCompareEvent read FOnCompare write FOnCompare;
Ist das nicht eine Implementierungsmethode? Ich gehe mal davon aus, dass es so ist - leider, leider kann ich mit dem vorstehenden Hinweis von Borland "... Zugriff ... über die Eigenschaft selbst ..." nix anfangen :wall:

Ahh, ich wäre über eine weiter Hilfestellung dankbar :love:

marabu 29. Feb 2008 20:01

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Hallo Ralph,

das Präfix F steht für Field oder - für Einheimische - Feld. Deine Klasse besteht aus Feldern, Methoden und Eigenschaften.

Statt der Zuweisung an FOnCompare musst du an OnCompare zuweisen.

Freundliche Grüße

taaktaak 29. Feb 2008 22:53

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Hallo marabu, :cheers:
Hallo an alle "Mitleser"

Es ist vollbracht! Mein kleine Ausflug in die Komponentenentwicklung ist Dank deiner Hilfe und der von shmia (Zusammenfügen der Popups) erfolgreich abgeschlossen! Hab' wieder 'ne Menge dazugelernt. Es war etwas mühsam, aber dadurch wird der Lerneffekt bestimmt gesteigert. Als Anlage füge ich das Ergebnis bei. Als nächster (und wohl vorerst letzter) Schritt soll das Komponenten-Popup noch um eine Suchfunktion erweitert werden. Tja, und wenn da irgendwo noch "Schnitzer" enthalten sind, würde ich mich natürlich über einen Hinweis freuen!

PS: Die Testanwendung hat natürlich keinen praktischen Nährwert, sie demonstriert lediglich die Möglichkeiten der Layout- und Sortiermöglichkeiten des Komponenten-Popups.

// edit: Attachments entfernt, da im nächsten (letzten?) Post die abschließende Version zur Verfügung gestellt wird.

taaktaak 1. Mär 2008 21:04

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin, Moin,
nun habe ich in das komponenteneigene Popup auch noch eine Suchfunktion (Wildcards avail) eingebaut - damit sind alle drei Standardfunktionen (Layout, Sortieren und Suchen) die ich grundsätzlich in (m)einem TreeView zur Verfügung haben möchte, erst einmal vorhanden.
Da die Komponente ohne Hilfestellung aus dem Forum zumindest nicht so schnell entstanden wäre, möchte ich abschließend den Code zur Verfügung stellen. Wie schon im vorherigen Post bemerkt: Falls sich das einer anschaut und optmierende Hinweise geben möchte, bitte gern...


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