Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#1

ListView Breite der letzten Spalte beim Resize der Form

  Alt 13. Okt 2023, 15:44
Hallo in die Gemeinde .

Gegeben sei ein TListView mit Anchors an allen 4 Kanten auf einem TForm. Die letzte Spalte des ListView soll immer die restliche Breite des ListView einnehmen, wenn das Formular in der Breite verändert wird. Ich will also eine Art TListColumn.AutoSize anhand der Breite statt des enthaltenen Texts. Dafür bietet sich das OnResize-Event des ListView an.
Delphi-Quellcode:
procedure TfmMain.ListViewResize(Sender: TObject);
var
  Llv: TListView;
  Lcolwidth, Ltotalcolwidth, i: integer;
  Lcol: TListColumn;
begin
    Llv:= nil;
    if Sender is TListView then
        Llv:= (Sender as TListView);
    if NOT Assigned(Llv) then
        Exit;
    Ltotalcolwidth:= 0;
    for i:= 0 to Pred(Llv.Columns.Count) do begin
        Inc(Ltotalcolwidth, Llv.Columns[i].Width);
    end;
    Lcol:= Llv.Columns[Llv.Columns.Count-1];
    Lcolwidth:= Llv.ClientWidth - Ltotalcolwidth - Lcol.Width;
    if (Lcolwidth >= Lcol.MinWidth) then
        Lcol.Width:= Lcolwidth;
end;
Probleme:
  • Das ListView flackert im unteren Bereich, weil der horizontale Scrollbalken ein- und ausgeblendet wird, wenn die Breite verkleinert wird. Der Scrollbalken verschwindet wieder, wenn man einmal auf den nach rechts zeigenden Pfeil klickt; es wäre also eigentlich gar nicht nötig, dass das ListView den Scrollbalken anzeigt.
    Es scheint so, als wird der Scrollbalken pro Pixel Verkleinerung abwechselnd entweder angezeigt oder ausgeblendet.
    Siehe auch Bild im Anhang (bitte Stil und teilweise fehlende Themes ignorieren).
  • Wenn eine der anderen Spalten vergrößert wird, wird die letzte Spalte bei einer Breitenänderung schmaler, unter Umständen sehr viel schmaler.

Erreichen will ich Folgendes:
  1. Die letzte Spalte soll beim Verändern der Breite den restlichen Raum einnehmen. Das ist mit obigem Code soweit abgedeckt.

  2. Sobald eine der anderen Spalten vergrößert wird, so dass das ListView einen horizontalen Scrollbalken anzeigt, soll die Breite der letzten Spalte nicht verändert werden, solange der Scrollbalken sichtbar ist. Damit soll vor allem verhindert werden, dass die letzte Spalte bei einer Breitenänderung plötzlich sehr schmal wird.
    Ich weiß, dass man mit GetWindowLong(Llv.Handle, GWL_STYLE); ermitteln kann, ob ein Scrollbalken sichtbar ist, aber die Flackerei macht eine sinnvolle Verwendung unmöglich, siehe nächster Punkt.

  3. Die Flackerei durch das Ein- und Ausblenden des horizontalen Scrollbalkens soll verschwinden oder unterdrückt werden.

Grüße
Dalai
Miniaturansicht angehängter Grafiken
dp_listview_breite-scrollbalken.png  
  Mit Zitat antworten Zitat