![]() |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Zitat:
Zitat:
Es ist so, dass bei jeder Änderung des Trees, die die Oberfläche betrifft, ein Invalidate des entsprechenden Bereiches ausgelöst wird. Bei ihm wurde das gemacht, weil er die FocusedNode Property gesetzt hat und somit die "Focused Umrandung" (keine Ahnung wie ich das besser beschreiben soll, diese gepunktete Linie die angibt, dass die Node den Focus hat) auf eine andere Node bzw. auf keine Node neu gezeichnet wurde. Hierdurch wurde dann auch gleich wieder das Berechnen der Spaltenbreite ausgelöst. Die vorherige Spaltenbreite bzw. die Breite der einzelnen Inhalte muss der Tree ja auch nicht kennen. Er durchläuft lediglich die Nodes und holt sich per GetText Event den Inhalt. Die Breite dieses Textes wird dann Canvas bezogen errechnet. Der größte Wert wird dann als Spaltenbreite übernommen. Dazu kommt dann noch TextMargins + NodeLevel(Node) * Indent usw. |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Ich denke der gedankliche Fehler hierbei ist, dass der gezeichnete Cell-Content in irgendeiner Weise Auswirkung auf das Ergebnis von GetMaxColumnWidth hätte. Dem ist aber IMHO nicht so. Vielmehr sind gerade solche Dinge wie FocusBorder (das gepunktete Dingens) von ihrem Platzbedarf her von vornherein sozusagen reserviert (teilweise über VST-Properties konfigurierbar). Das einzige wo sich hier die MainColumn von anderen unterscheidet ist der dynamische Teil mit den Indents. Also Node expanded oder nicht, mit Childnodes oder nicht, mit NodeButton oder nicht usw.
Deshalb bin ich auch der Ansicht, dass ein InvalidateNode keine Auswirkungen auf das Ergebnis von GetMaxColumnWidth haben dürfte. Es sei denn, man würde eventgesteuert die externen Daten zwischendurch verändern. Was ja, wie bereits geschrieben, nur anhand des konkreten Projektes nachvollziehbar ist und nicht allein anhand des VST-Codes den wir alle haben. |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Zitat:
Ein InvalidateNode führt nur dazu, dass der gesamte Tree neu und dementsprechend die im Hintergrund geänderten Daten auf dem Tree gezeichnet werden. Ein Aufruf vom eigentlichen AutoFitColumns() würde ja praktisch implizit ein Invalidate aufrufen. |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
hat aber eine Auswirkung darauf, zumindest soweit das die Berechnung danach funktioniert. Ich weiß doch auch nicht wieso das so ist.
InvalidateNode()
Damit ihr euch das auch ansehen könnt habe ich eine Mini Anwendung (siehe Anhang) gebaut die das Verhalten wie mein eigentliches Projekt aufweist. |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Tja da hat wohl jemand das "^" beim Zugriff auf Data vergessen.
alt:
Delphi-Quellcode:
so wie es muss:
Node := vstTable.FocusedNode;
if Assigned(Node) then begin Data := vstTable.GetNodeData(Node); if Assigned(Data) then begin Data.Name := Data.Name + 'xyz 12345'; Data.Desc := Data.Desc + 'xyz 12345'; end; end;
Delphi-Quellcode:
Beim OnGetText genau so. Usw.
Node := vstTable.FocusedNode;
if Assigned(Node) then begin Data := vstTable.GetNodeData(Node); if Assigned(Data) then begin Data^.Name := Data^.Name + 'xyz 12345'; Data^.Desc := Data^.Desc + 'xyz 12345'; end; end; |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Zitat:
|
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Zitat:
![]() |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Zitat:
|
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
@TUX_der_Pinguin: Mal dumm gefragt: Verwendest du den VST als Tree oder als Grid? Sprich, brauchst du das ganze Aufklapp-Gedönse überhaupt? Denn wenn nicht, setzt du einfach Header.MainColumn auf 1 und der Fehler ist umgangen.
Jetzt kann ich zumindest das Problem nachvollziehen. Hinzu kommt, die drei "Abkürzungspünktchen" werden auch nicht korrekt angezeigt wenn man die Spalte 0 danach manuell verkleinert. Erst nach einem Invalidate (implizit durch Fokuswechsel) wird der Node richtig initialisiert. Das spräche ja dafür, dass der VST doch irgendwas intern puffert. Sehr seltsam. Besonders deutlich wird das Problem, wenn man TreeOptions.StringOptions.toShowStaticText setzt. Dann überlappen sich in Spalte 0 sogar die Texte. Das ist Mumpitz. Scheint also ein Käferchen im VST zu sein. :-( Ich würde vorerst bei meiner Vermutung bleiben, dass da irgendwo im VST eine hartcodierte MainColumn = 0 verblieben ist. |
AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Zitat:
Delphi-Quellcode:
unit Unit2;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VirtualTrees, Vcl.StdCtrls; type TMyDataSet = record Name: String; Desc: String; end; PMyDataSet = ^TMyDataSet; type TForm2 = class(TForm) vstTable: TVirtualStringTree; Button1: TButton; procedure FormCreate(Sender: TObject); procedure vstTableGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); var Node: PVirtualNode; Data: PMyDataSet; begin ShowMessage(IntToStr(vstTable.GetMaxColumnWidth(0, False))); //62px ShowMessage(IntToStr(vstTable.GetMaxColumnWidth(1, False))); //77px vstTable.BeginUpdate; Node := vstTable.FocusedNode; if Assigned(Node) then begin Data := vstTable.GetNodeData(Node); if Assigned(Data) then begin Data^.Name := Data^.Name + 'xyz 12345'; Data^.Desc := Data^.Desc + 'xyz 12345'; end; end; vstTable.EndUpdate; //Workaround or musst have? //vstTable.InvalidateNode(Node); ShowMessage(IntToStr(vstTable.GetMaxColumnWidth(0, False))); //62px and 106px with the "workaround" ShowMessage(IntToStr(vstTable.GetMaxColumnWidth(1, False))); //127px vstTable.Header.AutoFitColumns(False, smaAllColumns); end; procedure TForm2.FormCreate(Sender: TObject); var Node: PVirtualNode; Data: PMyDataSet; Index: Integer; begin vstTable.NodeDataSize := SizeOf(TMyDataSet); vstTable.BeginUpdate; for Index := 1 to 10 do begin Node := vstTable.AddChild(nil); Data := vstTable.GetNodeData(Node); if Assigned(Data) then begin Data^.Name := IntToStr(Index)+'. Bla bla'; Data^.Desc := 'Bla bla bla bla'; end; end; vstTable.EndUpdate; vstTable.Header.AutoFitColumns(False, smaAllColumns); end; procedure TForm2.vstTableGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var Data: PMyDataSet; begin Data := vstTable.GetNodeData(Node); if Assigned(Data) then begin case Column of 0: CellText := Data^.Name; 1: CellText := Data^.Desc; end; end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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