Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen (https://www.delphipraxis.net/191131-virtual-treeview-anhand-des-laengsten-eintrages-die-breite-der-spalte-anpassen.html)

Brainshock 14. Dez 2016 11:15

AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
 
Zitat:

Zitat von uligerhardt (Beitrag 1355967)
Das ist doch ein Set, also lieber so: :mrgreen:
Delphi-Quellcode:
ATreeView.Header.Options := ATreeView.Header.Options + [hoAutoResize, hoColumnResize];

Klugscheißer ;).
Ich habe das einzeln gemacht, wegen der Lesbarkeit und so.

Brainshock 14. Dez 2016 11:22

AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
 
Zitat:

Zitat von TiGü (Beitrag 1356015)
@Aviator: Danke, mit den AutoFitColumns sieht das ganze schon viel besser aus.

Kannst du mal deine Lösung veröffentlichen?

TiGü 14. Dez 2016 11:57

AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
 
Zitat:

Zitat von Brainshock (Beitrag 1356097)
Zitat:

Zitat von TiGü (Beitrag 1356015)
@Aviator: Danke, mit den AutoFitColumns sieht das ganze schon viel besser aus.

Kannst du mal deine Lösung veröffentlichen?

Beachte die letzte Zeile im FormCreate!

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.

uligerhardt 14. Dez 2016 13:09

AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
 
Zitat:

Zitat von Brainshock (Beitrag 1356095)
Zitat:

Zitat von uligerhardt (Beitrag 1355967)
Das ist doch ein Set, also lieber so: :mrgreen:
Delphi-Quellcode:
ATreeView.Header.Options := ATreeView.Header.Options + [hoAutoResize, hoColumnResize];

Klugscheißer ;).
Ich habe das einzeln gemacht, wegen der Lesbarkeit und so.

Lesbarkeit... pah! :P

Aviator 14. Dez 2016 13:32

AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
 
Zitat:

Zitat von TiGü (Beitrag 1356103)
Zitat:

Zitat von Brainshock (Beitrag 1356097)
Zitat:

Zitat von TiGü (Beitrag 1356015)
@Aviator: Danke, mit den AutoFitColumns sieht das ganze schon viel besser aus.

Kannst du mal deine Lösung veröffentlichen?

Beachte die letzte Zeile im FormCreate!

Das Verhalten von AutoFitColumns() lässt sich durch die einzelnen Column Options noch entsprechend anpassen.


Hier mal ein Auszug aus dem VST SourceCode:

Delphi-Quellcode:
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;
Je nachdem welcher SmartAutoFitType übergeben wird, werden entweder die globalen Standardeinstellungen oder aber Columnspezifische Einstellungen verwendet.

Codehunter 14. Dez 2016 14:53

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

Aviator 14. Dez 2016 14:58

AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
 
Zitat:

Zitat von Codehunter (Beitrag 1356127)
Womit mal wieder bewiesen wäre: It's not a Bug, it's a Fietscher :-D

Richtig. Man muss die Komponente nur richtig benutzen. Dann funktioniert sie auch wie gewünscht. :roll:

Codehunter 14. Dez 2016 15:30

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 ^^

Aviator 14. Dez 2016 15:35

AW: Virtual TreeView - Anhand des längsten Eintrages die Breite der Spalte anpassen
 
Zitat:

Zitat von Codehunter (Beitrag 1356139)
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 ^^

Das ist wahr. Habe ich ja auch schon in #14 angemeckert. Aber ich muss auch sagen, dass die Komponente nicht von jedem Neuling/Anfänger genutzt werden kann. Um ein ordentliches Bild mit der Komponente zustande zu bringen muss man schon eine gewisse Erfahrung mitbringen. Und zudem braucht es auch einiges an Arbeitszeit um mit der Komponente schnell und effektiv arbeiten zu können. Und wenn man so weit ist, dann schaut man sowieso in den SourceCode. Der ist in dem Fall dann sogar aussagekräftiger. Zumindest geht es mir so. Ich habe allerdings auch schonmal in die PDF Datei reingeschaut wenn ich mir unter einer Einstellung oder einem Event so rein gar nix vorstellen konnte. Allerdings war das dann mehr ein Glücksspiel ob dort wirklich etwas drin steht. :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr.
Seite 3 von 3     123   

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