TListView - Spaltenbreite über MaxWidth steuern

Rund um die LCL und andere Komponenten
Antworten
RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

TListView - Spaltenbreite über MaxWidth steuern

Beitrag von RuhrPotto »

Hallo zusammen!

Ich versuche, in einer ListView die Spaltenbreite über die Spalteneigenschaft MaxWidth steuern:

Code: Alles auswählen

 
    item
          AutoSize = True
          Caption = 'Empfänger'
          MaxWidth = 150
          MinWidth = 100
          Width = 97
    end 
 
Zur Laufzeit kann es sein, dass in diese Spalte sehr lange Strings eingestellt werden. Ich bin davon ausgegangen, dass die Spaltenbreite dann auf 150 beschränkt und der Text autonatisch verkürzt wird:
blablablablablablablablablablablablablablablabla
wird zu
blablablablablablablabla...

Beim manuellen Verkürzen tritt dies auch ein - aber es hat den Anschein, dass die MinWidth / MaxWidth Angaben vollkomen ignoriert werden.

Meine Fragen:
1. Hab ich bei der Interpretation der beiden Werte einen krassen Denkfehler oder muss die Spaltenbreite manuelle über Width nach dem Einlesen der Liste manuell steuern?
2. Wie kann eine Änderung der Spaltenbreite durch den Anwender verhindert werden?
Jeder macht Fehler - viele Fehler brauchen EDV!

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView - Spaltenbreite über MaxWidth steuern

Beitrag von wp_xyz »

Die Spaltenbreite wird durch Width eingestellt, nicht durch MaxWidth. MaxWidth und MinWidth begrenzen die Spaltenbreite bei Änderung mit der Maus - genauer: sollten begrenzen: Denn wie du schon feststellst, ignoriert Lazarus (auch im aktuellen Trunk) diese Vorgabe (im Gegensatz zu Delphi). Ich habe noch einen alten Laz 1.0 auf der Platte, auch da gibt es dieses Problem schon. Komisch, dass das noch niemandem aufgefallen ist. Wäre einen Bugreport wert...

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: TListView - Spaltenbreite über MaxWidth steuern

Beitrag von RuhrPotto »

@wp_xyz Danke für die schnelle Rückmeldung. Ja ich sehe es auch als Bug an - um den Bugreport kümmer ich mich später.

Falls andere das gleiche Problem haben - hier mal ein schneller Workaround als Lösung des Problems:

Code: Alles auswählen

 
unit UnitTools;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils,  Graphics, Controls, Forms, DateUtils, Dialogs, LazUtf8, MMSystem, LCLIntf,ComCtrls;
  ...
   procedure SetListWidth(var list:TListView;const scol:array of integer);
 
implementation  
 
//scol = Spalten der Listview deren Breite geprüft/geändert weren soll - in sortierter Folge aufsteigend übergeben!
procedure SetListWidth(var list: TListView; const scol: array of integer);
var
  i : integer;
  lc : set of byte;
begin
  if length(scol) > 255 then
    begin
      ShowMessage('SetListWidth Param-Error - Abbruch');
      EXIT;
    end
  else
    begin
      lc := [];
      for i := 0 to High(scol) do lc := lc + [scol[i]];
    end;
 
  for i := 0 to list.Columns.Count -1 do
  begin
 
    if i in lc then
    begin
      if list.Column[i].AutoSize then list.Column[i].AutoSize := false;
 
      if  (list.Column[i].Width < list.Column[i].MinWidth)
      and (list.Column[i].MinWidth > 0)
      then list.Column[i].Width := list.Column[i].MinWidth;
 
      if  (list.Column[i].Width > list.Column[i].MaxWidth)
      and (list.Column[i].MaxWidth > 0)
      then list.Column[i].Width := list.Column[i].MaxWidth;
 
    end;  //if i in lc then
  end;    //for i := 0 to list.Columns.Count -1 do
end;  
 
Aufruf im Programmteil

Code: Alles auswählen

 
lvBuch.BeginUpdate;
 
  SetListWidth(lvBuch,[3,4]); //Anpassen 4. und 5. Spalte!
 
  for i := 0 to High(aBuch) do
  begin
    lt := lvBuch.Items.Add;     
   ...
 
Hat bei mir das Problem behoben und lässt sich bei Einbindung in einer Toolunit für beliebige Listviews im Programm nutzen.
Jeder macht Fehler - viele Fehler brauchen EDV!

Antworten