![]() |
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. |
AW: Große Probleme mit VirtualStringTree
Was hast du denn für eine Delphiversion und woher hast du den VST heruntergeladen?
Richtig wäre hier ausgecheckt: ![]() |
AW: Große Probleme mit VirtualStringTree
Liste der Anhänge anzeigen (Anzahl: 1)
Tokyo und VST Version 7, die neueste.
Fehlt in Unit2 nicht SetData und GetData? |
AW: Große Probleme mit VirtualStringTree
Zitat:
EDIT es funktioniert jetzt... ich musste nur meinen alten VST-Ordner mit den Units drin löschen. Ich bastel dann später mal weiter. Danke bisher! Und Aviator, deinen Beitrag lese ich mir noch in Ruhe durch. |
AW: Große Probleme mit VirtualStringTree
So da bin ich wieder.
Ich habe noch ein bisschen rumgespielt und herausgefunden, dass wenn ich das VST mit Clear leere, wohl auch die Datenklassen in den Nodes automatisch freigegeben werden. Ein im ..ObjectList..Free im FormDestroy führt aber zu einem "Ungültige Zeigeroperation". Im VSTOnFree habe ich
Delphi-Quellcode:
hinzugefügt.
VST.GetNodeData<TVSTData>(Node).Free;
Ist es nicht normaler so, wie man Instanzen von etwas freigibt? Im OnDestroy meine ich? |
AW: Große Probleme mit VirtualStringTree
Das klingt so, als hättest Du Mehrfach-Referenzen auf Deine Objekte. Wenn man da nicht aufpasst, schafft man sich ganz schnell wilde Zeiger, was zu den geschilderten Problemen führt. Also entweder dafür sorgen, dass beim Zerstören der Objekte alle Referenzen genilt werden oder einfach Interfaces verwenden.
|
AW: Große Probleme mit VirtualStringTree
Wollte gerade antworten :P
1. TObjectList habe ich durch TList ausgetauscht. Denn TObjectList UND die VST haben die Objekte.... "ge-owned" :?: gehabt... glaube ich jedenfalls. 2. Folgende Änderung im OnFreeNode
Delphi-Quellcode:
Das funktioniert jetzt soweit.
procedure TForm2.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin VST.GetNodeData<TVSTData>(Node).Free; aVSTDataClasses.Delete(Node.Index); // <== das hier habe ich hinzugefügt end; - VST.Clear VST leeren, Nodes löschen und TList-Objekte freigeben - aVSTDataClasses.Free Am Ende des Programms Liste freigeben NUR ich kann mir gut vorstellen, dass meine Änderung oben mit Delete(Nodex.Index) richtig in die Hose geht, wenn man das VST um-sortiert (von Z nach A statt A nach Z). Bzw. wenn man im VST nur ein paar Nodes und nicht alle angezeigt (Stichwort "Suche") dann ginge das auch echt in die Hose. Oder sehe ich das falsch? Und habe dabei gerade noch ein anderes Problem gefunden... ein VST.Clear räumt mir leider auch die TList leer, was ich nicht möchte. |
AW: Große Probleme mit VirtualStringTree
Das siehst Du schon richtig, machst es Dir aber auch unnötig schwer. Ich an Deiner Stelle würde die Objekte speichertechnisch weiterhin von der Objektliste verwalten lassen und eine Referenz in den Knoten ablegen, wie Du es ja vorher hattest. Wird nun ein Knoten gelöscht, merkst Du Dir die Referenz, holst Dir deren Index aus der Objektliste und löschst dann diesen Index aus der Liste. Steht dort OwnsObjects auf true, wird das Objekt automatisch freigegeben. Im OnFreeNode darfst Du das Objekt dann natürlich nicht freigeben, das ist ja schon weg.
|
AW: Große Probleme mit VirtualStringTree
Das ich das Projekt nochmal als Anhang schicken? Verstehe sonst nur Bahnhof, ob ich das jetzt richtig habe oder nicht.
|
AW: Große Probleme mit VirtualStringTree
Du könntest einfach das OnFreeNode Event weglassen. Dann gibt dir der Tree auch nichts frei was du nicht freigeben willst. Und dann eben eine TObjectList nutzen (wie von DeddyH vorgeschlagen). Bei mir funktioniert das so schon seit Jahren.
Der Tree bekommt immer nur eine Referenz zu dem Objekt, wird aber niemals der Besitzer. EDIT: Häng dein Projekt einfach mal an. Dann können wir mal drüberschauen. |
AW: Große Probleme mit VirtualStringTree
Das müssen sich dann aber andere anschauen, ich sitze gerade am Tablet. Aber eine andere Frage: wird die Liste noch anderweitig benutzt, oder dient sie lediglich der Speicherverwaltung? Im letzteren Fall könntest Du doch komplett darauf verzichten.
|
AW: Große Probleme mit VirtualStringTree
Liste der Anhänge anzeigen (Anzahl: 1)
Aktuell verwende ich ein TListView welches ich eigentlich bearbeiten wollte, um Data mit hinterlegter Liste zu verwenden.
Das hätte für mich den Vorteil, dass ich an verschiedenen Stellen nicht mehr extra in meine Ini-Datei gehen muss oder noch blöder die SubItems auslesen muss. Und wenn-schon-denn-schon dachte ich mir, baue ich alles komplett auf VST um. Also ja, die Daten werden noch woanders verwendet (nur lesend). Hier meine aktuelle Demo. Sortieren funktioniert, aber löschen danach nicht mehr. Folgendes lößt das Problem vorzeitig, aber ist es auch -richtig-?
Delphi-Quellcode:
// Zu TVSTData hinzufügen
Index: Integer; // Index beim Erstellen der Nodes setzen aVSTData := TVSTData.Create; aVSTData.Index := i; // .... // Einen Node und dessen Daten löschen ShowMessage('VST-Index: ' + IntToStr(VST.FocusedNode.Index) + sLineBreak + 'List-Index: ' + IntToStr(Data.Index)); aVSTDataClasses.Delete(Data.Index); // Daten des Nodes aus ObjectList löschen VST.DeleteNode(VST.FocusedNode); // Node "visuell" löschen |
AW: Große Probleme mit VirtualStringTree
Nimm doch beim Löschen einfach den Index innerhalb der Objektliste, dann kann doch nichts schiefgehen. Pseudo-Code:
Delphi-Quellcode:
idx := Liste.IndexOf(VST.NodeData);
if idx > -1 then Liste.Delete(idx); |
AW: Große Probleme mit VirtualStringTree
Ich habe mir dein Testprojekt jetzt mal angeschaut. Es ist natürlich wenig programmfluss drin der sich selbst erklärt. Also wann soll man welchen Button drücken damit nichts kaputt geht. Aber das ist ja bei einem Testprojekt normal.
Prinzipiell sieht es schonmal nicht falsch aus. Auch wenn da noch einige Dinge drin sind die man verbessern könnte. Nur will ich hier jetzt kein großes Fass aufmachen da ich nicht weiß, wie ausführlich du dein Testprojekt jetzt programmiert hast. Ich denke es wäre sinnvoller, wenn du schon ein etwas fortgeschritteneres Programm zum "Probelesen" anbieten würdest, in dem du auch schon ein gewisses Errorhandling drin hast. Fehler im Keim zu ersticken ist zwar immer besser, aber bei reinen Testanwendung schreibt man ja auch schnell mal was hin ohne großartig Wert darauf zu legen wie es aussieht. Hauptsache der Test funktioniert. Das Problem mit dem Löschen deiner Nodes haben wir ja in dem anderen Thread geklärt. :wink: |
AW: Große Probleme mit VirtualStringTree
Ich kann dir später gerne mal mein aktuelles Testprojekt hier anbieten.
Es wird aber noch über Wochen ein Testprojekt bleiben. Fehlerbehandlung kommt erst, wenn ich den Testcode in mein eigentliches Projekt einbaue, da mir im Testprojekt dafür gewisse Units fehlen. Mit diesem Testprojekt ohne Fehlerbehandlung komme ich vollkommen klar. Ich setze es demnächst aber nochmal neu hier rein mit einer kurzen Erklärung. |
AW: Große Probleme mit VirtualStringTree
Zitat:
Mir ist jetzt nicht direkt irgendetwas aufgefallen was du evtl. falsch machst bis auf eine Kleinigkeit:
Delphi-Quellcode:
procedure TForm2.VSTCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var Data1: TVSTData; Data2: TVSTData; begin Data1 := Node1.GetData<TVSTData>; Data2 := Node2.GetData<TVSTData>; Result := CompareText(Data1.Col1, Data2.Col2); end; Hier vergleichst du Col1 immer mit Col2 von unterschiedlichen Nodes. Ich denke, dass das richtigerweise beide Male Col1 sein sollte. Aber dazu kann ich nicht mehr sagen. Ein Hinweis vielleicht noch zu dem DrawText. Hier geht es dir scheinbar darum, dass du einen bestimmten Text hinter eine Node setzen willst, wenn eine Beschreibung vorliegt. Das könntest du evtl. auch mit dem StaticText umsetzen was du wiederum über das GetText lösen könntest. Dafür benötigst du dann kein extra DrawText Event. |
AW: Große Probleme mit VirtualStringTree
Zitat:
Ich führe jaenike's Beitrag hier mal fort wenn ich darf: #4: ![]() Das hieße, ich bräuchte keine extra TObjectList zum Halten der Daten. Daher eine generelle Frage: ObjectList ja oder nein. Das Projekt hat rund 120.000 Zeilen und das VST wird das Control sein, welches zu 99% verwendet wird. |
AW: Große Probleme mit VirtualStringTree
Es ist immer besser die Daten außerhalb der GUI zu halten und dort nur zu referenzieren.
|
AW: Große Probleme mit VirtualStringTree
Ich habe eben mal ein bisschen mit toShowStaticText rumprobiert, bekomme das aber leider nicht hin, dass ich zwei Zeilen Text pro Node habe.
Aktuell verwende ich ja TargetCanvas.TextOut im OnDrawText zweimal, da klappt es. Winapi.Windows.DrawTextW wäre mir eigentlich lieber. Aktuell ist es so
Delphi-Quellcode:
procedure TForm2.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect;
var DefaultDraw: Boolean); var Data: TVSTData; DrawFormat: Cardinal; R: TRect; s: string; begin DefaultDraw := False; R := CellRect; R.Left := R.Left + VST.Indent; Data := Node.GetData<TVSTData>; // TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 2, Text); DrawFormat := DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE; if Data.bHasDescription then R.Top := R.Top - 14; Winapi.Windows.DrawTextW(TargetCanvas.Handle, PWideChar(Text), Length(Text), R, DrawFormat); if Data.bHasDescription and (Column = 0) then begin // TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 18, '123'); s:='123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 '; // wird leider nicht komplett gezeichnet - nur "123 " R.Top := R.Top + 28; Winapi.Windows.DrawTextW(TargetCanvas.Handle, PWideChar(s), Length(s), R, DrawFormat); end; end; |
AW: Große Probleme mit VirtualStringTree
Warum benutzt du denn DT_SINGLELINE? Es können doch direkt mehrere Zeilen ausgegeben werden.
|
AW: Große Probleme mit VirtualStringTree
Im Prinzip möchte ich folgendes weiß aber nicht ob das möglich ist
.,.. keine Ahnung wie man eine Tabelle macht daher so Header | Header | Header | Header --------------------------------- -Col1--|--Col2--|--Col3--|--Col4 <== Node: Default Höhe -Col1--|--Col2--|--Col3--|--Col4 <== Node: doppelte Höhe -hier ein string von Col1 bis Col4 Ich dachte erst AutoSpan der Cols könnte helfen aber leider nicht. |
AW: Große Probleme mit VirtualStringTree
Für den Fall könntest du mal den Automatismus vom VST ausprobieren. Aktiviere hierzu
Delphi-Quellcode:
(glaube so heißt es) in den TreeOptions und füge dann nur in Col1 (bzw. in der Column, ab der der Text angezeigt werden soll) den Text ein. Bei den nachfolgenden Columns lässt du den CellText leer.
toAutoSpanColumns
Der VST verlängert dann automatisch den Text über die anderen Spalten hinweg. Ob das mit Multiline funktioniert weiß ich nicht. Die Node Höhe sollte da aber keine Rolle spielen. |
AW: Große Probleme mit VirtualStringTree
Funktioniert alles leider nicht.
Ich brauche leider ja auch die anderen Columns. Chaotisch aber so sieht es aus
Delphi-Quellcode:
procedure TForm2.VSTDrawText(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: string; const CellRect: TRect;
var DefaultDraw: Boolean); var Data: TVSTData; DrawFormat: Cardinal; R: TRect; s: string; begin DefaultDraw := False; R := CellRect; if Column = 0 then R.Left := R.Left + VST.Indent; Data := Node.GetData<TVSTData>; // TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 2, Text); DrawFormat := DT_NOPREFIX or DT_VCENTER; // or DT_SINGLELINE; // if Data.bHasDescription then // R.Top := R.Top - 14; // Winapi.Windows.DrawTextW(TargetCanvas.Handle, PWideChar(Text), Length(Text), R, DrawFormat); if Data.bHasDescription and (Column = 0) then begin s := '123 123 123 123 123 ' + sLineBreak + '123 123 123 123 123 123 123 123 123 123 '; // R.Top := R.Top + 28; // TargetCanvas.TextOut(CellRect.Left, CellRect.Top + 18, s); Winapi.Windows.DrawTextW(TargetCanvas.Handle, PWideChar(s), Length(s), R, DrawFormat); end else if (Column = 0) then Winapi.Windows.DrawTextW(TargetCanvas.Handle, PWideChar(Text), Length(Text), R, DrawFormat); end; |
AW: Große Probleme mit VirtualStringTree
Moin,
habe jetzt nicht so ganz genau den Thread komplett gelesen, aber ich glaub du könntest in diesem Fall auch einfach im
Delphi-Quellcode:
festlegen:
OnInitNode
Delphi-Quellcode:
Dann kann das händische Pinseln im
procedure TForm2.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
begin if Length(VST.GetNodeData<TDeinObject>(Node).Col1) > 10 then begin VST.MultiLine[Node] := True; VST.NodeHeight[Node] := 40; // oder sonstwas wie´s dir passt end end;
Delphi-Quellcode:
raus und mit
OnDrawText
Delphi-Quellcode:
dann:
OnGetText
Delphi-Quellcode:
procedure TForm2.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var s: string; begin case Column of 0: begin if Length(VST.GetNodeData<TDeinObject>(Node).Col1) > 10 then begin s := 'blablalblabla' + #13#10 + 'blablabla'; end else begin s := 'blabla'; end; CellText := s; end; end; end; |
AW: Große Probleme mit VirtualStringTree
Zitat:
|
AW: Große Probleme mit VirtualStringTree
Zitat:
Delphi-Quellcode:
helfen müsste. Das hat nämlich genau den Effekt den du suchst.
toAutoSpanColumns
Alternativ kannst du auch das Zeichnen des Textes selbst übernehmen mit dem DrawText Event und einfach dann an den Zellen in denen nichts gezeichnet wird
Delphi-Quellcode:
auf
DefaultDraw
Delphi-Quellcode:
setzen und auch selbst dort nichts zeichnen. Nur
False
Delphi-Quellcode:
nimmt dir die Arbeit schon ab. :cyclops:
toAutoSpanColumns
|
AW: Große Probleme mit VirtualStringTree
Wie bereits erwähnt habe ich das schon getestet.
Die Texte zeichne ich bereits selber. |
AW: Große Probleme mit VirtualStringTree
Liste der Anhänge anzeigen (Anzahl: 2)
Ah na denn, siehe Grafik ob ich´s nun richtig verstanden hab :D
ansonsten Bsp.Projekt im Anhang. Für sowas gibt´s das AfterItemPaint, wenn du das im OnDrawText benutzt kannst du das Rectangle zwar definieren wie du willst, es wird trotzdem jedesmal die Column (also auch die NachbarColumns) neu gezeichnet, und somit deine übermalte Column kurz gezeichnet und dann gleich wieder überpinselt. Edit: TreeView Version 6.4.1. aber das sollte wohl kaum einen Unterschied machen |
AW: Große Probleme mit VirtualStringTree
Bild sieht gut aus. Ich teste das gleich mal!
Ich antworte gleich auch im Detail nur habe gerade keine zeit. Also: ich teste das gleich und melde mich :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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