![]() |
Große Probleme mit VirtualStringTree
Ich teste mich heute an einem VirtualStringTree denn mein Ziel ist es ein VST zu haben was aussieht wie ein TListView (mit Mouse-Hover-Effekt).
Das hier habe ich schon. Ok, es kommt von einem Tutorial. Aber es funktioniert trotzdem nicht. Statt dass die in Col1 und Col2 zugewiesenen Strings im VST landen, landet das im Form.Caption.
Delphi-Quellcode:
Text habe ich mal durch CellText geändert das funktioniert jetzt.
type
PTreeData = ^TTreeData; TTreeData = packed record Col1: string; Col2: string; end; implementation {$R *.dfm} function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TTreeData): PVirtualNode; var Data: PTreeData; begin Result := AVST.AddChild(ANode); Data := AVST.GetNodeData(Result); AVST.ValidateNode(Result, False); Data^.Col1 := ARecord.Col1; Data^.Col2 := ARecord.Col2; end; procedure TForm2.Button1Click(Sender: TObject); var i: Integer; TreeData: TTreeData; begin VST.NodeDataSize := SizeOf(TTreeData); VST.BeginUpdate; for i := 0 to 9 do begin TreeData.Col1 := 'Node-Nummer: ' + IntToStr(i); TreeData.Col2 := 'Nummer: ' + IntToStr(i * i); AddVSTStructure(VST, nil, TreeData); end; VST.EndUpdate; end; procedure TForm2.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var Data: PTreeData; begin Data := VST.GetNodeData(Node); case Column of 0: Text := Data.Col1; 1: Text := Data.Col2; end; end; Was aber nicht funktioniert das Einstellen der Höhe eines Nodes. Und allgemein kann man mit dem VST irgendwie wenig machen oder es ist halt alles versteckt. Wieso gibt es denn nicht mal einen Fokus-Rahmen wenn man mit er Maus drüber fährt wie beim ListView? |
AW: Große Probleme mit VirtualStringTree
Delphi-Quellcode:
// EDIT:
procedure TForm2.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); // CellText !!!
var Data: PTreeData; begin Data := VST.GetNodeData(Node); case Column of 0: Text := Data.Col1; // nicht Text !! 1: Text := Data.Col2; end; end; Ok, hast du selbst parallel gesehen. |
AW: Große Probleme mit VirtualStringTree
Ich schreibe das mal separat, damit du eine Benachrichtigung siehst:
Höhe ändern geht einfach, aber man muss es aktivieren (aus Performancegründen): Unter TreeOptions --> MiscOptions den Wert toVariableNodeHeight auf True setzen. Dann funktioniert OnMeasureItem. |
AW: Große Probleme mit VirtualStringTree
Zitat:
Ich bin mittlerweile so weit: Items zur besseren Übersicht farblich gestalten (jedes zweite):
Delphi-Quellcode:
Im OnGetText u.a.:
procedure TForm2.VSTAfterItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
begin if Odd(Node.Index) then TargetCanvas.Brush.Color := $00E1F3FF; TargetCanvas.FillRect(ItemRect); end;
Delphi-Quellcode:
Text selber zeichnen:
procedure TForm2.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var Data: PVSTData; begin Data := VST.GetNodeData(Node); if Node.Index = 2 then Node.NodeHeight := 35; // <= funktioniert sogar ohne toVariableNodeHeight .... end;
Delphi-Quellcode:
Ist das bisher eine absolute 0815-Lösung oder ist das OK so?
procedure TForm2.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect;
var DefaultDraw: Boolean); begin DefaultDraw := False; TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 2, Text); if Node.Index = 2 then begin TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 16, '123'); // Funktioniert. Wird aber erst sichtbar, wenn ich mit der Maus über das VST fahre end; end; |
AW: Große Probleme mit VirtualStringTree
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang mal mein aktueller Versuch.
Das Ganze ist eine Zusammenstellung aus Forum, Google, Tutorial und meinem Kram. Es funktioniert soweit bis auf, dass - ein Node mit einer Höhe > Default den zweiten TextOut nicht anzeigt. - ein Node der vorher selektiert war und wo nun der Fokus woanders hin verlegt wird (Button), eine andere Hintergrundfarbe hat |
AW: Große Probleme mit VirtualStringTree
Ich würde das ganze mit den Pointern und Records lassen und lieber Klassen dranhängen. In den aktuellen Versionen des VST geht es auch generisch:
Delphi-Quellcode:
type
TTest = class private FValue: Integer; procedure SetValue(const Value: Integer); public constructor Create(const AValue: Integer); property Value: Integer read FValue write SetValue; end; // hinzufügen VirtualStringTree1.AddChild(nil, TTest.Create(15)); // OnGetText CellText := IntToStr(Node.GetData<TTest>.Value); |
AW: Große Probleme mit VirtualStringTree
Ich brauche die ObjectList leider, um später auf die Daten zugreifen zu können OHNE ins VST gehen zu müssen. Sonst würde ich sie auch weglassen.
|
AW: Große Probleme mit VirtualStringTree
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Im Anhang funktioniert es und die Pointerspielerei ist auch raus. Zitat:
|
AW: Große Probleme mit VirtualStringTree
Tag!
Also vorab: Mit dem VST kannst du eigentlich alles machen was du willst. Die Komponente ist extrem flexibel und lässt sehr viele Dinge zu, die mit anderen Komponenten nur schwer bis gar nicht erreicht werden können. Und das noch auf extrem einfache Art und Weise. Das farbliche Markieren von Zeilen macht man besser im OnBeforeCellPaint. Das Event ist dafür besser geeignet bzw. wird in der Regel eher dafür genutzt. Anbei mal die Reihenfolge der Zeichen-Events, die nacheinander ausgelöst werden. Das OnBeforeCellPaint Event kommt zwar direkt nach dem OnAfterItemErase, aber StateOfTheArt ist eigentlich OnBeforeCellPaint. Zitat:
Zitat:
Bei Änderungen der Formatierung deiner Texte die im VST angezeigt werden solltest du OnPaintText benutzen. Im OnDrawText musst du alles selbst machen. Die Positionierung, die Ausgabe des Textes, usw. Im OnPaintText übernimmt der Tree das alles für dich. Aber nur, wenn es um Formatierungen geht. Wenn du weitere Texte dazumalen willst, dann solltest du OnDrawText. Die eigentliche Erstellung der Nodes solltest du mit der RootNodeCount Eigenschaft des Trees machen. Die Children bzw. den ChildCount dann im OnInit und OnInitChildren Event zuweisen. Um Nodes beim Drüberfahren mit der Maus markieren zu lassen, kannst du auch die TreeOption toHotTrack in den PaintOptions setzen. Wenn dir das Design nicht zusagt, dann setze evtl. zum Testen mal toUseExplorerTheme auf True. Wenn es dann noch nicht passt, dann kannst du das im OnBeforeCellPaint selbst machen. Hatte ich auch mal für ein paar Programme gemacht. Sieht eigentlich ziemlich gut aus. |
AW: Große Probleme mit VirtualStringTree
Hallo Aviator, deinen Beitrag lese ich mir gleich mal in Ruhe durch.
Jaenike: Danke für deine Änderung. SetData und GetData können leider nicht gefunden werden und ich weiß auch leider nicht wie ich das in diesen von mir fabrizierten Salat einbinde :( VST in Verbindung mit Klassen und ObjectList ist komplett neu für mich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz