AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi [VST] Spaltenbreite an längsten Eintrag anpassen
Thema durchsuchen
Ansicht
Themen-Optionen

[VST] Spaltenbreite an längsten Eintrag anpassen

Ein Thema von xZise · begonnen am 16. Mai 2009 · letzter Beitrag vom 3. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

[VST] Spaltenbreite an längsten Eintrag anpassen

  Alt 16. Mai 2009, 18:08
Hallo ihr,

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

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#2

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

  Alt 16. Mai 2009, 21:39
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 16. Mai 2009, 23:18
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#4

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

  Alt 17. Mai 2009, 10:30
Hast du hoDblClickResize an?

Diese ruft intern "GetMaxColumnWidth" auf.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Tegi

Registriert seit: 4. Aug 2008
Ort: Duisburg
11 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 17. Mai 2009, 10:55
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
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 17. Mai 2009, 17:26
Jetzt müsste man nur noch erfahren können, wie Breit der Spaltenheader ist.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#7

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

  Alt 17. Mai 2009, 18:29
Die Spaltenbreiten werden beim Design festgelegt.
Du brauchst nur die Header.items[i].width auslesen.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

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

  Alt 17. Mai 2009, 19:43
Also ich habe gar keine Eigenschaft Items ... Außerdem will ich ja nur die Breite des Headers.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#9

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

  Alt 18. Mai 2009, 11:04
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#10

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

  Alt 19. Mai 2009, 08:36
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.
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