Delphi-PRAXiS
Seite 1 von 2  1 2      

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 [VST] Spaltenbreite an längsten Eintrag anpassen (https://www.delphipraxis.net/134154-%5Bvst%5D-spaltenbreite-laengsten-eintrag-anpassen.html)

xZise 16. Mai 2009 18:08


[VST] Spaltenbreite an längsten Eintrag anpassen
 
Hallo ihr,

wie kann ich die Spaltenbreite vom VirtualStringTree an den längsten Eintrag + Spaltentitel setzen?

MfG
xZise

generic 16. Mai 2009 21:39

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Schau dir mal bitten den Code zu dem Header an.
Dort ist eine Funktion, welche bei Doppelklick zwischen den Spaltennamen die gewünscht Funktion auslöst.

xZise 16. Mai 2009 23:18

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Nein die löst nicht die gewünschte Funktion aus ;) Und zwar wird die Spaltenbreite nicht an den Spaltentitel angepasst sondern nur an den Inhalt.

MfG
xZise

generic 17. Mai 2009 10:30

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Hast du hoDblClickResize an?

Diese ruft intern "GetMaxColumnWidth" auf.

Tegi 17. Mai 2009 10:55

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
xZise hat durchaus Recht. Die Spaltenbreite wird ausschließlich an den Inhalt der Nodes, nicht jedoch an den Inhalt des Headers angepasst.

Allerdings kann man das seit spätestens Version 4.8.0 mit dem Event AfterGetMaxColumnWidth machen.
Es wird aufgerufen, nachdem die Breite bestimmt wurde und gibt dir die Möglichkeit, den ermittelten Wert noch einmal zu verändern. Du brauchst dort also nur noch ermitteln, wie breit der Spaltentitel ist und setzt dann den var-Parameter MaxWidth entsprechend

xZise 17. Mai 2009 17:26

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Jetzt müsste man nur noch erfahren können, wie Breit der Spaltenheader ist.

MfG
xZise

generic 17. Mai 2009 18:29

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Die Spaltenbreiten werden beim Design festgelegt.
Du brauchst nur die Header.items[i].width auslesen.

xZise 17. Mai 2009 19:43

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Also ich habe gar keine Eigenschaft Items ... Außerdem will ich ja nur die Breite des Headers.

MfG
xZise

generic 18. Mai 2009 11:04

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Ok, irgendwie sprechen wir immer aneinander vorbei!

Die Eigenschaft heißt vst.header.columns[i].width für die Breite eine Spalte.

Der Header selbst ist immer so breit wie der VST bzw. die breite kann aus der
privaten Variable FHeaderRect von TBaseVirtualTree ausgelesen werden.
Die größe berechnet der Tree in TBaseVirtualTree.UpdateHeaderRect

Siehe auch Klasse TVTHeader bzw. TVirtualTreeColumns.
In TVirtualTreeColumns ist das Zeichen implementiert.

Vielleicht beschreibst du einfach genau was du haben möchtest.

madas 19. Mai 2009 08:36

Re: [VST] Spaltenbreite an längsten Eintrag anpassen
 
Hallo,

wir machen das Ganze so (VST ist bei uns in einen Frame integriert):

Delphi-Quellcode:
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;

function TFrameVST.GetMaxHeaderWidth(Column: TColumnIndex): Integer;
var col: TVirtualTreeColumn;
    Size: TSize;
begin
  col := vst.Header.Columns[Column];
  Result := 2 * col.Margin;
  if (Length(col.Text) > 0) then
  begin
    vst.Canvas.Font := vst.Header.Font;
    GetTextExtentPoint32W(vst.Canvas.Handle, PWideChar(col.Text), Length(col.Text), Size);
    Inc(Result, Size.cx + 4);
  end;
  if (hoShowImages in vst.Header.Options)and(Assigned(vst.Header.Images)) then
    Inc(Result,(vst.Header.Images.Width + col.Spacing));
  if (hoShowSortGlyphs in vst.Header.Options)and(vst.Header.SortColumn = Column) then
    Inc(Result, 20); // Platz für Sortimage
  if Result < col.MinWidth then
    Result := col.MinWidth;
  if Result > col.MaxWidth then
    Result := col.MaxWidth;
end;

procedure TFrameVST.AutoFitColumns;
var
  Column: TColumnIndex;
begin
  vst.BeginUpdate;
  try
    for Column := 0 to vst.Header.Columns.Count-1 do
      AutoFitColumn(Column);
  finally
    vst.EndUpdate;
  end;
end;
Damit die Berechnung nicht so ewig dauert (wurde hier im Forum schon mal angesprochen) solltest du noch
folgendes hinzufügen:

Delphi-Quellcode:
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);
begin
  if Assigned(FmerkOnBeforeCellPaint) then
  begin
    vst.OnBeforeCellPaint := FmerkOnBeforeCellPaint;
    FmerkOnBeforeCellPaint := nil;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz