![]() |
ListView Spaltenbreite bei Form onResize neu berechnen?
Ich stehe wieder vor einem kleinen Problem.
Ich habe eine ListView mit ein paar Spalten. Sagen wir der einfachheithalber mal 5. Aktuell ist es so, dass ich in einem Array in Prozent stehen habe, wie breit jede Spalte beim Form OnResize sein soll.
Delphi-Quellcode:
(Edit: [0 .. 4] hinzugefügt, vergessen gehabt)
aColumnDefWidth: array[0 .. 4] of Byte = (16, 16, 20, 20, 25); // = 97%
Mein Helfer:
Delphi-Quellcode:
Und im FormResize dann in etwa
function getPercentageValue(const aBase: Extended; const aPercentage: Extended): Int64;
begin if (aPercentage > 0) and (aBase > 0) then Result := Trunc(aBase / 100 * aPercentage) else Result := 0; end;
Delphi-Quellcode:
Das funktioniert wunderbar. Beim verändern der Größe meines Formulars werden alle Spalten genau so groß (in Prozent) gemacht, wie ich es in aColumnDefWidth definiert habe.
for i := 0 to ListView1.Columns.Count - 1 do
ListView1.Columns[i].Width := getPercentageValue(ListView1.Width, aColumnDefWidth[i]) - 2; Nun zum Problem bzw. zur Frage: angenommen ich verändere die Spaltenbreite manuell im ListView zur Laufzeit - wie schaffe ich es, dass die prozentuale von mir zur Laufzeit veränderte Breite beibehalten wird? |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Im Ereignis OnColumnResize des Listviews Deine Routine aufrufen?
|
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Wie genau müsste ich die da denn aufrufen?
Verstehe ich gerade nicht so genau. Ich verändere ja die Größe der kompletten Anwendung, nicht die einer einzelnen Spalte. Edit: OnColumnResize gibt es bei mir gar nicht. |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Sorry, hatte in der Delphi 7 versehentlich in die CLX-Hilfe geschaut, statt in die der VCL.
Die VCL scheint das Ereignis nicht zu kennen :-( Schade. Dann eventuell im Ereignis OnMouseUp. Dort die Position des Mauszeigers ermitteln und wenn der innerhalb der Spaltenüberschriften ist wieder
Delphi-Quellcode:
aufrufen. Nur macht das ja dann die Änderung der Spaltenbreite wieder rückgängig.
for i := 0 to ListView1.Columns.Count - 1 do
ListView1.Columns[i].Width := getPercentageValue(ListView1.Width, aColumnDefWidth[i]) - 2; |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Hmm..
Oder statt des Rückgängig machens, speicherst Du in deinem Array die veränderten Prozentwerte und behält somit das Spaltenverhältnis. |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Verstehe nicht warum du ein Array für die Spaltenbreite benötigst.
Verwende doch einfach LVSCW_AUTOSIZE oder LVSCW_AUTOSIZE_USEHEADER gruss |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Liste der Anhänge anzeigen (Anzahl: 1)
![]()
Delphi-Quellcode:
// List View Column Autosize (Virtual Mode)
unit Unit1; interface uses // Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, StdCtrls, // Forms, Dialogs, StrUtils, ComCtrls, CommCtrl; Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Winapi.CommCtrl, Vcl.StdCtrls, System.StrUtils, Vcl.ExtCtrls; type TSampleRecord = record Column1: string; Column2: string; Column3: string; Column4: string; end; TSampleArray = array [0..49] of TSampleRecord; type TForm1 = class(TForm) Button1: TButton; ListView1: TListView; Panel1: TPanel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormResize(Sender: TObject); private SampleArray: TSampleArray; procedure AutoResizeColumn(const AListView: TListView; const AColumn: Integer); procedure OnListViewData(Sender: TObject; Item: TListItem); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // TForm1.AutoResizeColumn - auto-size column // AListView - list view object instance // AColumn - index of the column to be auto-sized procedure TForm1.AutoResizeColumn(const AListView: TListView; const AColumn: Integer); var S: string; I: Integer; MaxWidth: Integer; ItemWidth: Integer; begin // set the destination column width to the column's caption width // later on we'll check if we have a wider item MaxWidth := ListView_GetStringWidth(AListView.Handle, PChar(AListView.Columns.Items[AColumn].Caption)); // iterate through all data items and check if their captions are // wider than the currently widest item if so then store that value for I := 0 to High(SampleArray) do begin case AColumn of 0: S := SampleArray[I].Column1; 1: S := SampleArray[I].Column2; 2: S := SampleArray[I].Column3; 3: S := SampleArray[I].Column4; end; ItemWidth := ListView_GetStringWidth(AListView.Handle, PChar(S)); if MaxWidth < ItemWidth then MaxWidth := ItemWidth; end; // here is hard to say what value to use for padding to prevent the // string to be truncated; I've found the suggestions to use 6 px // for item caption padding and 12 px for subitem caption padding, // but a few quick tests confirmed me to use at least 7 px for items // and 14 px for subitems if AColumn = 0 then MaxWidth := MaxWidth + 7 else MaxWidth := MaxWidth + 14; // and here we set the column width with caption padding included AListView.Columns.Items[AColumn].Width := MaxWidth; end; // TForm1.FormCreate - setup the list view and fill custom data procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin ListView1.ViewStyle := vsReport; ListView1.Columns.Add.Caption := 'Column 1'; ListView1.Columns.Add.Caption := 'Column 2'; ListView1.Columns.Add.Caption := 'Column 3'; ListView1.Columns.Add.Caption := 'Column 4'; ListView1.OwnerData := True; ListView1.OnData := OnListViewData; ListView1.Items.Count := High(SampleArray); for I := 0 to High(SampleArray) do begin SampleArray[I].Column1 := 'Cell [0, ' + IntToStr(I) + '] ' + DupeString('x', I); SampleArray[I].Column2 := 'Cell [1, ' + IntToStr(I) + '] ' + DupeString('x', High(SampleArray) - I); SampleArray[I].Column3 := 'Cell [2, ' + IntToStr(I) + '] ' + DupeString('x', I); SampleArray[I].Column4 := 'Cell [3, ' + IntToStr(I) + '] ' + DupeString('x', High(SampleArray) - I); end; end; // TForm1.FormCreate - custom handler for OnData event procedure TForm1.OnListViewData(Sender: TObject; Item: TListItem); begin Item.Caption := SampleArray[Item.Index].Column1; Item.SubItems.Add(SampleArray[Item.Index].Column2); Item.SubItems.Add(SampleArray[Item.Index].Column3); Item.SubItems.Add(SampleArray[Item.Index].Column4); end; // TForm1.Button1Click - auto-resize all 4 columns procedure TForm1.Button1Click(Sender: TObject); begin AutoResizeColumn(ListView1, 0); AutoResizeColumn(ListView1, 1); AutoResizeColumn(ListView1, 2); AutoResizeColumn(ListView1, 3); end; procedure TForm1.FormResize(Sender: TObject); begin Button1.Click; end; end. |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Bei mir muss die Variable so aussehen:
Delphi-Quellcode:
Im Übrigen halte ich die prozentuale Aufteilung nicht für sinnvoll,
aColumnDefWidth: array [0..4] of Byte = (16, 16, 20, 20, 25); // = 97%
weil auf den Inhalt keine Rücksicht genommen wird. |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Zitat:
Zitat:
Sie sollen nicht auto-angepasst und es soll nicht die Mindest-Größe berechnet werden. Bestes Beispiel für mein Vorhaben bietet der JDownloader 2.0. Die einfachste Möglich wäre mit einem OnColumnResize-Event. Das hat die normale ListView aber nicht und eine extra Komponente möchte ich dafür nicht installieren. |
AW: ListView Spaltenbreite bei Form onResize neu berechnen?
Wie gehst du denn damit um, wenn der User eine Spaltenbreite ändert? Damit würde ja die Summe aller Spaltenbreiten nicht mehr den Listview komplett ausfüllen und deine Prozente passen nicht mehr.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz