Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

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 TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst (https://www.delphipraxis.net/192260-tvirtualstringtree-autofitcolumns-erste-spalte-wird-nicht-angepasst.html)

TUX_der_Pinguin 4. Apr 2017 07:55

TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Hallo,

ich arbeite schon lange mit der Komponente TVirtualStringTree aber das Verhalten habe ich bisher noch nicht erlebt. Aber was passiert, ich versuche mit 'AutoFitColumns' die Spalten an den Inhalt bzw. die Überschrift anzupassen aber in einer Situation wird partout die erste Spalte ignoriert und erst die darauf folgenden Spalten korrekt angepasst.

Wie sonst auch führe ich nach dem Ändern eines Eintrags folgenden Befehl aus um alle Spalten anzupassen, aber die erste Spalte bleibt unverändert und wird nicht vergrößert.
Delphi-Quellcode:
vstTable.Header.AutoFitColumns(False, smaUseColumnOption, 0, vstTable.Header.Columns.Count-1);
Das kuriose ist das es beim ersten befüllen der Komponente klappt nur nicht wenn ich Einträge ändern will. Ich hoffe jemand von euch hat einen Tipp. Leider kann ich nicht ohne das halbe Projekt online zu stellen euch mehr Quellcode zeigen.

Aviator 4. Apr 2017 09:05

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Hallo Tux,

ich nutze die Funktion zwar nicht da ich immer selbst die Breite der Columns angebe, habe aber im SourceCode gesehen, dass vor dem Ausführen des Sizing das Event
Delphi-Quellcode:
OnBeforeAutoFitColumns
ausgelöst wird (wenn denn ein EventHandler existiert).

Hier gibt es einen Parameter
Delphi-Quellcode:
var SmartAutoFitType: TSmartAutoFitType
. Setzt du diesen an irgendeiner Stelle auf einen anderen Wert oder nutzt du das Event überhaupt?

Wenn nicht, dann steht (wie du es beim Aufruf auch übergibst) die Option auf
Delphi-Quellcode:
smaUseColumnOption
.

Und das ist der Knackpunkt. Hast du auch bei deiner ersten Column die Option in den ColumnOptions eingeschaltet?

TUX_der_Pinguin 4. Apr 2017 09:30

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Zitat:

Zitat von Aviator (Beitrag 1366343)
Hallo Tux,

ich nutze die Funktion zwar nicht da ich immer selbst die Breite der Columns angebe, habe aber im SourceCode gesehen, dass vor dem Ausführen des Sizing das Event
Delphi-Quellcode:
OnBeforeAutoFitColumns
ausgelöst wird (wenn denn ein EventHandler existiert).

Hier gibt es einen Parameter
Delphi-Quellcode:
var SmartAutoFitType: TSmartAutoFitType
. Setzt du diesen an irgendeiner Stelle auf einen anderen Wert oder nutzt du das Event überhaupt?

Wenn nicht, dann steht (wie du es beim Aufruf auch übergibst) die Option auf
Delphi-Quellcode:
smaUseColumnOption
.

Und das ist der Knackpunkt. Hast du auch bei deiner ersten Column die Option in den ColumnOptions eingeschaltet?

Delphi-Quellcode:
OnBeforeAutoFitColumns
verwende ich nicht in dem Projekt, das komische ist es das ja eigentlich alles funktioniert und richtig ist nur beim Ändern eines Eintrags will er einfach nicht die erste Spalte anpassen. Füge ich einen weiteren Eintrag hinzu, wird die Spalte korrekt angepasst.

Delphi-Quellcode:
var
  Node: PVirtualNode;
  Data: PDataset;

begin
Node := vstTable.FocusedNode;
if Assigned(Node) then
begin
  Data := vstTable.GetNodeData(Node);
  if Assigned(Data) then
  begin
    Data.Name := edtName.Text; //1. Spalte, hier wird eine längere Bezeichnung eingegeben
    Data.Type := edtType.Text; //2. Spalte, hier wird ebenfalls etwas längeres Eingetragen
  end;
end;

//Spalten anpassen...
vstTable.Header.AutoFitColumns(False, smaUseColumnOption, 0, vstTable.Header.Columns.Count-1);
Jetzt passiert folgendes, Spalte 2 hat die korrekte und angepasste Breite und Spalte 1 bleibt unverändert und somit zu klein. Dazu kommt noch das erst wenn ich auf eine andere Zeile wechsle werden in der 1. Spalte die drei Punkte gezeichnet.

madas 4. Apr 2017 09:54

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1366346)
Zitat:

Zitat von Aviator (Beitrag 1366343)
Hallo Tux,

ich nutze die Funktion zwar nicht da ich immer selbst die Breite der Columns angebe, habe aber im SourceCode gesehen, dass vor dem Ausführen des Sizing das Event
Delphi-Quellcode:
OnBeforeAutoFitColumns
ausgelöst wird (wenn denn ein EventHandler existiert).

Hier gibt es einen Parameter
Delphi-Quellcode:
var SmartAutoFitType: TSmartAutoFitType
. Setzt du diesen an irgendeiner Stelle auf einen anderen Wert oder nutzt du das Event überhaupt?

Wenn nicht, dann steht (wie du es beim Aufruf auch übergibst) die Option auf
Delphi-Quellcode:
smaUseColumnOption
.

Und das ist der Knackpunkt. Hast du auch bei deiner ersten Column die Option in den ColumnOptions eingeschaltet?

Delphi-Quellcode:
OnBeforeAutoFitColumns
verwende ich nicht in dem Projekt, das komische ist es das ja eigentlich alles funktioniert und richtig ist nur beim Ändern eines Eintrags will er einfach nicht die erste Spalte anpassen. Füge ich einen weiteren Eintrag hinzu, wird die Spalte korrekt angepasst.

Delphi-Quellcode:
var
  Node: PVirtualNode;
  Data: PDataset;

begin
Node := vstTable.FocusedNode;
if Assigned(Node) then
begin
  Data := vstTable.GetNodeData(Node);
  if Assigned(Data) then
  begin
    Data.Name := edtName.Text; //1. Spalte, hier wird eine längere Bezeichnung eingegeben
    Data.Type := edtType.Text; //2. Spalte, hier wird ebenfalls etwas längeres Eingetragen
  end;
end;

//Spalten anpassen...
vstTable.Header.AutoFitColumns(False, smaUseColumnOption, 0, vstTable.Header.Columns.Count-1);
Jetzt passiert folgendes, Spalte 2 hat die korrekte und angepasste Breite und Spalte 1 bleibt unverändert und somit zu klein. Dazu kommt noch das erst wenn ich auf eine andere Zeile wechsle werden in der 1. Spalte die drei Punkte gezeichnet.

Hm, also intern wird für den Aufruf von AutoFitColumns die Position der Spalte benutzt:

Delphi-Quellcode:
AutoFitColumns(True, smaUseColumnOption, FColumns[FColumns.FTrackIndex].FPosition, FColumns[FColumns.FTrackIndex].FPosition)
Diese muss jedoch nicht immer zwingend mit dem ColumnIndex übereinstimmen. Vielleicht liegt es ja daran.
Ansonsten kann es fast nur noch an den Optionen für die Spalte bzw. den Tree liegen

madas

Aviator 4. Apr 2017 09:59

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Hast du dir denn auch die ColumnOptions der ersten Column angeschaut? Ist dort die entsprechende Option aktiviert?

TUX_der_Pinguin 4. Apr 2017 10:03

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Zitat:

Zitat von Aviator (Beitrag 1366349)
Hast du dir denn auch die ColumnOptions der ersten Column angeschaut? Ist dort die entsprechende Option aktiviert?

Ich weiß zwar nicht welche Option du meinst, aber müsste das dann nicht generell funktionieren bzw. generell nicht funktionieren. Weil es klappt ja beim hinzufügen von neuen Einträgen, nur ändern geht nicht.

madas 4. Apr 2017 10:06

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1366350)
Zitat:

Zitat von Aviator (Beitrag 1366349)
Hast du dir denn auch die ColumnOptions der ersten Column angeschaut? Ist dort die entsprechende Option aktiviert?

Ich weiß zwar nicht welche Option du meinst, aber müsste das dann nicht generell funktionieren bzw. generell nicht funktionieren. Weil es klappt ja beim hinzufügen von neuen Einträgen, nur ändern geht nicht.

Delphi-Quellcode:
DefaultColumnOptions = [coAllowClick, coDraggable, coEnabled, coParentColor, coParentBidiMode, coResizable, coShowDropmark, coVisible, coAllowFocus, coEditable];
nix
Delphi-Quellcode:
coSmartResize
zu sehen.

TUX_der_Pinguin 4. Apr 2017 10:11

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Zitat:

Zitat von madas (Beitrag 1366351)
Delphi-Quellcode:
DefaultColumnOptions = [coAllowClick, coDraggable, coEnabled, coParentColor, coParentBidiMode, coResizable, coShowDropmark, coVisible, coAllowFocus, coEditable];
nix
Delphi-Quellcode:
coSmartResize
zu sehen.

Selbst wenn ich coSmartResize hinzufüge ändert sich am Verhalten nichts, Spalte 1 bleibt Stur und das komische ist sie wird ja nicht mals neu gezeichnet, erst wenn man das manuell anstößt mit
Delphi-Quellcode:
vstTable.invalidate
Ändere ich den Inhalt z.B. in Spalte 2 wird die Spalte sofort angepasst, neu gezeichnet und alles ist wunderbar.

madas 4. Apr 2017 10:23

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1366352)
Zitat:

Zitat von madas (Beitrag 1366351)
Delphi-Quellcode:
DefaultColumnOptions = [coAllowClick, coDraggable, coEnabled, coParentColor, coParentBidiMode, coResizable, coShowDropmark, coVisible, coAllowFocus, coEditable];
nix
Delphi-Quellcode:
coSmartResize
zu sehen.

Selbst wenn ich coSmartResize hinzufüge ändert sich am Verhalten nichts, Spalte 1 bleibt Stur und das komische ist sie wird ja nicht mals neu gezeichnet, erst wenn man das manuell anstößt mit
Delphi-Quellcode:
vstTable.invalidate
Ändere ich den Inhalt z.B. in Spalte 2 wird die Spalte sofort angepasst, neu gezeichnet und alles ist wunderbar.

Hm. Dann könnte eventuell nur noch durch irgend etwas die AutoFit-Operation gecancelt werden.

Delphi-Quellcode:
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;
not TreeView.OperationCanceled

Binde doch die Unit einfach mal in Dein Projekt ein und debugge das Ganze.

Viel Erfolg.

madas

TUX_der_Pinguin 4. Apr 2017 10:35

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
 
Es wird immer lustiger, ich gucke gerade was den
Delphi-Quellcode:
AutoFitColumns
so tatsächlich macht.

Delphi-Quellcode:
  ShowMessage(vstTable.GetMaxColumnWidth(0, True).ToString); //Hier ist die Spalte 69px breit
  ShowMessage(vstTable.GetMaxColumnWidth(1, True).ToString); //Hier ist die Spalte 49px breit

  Node := vstTable.FocusedNode;
  if Assigned(Node) then
  begin
    Data := vstTable.GetNodeData(Node);
    if Assigned(Data) then
    begin
      Data.Name := 'skljglsjfgskjfsldjfksjlfkjsd'; //neuer Text ist länger als alle anderen
      Data.Type := 'dfkgjdkjgfklgjdkjgkljgkdjkkgdljgkdjgdgfdgld'; //neuer Text ist länger als alle anderen
    end;
  end;

  ShowMessage(vstTable.GetMaxColumnWidth(0, True).ToString); //Hier ist die Spalte 69px breit -> FALSCH
  ShowMessage(vstTable.GetMaxColumnWidth(1, True).ToString); //Hier ist die Spalte 129px breit -> RICHTIG
Irgendwie scheint
Delphi-Quellcode:
GetMaxColumnWidth
beim Ändern des Inhaltes von Spalte 1 zu versagen ..


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:25 Uhr.
Seite 1 von 5  1 23     Letzte »    

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