AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TTreeView - in abgeleiteter Komponente OnCompare nutzen
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeView - in abgeleiteter Komponente OnCompare nutzen

Ein Thema von taaktaak · begonnen am 28. Feb 2008 · letzter Beitrag vom 1. Mär 2008
Antwort Antwort
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#1

TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 28. Feb 2008, 20:38
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?!

Tja, nun benötige ich wieder 'mal Hilfestellung aus dem Forum - please help!
Ralph
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 29. Feb 2008, 07:04
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
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#3

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 29. Feb 2008, 07:53
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
Kannst du noch mal kurz über meinen Fall nachdenken?

Liebe Grüße aus Hamburg
Ralph
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 29. Feb 2008, 08:23
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
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#5

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 29. Feb 2008, 18:39
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...

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

Ahh, ich wäre über eine weiter Hilfestellung dankbar
Ralph
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 29. Feb 2008, 20:01
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
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#7

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 29. Feb 2008, 22:53
Hallo marabu,
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.
Ralph
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#8

Re: TTreeView - in abgeleiteter Komponente OnCompare nutzen

  Alt 1. Mär 2008, 21:04
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...
Angehängte Dateien
Dateityp: zip sources_156.zip (8,7 KB, 6x aufgerufen)
Dateityp: zip testanwendung_134.zip (227,3 KB, 5x aufgerufen)
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 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