Folgender Code im Listview-Resize könnte ein Ansatz sein. Dabei werden die Prozente nicht global abgelegt, sondern aus der aktuellen Aufteilung ermittelt. Ausnahme ist die initiale Anzeige.
Delphi-Quellcode:
procedure TForm154.ListView1Resize(Sender: TObject);
var
I: Integer;
widthArr: TArray<Double>;
cnt: Integer;
totalWidth: Integer;
begin
cnt := ListView1.Columns.Count;
SetLength(widthArr, cnt);
totalWidth := 0;
for I := 0 to cnt - 1 do begin
totalWidth := totalWidth + ListView1.Columns[I].Width;
end;
if totalWidth = 0 then begin
{ initiale Aufteilung festlegen }
widthArr[0] := 0.16;
widthArr[1] := 0.16;
widthArr[2] := 0.20;
widthArr[3] := 0.20;
widthArr[4] := 1 - Sum(Copy(WidthArr, 0, 4));
end
else begin
for I := 0 to cnt - 1 do begin
widthArr[I] := ListView1.Columns[I].Width/totalWidth;
end;
end;
totalWidth := 0;
for I := 0 to cnt - 2 do begin
ListView1.Columns[I].Width := Round(ListView1.ClientWidth*widthArr[I]);
totalWidth := totalWidth + ListView1.Columns[I].WidthType;
end;
{ wegen Rundungsfehlern bekommt die letzte Spalte einfach den Rest }
ListView1.Columns[cnt - 1].Width := ListView1.ClientWidth - totalWidth;
end;