![]() |
Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Hallo zusammen,
ich setze die Virtual TreeView in der Version 6.4.1 mit Delphi Berlin 10.2 ein. Ich stehe gerade auf den Schlauch oder bin im Mittagstief, daher brauche ich einen Schubs in die richtige Richtung: Wo und wie konnte ich nochmal einstellen, dass die Treeview in der Spaltenansicht automatisch die Spaltenbreite anhand der Länge der Einträge anpasst? Beispiel - Ich habe zur Zeit: Eintrag 1 Eintrag 2 Eintrag 3 Sehe beim Programmstart aber nur: Ein... Ein... Ein... Muss ich manuell über TVirtualStringTree.Header.Columns.Count iterieren und die TVirtualTreeColumn.Width setzen? |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Hm, nein...nicht so wirklich.
Im Gegenteil, die Spalten sind nun noch schmaler als vorher mit den Tipp aus dem letzten Post des verlinkten Threads:
Delphi-Quellcode:
ATreeView.Header.AutoFitColumns(False);
ATreeView.Header.AutoSizeIndex := -1; |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
bei Doppelklick zwischen zwei Spalten (vst liegt als Komponente in einem Frame):
Delphi-Quellcode:
vst: TVirtualStringTree;
FmerkOnBeforeCellPaint: TVTBeforeCellPaintEvent; procedure TFrameVST.vstBeforeGetMaxColumnWidth(Sender: TVTHeader; Column: TColumnIndex; var UseSmartColumnWidth: Boolean); begin if Assigned(vst.OnBeforeCellPaint) then begin FmerkOnBeforeCellPaint := vst.OnBeforeCellPaint; vst.OnBeforeCellPaint := nil; end; end; procedure TFrameVST.vstAfterGetMaxColumnWidth(Sender: TVTHeader; Column: TColumnIndex; var MaxWidth: Integer); begin if Assigned(FmerkOnBeforeCellPaint) then begin vst.OnBeforeCellPaint := FmerkOnBeforeCellPaint; FmerkOnBeforeCellPaint := nil; end; end; procedure TFrameVST.vstColumnWidthDblClickResize(Sender: TVTHeader; Column: TColumnIndex; Shift: TShiftState; P: TPoint; var Allowed: Boolean); begin if (Allowed) and (Shift = []) then begin AutoFitColumn(Column); Allowed := False; end; end; procedure TFrameVST.AutoFitColumn(Column: TColumnIndex); var cWidth, hWidth: Integer; begin if [coResizable, coVisible] * vst.Header.Columns[Column].Options = [coResizable, coVisible] then begin cWidth := vst.GetMaxColumnWidth(Column); if (hoVisible in vst.Header.Options) then begin hWidth := GetMaxHeaderWidth(Column); if cWidth < hWidth then cWidth := hWidth; if cWidth > vst.Header.Columns[Column].MaxWidth then cWidth := vst.Header.Columns[Column].MaxWidth; end; vst.Header.Columns[Column].Width := cWidth; end; end; |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Was passiert, wenn du das einstellst?
Code:
ATreeView.Header.Options:= ATreeView.Header.Options + [hoAutoResize];
ATreeView.Header.Options:= ATreeView.Header.Options + [hoColumnResize]; ATreeView.Header.AutoSizeIndex := 0; Ach, und zu madas -> wtf? |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Liste der Anhänge anzeigen (Anzahl: 1)
Hab das mal schnell ausprobiert und das sollte eigentlich ganz einfach funktionieren....
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Falls jedoch mehr Spalten vorhanden sind, werden die in den nicht sichtbaren Bereich geschoben und bleiben schmal. Gab es denn keine Möglichkeit, dass sich die Treeview selber an den Breiten der Itemtexte (nebst Checkbox etc.) orientiert? @Whookie: Was? :spin: Das hat ja nicht einmal sichtbare Spalten mit Header?!? |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Liste der Anhänge anzeigen (Anzahl: 1)
Beim mir schon:
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
@TE: Versuch doch mal folgendes:
Delphi-Quellcode:
.
vst.Header.AutoFitColumns;
Eventuell noch mit den diversen Parametern rumspielen. Das ist auch die Funktion die aufgerufen wird wenn du zwischen 2 Columns einen Doppelklick ausführst und dann bei dem Event OnColumnWidthDblClickResize() den Paramter Allowed auf True stellst. Hoffe dir geholfen zu haben. |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Hmm...
Ist es nicht eigentlich so das der Anwender die Max breite festlegt? Und diese dann beim beenden gespeichert wird? Das Virtual TreeView hat meines Erachtens schon immer Probleme beim Doppelklick zwischen zwei Einträgen im Header. Hatte da mal einen SkinEditor geschrieben hat da nie funktioniert, habe es dann sein gelassen. gruss |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Bei mir funktioniert das problemlos. Schau mal in den SourceCode des VST was dort alle abgefragt wird. Du musst die Column Options entsprechend des gewünschten Ergebnisses setzen und auch noch mindestens das Event das ich in ![]() Wenn du das alles korrekt machst, dann funktioniert auch das automatische Resizen der Column. :stupid: Vorteil ist eben, dass der Tree z.B. die Breite des Textes automatisch entsprechend seines Canvas ermittelt und dann die größte Breite als ColumnWidth setzt. |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Bsp. Wenn ich ein TreeView in VB6 auf die Form klatsche und dann den Bereich im Header doppelklicke dann setzt sich die Column automatisch auf den längsten Text. Da muss ich nichts extra programmieren. Was ich damit sagen will... Das sollte ein Standard verhalten sein ohne es extra programmieren zu müssen. gruss |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Die Komponente hat generell kein "Eigenleben". Man muss ihr haarklein sagen was sie machen soll. Ansonsten passiert da gar nix. Aber das ist genau der Vorteil des VST. Man hat alle Freiheiten. Nur muss man die Funktionen eben richtig nutzen. Dafür hilft beim VST eben sehr oft einen Blick in den SourceCode. Die ursprüngliche Hilfe des VST kann man eigentlich auch in die Tonne treten. Die CHM Datei ist uralt und die PDF Datei ist mittlerweile auch nur noch für die Standardaktionen gültig. Schade das JamSoftware die nicht weiterpflegt. :? |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
In VBNet, VB6, C#, C++ und anderen sprachen ist das Standard. Delphi macht schon immer sein eigen Ding. gruss |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Aber genug zu dem Thema. Wenn du das als Standardverhalten haben möchtest, dann schreib dir doch schnell eine kleine Ableitung der Komponente die diese Funktion standardmäßig aktiviert hat. :cyclops: @TE: Hat dir eine der vorgeschlagenen Lösungen weitergeholfen? Mich würde interessieren, ob meine Lösung bei dir das gewünschte Ergebnis erzielt hat. :-D :cyclops: |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
![]() Kommentar in unseren Quellen: // selber machen, weil BUG im VST die falsche Spalte verwendet - (12.01.2010) |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Delphi-Quellcode:
ATreeView.Header.Options := ATreeView.Header.Options + [hoAutoResize, hoColumnResize];
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Wusste doch das da etwas im argen ist denn ein normales verhalten ist das nicht. Und wie schon gesagt sollte eigentlich auch Automatisch ohne zusätzlichen Code gehen. (Events hin oder her) Scheint ja zu gehen nach dem Beheben des Fehlers. Danke nochmal. gruss |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
@Aviator: Danke, mit den AutoFitColumns sieht das ganze schon viel besser aus.
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Ich habe das einzeln gemacht, wegen der Lesbarkeit und so. |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Delphi-Quellcode:
unit VST.View;
interface uses System.SysUtils, System.Classes, Vcl.Controls, Vcl.Forms, VirtualTrees; type PMyNodeData = ^TMyNodeData; TMyNodeData = record Caption: string; end; TForm2 = class(TForm) procedure FormCreate(Sender: TObject); procedure VstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure VstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); private VST: TVirtualStringTree; end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormCreate(Sender: TObject); var LPr, LP: PVirtualNode; LData: PMyNodeData; begin VST := TVirtualStringTree.Create(Self); VST.name := 'VST'; VST.Parent := Self; VST.Header.Options := VST.Header.Options + [hoVisible]; VST.Align := alClient; VST.OnFreeNode := VstFreeNode; VST.OnGetText := VstGetText; with VST.Header.Columns.Add do begin Position := 0; Width := 10; Text := 'Spalte 1'; Visible := True; end; with VST.Header.Columns.Add do begin Position := 1; Width := 10; Text := 'Spalte 2'; Visible := True; end; VST.NodeDataSize := SizeOf(TMyNodeData); LPr := VST.AddChild(nil); LData := VST.GetNodeData(LPr); LData.Caption := 'Eintrag 1'; LPr := VST.AddChild(nil); LData := VST.GetNodeData(LPr); LData.Caption := 'Eintrag 2'; LPr := VST.AddChild(nil); LData := VST.GetNodeData(LPr); LData.Caption := 'Eintrag 3 1/4'; LPr := VST.AddChild(nil); LData := VST.GetNodeData(LPr); LData.Caption := 'Hallo Welt'; LPr := VST.AddChild(LPr); LData := VST.GetNodeData(LPr); LData.Caption := 'Hallo Welt'; VST.FullExpand(); VST.Header.AutoFitColumns; // <---- das ist der entscheide Punkt! end; procedure TForm2.VstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var LPData: PMyNodeData; begin LPData := Sender.GetNodeData(Node); Finalize(LPData^); end; procedure TForm2.VstGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var LData: PMyNodeData; begin LData := VST.GetNodeData(Node); if TextType = ttNormal then CellText := LData.Caption; end; end. |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
Hier mal ein Auszug aus dem VST SourceCode:
Delphi-Quellcode:
Je nachdem welcher SmartAutoFitType übergeben wird, werden entweder die globalen Standardeinstellungen oder aber Columnspezifische Einstellungen verwendet.
procedure TVTHeader.AutoFitColumns(Animated: Boolean = True; SmartAutoFitType: TSmartAutoFitType = smaUseColumnOption;
RangeStartCol: Integer = NoColumn; RangeEndCol: Integer = NoColumn); //--------------- local functions ------------------------------------------- function GetUseSmartColumnWidth(ColumnIndex: TColumnIndex): Boolean; begin Result := False; case SmartAutoFitType of smaAllColumns: Result := True; smaNoColumn: Result := False; smaUseColumnOption: Result := coSmartResize in FColumns.Items[ColumnIndex].FOptions; end; end; //---------------------------------------------------------------------------- procedure DoAutoFitColumn(Column: TColumnIndex); begin with FColumns do if ([coResizable, coVisible] * Items[FPositionToIndex[Column]].FOptions = [coResizable, coVisible]) and DoBeforeAutoFitColumn(FPositionToIndex[Column], SmartAutoFitType) and not TreeView.OperationCanceled then begin if Animated then AnimatedResize(FPositionToIndex[Column], Treeview.GetMaxColumnWidth(FPositionToIndex[Column], GetUseSmartColumnWidth(FPositionToIndex[Column]))) else FColumns[FPositionToIndex[Column]].Width := Treeview.GetMaxColumnWidth(FPositionToIndex[Column], GetUseSmartColumnWidth(FPositionToIndex[Column])); DoAfterAutoFitColumn(FPositionToIndex[Column]); end; end; //--------------- end local functions ---------------------------------------- var I: Integer; StartCol, EndCol: Integer; begin ... end; |
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Womit mal wieder bewiesen wäre: It's not a Bug, it's a Fietscher :-D
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Wobei ich anmerken muss, eine RICHTIGE Bedienung bzw. Verwendung setzt auch eine ordentliche Referenz-Doku voraus. Und die ist beim VST... sagen wir mal... ausbaufähig ^^
|
AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 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-2025 by Thomas Breitkreuz