AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst
Thema durchsuchen
Ansicht
Themen-Optionen

TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

Ein Thema von TUX_der_Pinguin · begonnen am 4. Apr 2017 · letzter Beitrag vom 6. Apr 2017
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#1

TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 08:55
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.
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 10:05
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 OnBeforeAutoFitColumns ausgelöst wird (wenn denn ein EventHandler existiert).

Hier gibt es einen Parameter 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 smaUseColumnOption .

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

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 10:30
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 OnBeforeAutoFitColumns ausgelöst wird (wenn denn ein EventHandler existiert).

Hier gibt es einen Parameter 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 smaUseColumnOption .

Und das ist der Knackpunkt. Hast du auch bei deiner ersten Column die Option in den ColumnOptions eingeschaltet?
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.
  Mit Zitat antworten Zitat
madas

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

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 10:54
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 OnBeforeAutoFitColumns ausgelöst wird (wenn denn ein EventHandler existiert).

Hier gibt es einen Parameter 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 smaUseColumnOption .

Und das ist der Knackpunkt. Hast du auch bei deiner ersten Column die Option in den ColumnOptions eingeschaltet?
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:

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

Geändert von madas ( 4. Apr 2017 um 11:01 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 10:59
Hast du dir denn auch die ColumnOptions der ersten Column angeschaut? Ist dort die entsprechende Option aktiviert?
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 11:03
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.
  Mit Zitat antworten Zitat
madas

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

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 11:06
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.
DefaultColumnOptions = [coAllowClick, coDraggable, coEnabled, coParentColor, coParentBidiMode, coResizable, coShowDropmark, coVisible, coAllowFocus, coEditable]; nix coSmartResize zu sehen.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 11:11
DefaultColumnOptions = [coAllowClick, coDraggable, coEnabled, coParentColor, coParentBidiMode, coResizable, coShowDropmark, coVisible, coAllowFocus, coEditable]; nix 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 vstTable.invalidate Ändere ich den Inhalt z.B. in Spalte 2 wird die Spalte sofort angepasst, neu gezeichnet und alles ist wunderbar.
  Mit Zitat antworten Zitat
madas

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

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 11:23
DefaultColumnOptions = [coAllowClick, coDraggable, coEnabled, coParentColor, coParentBidiMode, coResizable, coShowDropmark, coVisible, coAllowFocus, coEditable]; nix 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 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
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: TVirtualStringTree AutoFitColumns erste Spalte wird nicht angepasst

  Alt 4. Apr 2017, 11:35
Es wird immer lustiger, ich gucke gerade was den 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 GetMaxColumnWidth beim Ändern des Inhaltes von Spalte 1 zu versagen ..
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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:14 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