AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein ListView Spaltenbreite bei Form onResize neu berechnen?
Thema durchsuchen
Ansicht
Themen-Optionen

ListView Spaltenbreite bei Form onResize neu berechnen?

Ein Thema von a.def · begonnen am 17. Jan 2017 · letzter Beitrag vom 18. Jan 2017
Antwort Antwort
Seite 2 von 2     12   
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#11

AW: ListView Spaltenbreite bei Form onResize neu berechnen?

  Alt 18. Jan 2017, 09:58
Ich habe leider keine Lösung für dich die mit dem TListView funktioniert.

Nur einen Tipp mit welcher Komponente du in Zukunft deine Anwendungen entwickeln könntest/solltest: VirtualTreeView (GitHub)

Wenn du dich doch dazu durchringen kannst eine andere Komponente zu nutzen, dann würde ich dir die Komponente wärmstens ans Herz legen. Dort kannst du nämlich alles frei definieren. Die Lernkurve ist zwar sehr steil beim VST, aber es loht sich definitiv.

Und du brauchst die Komponente ja auch nicht zu installieren, einfach nur eine Instanz erzeugen und fertig.

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.
Wenn der User unbedingt eine Spaltenbreite verändern will, dann muss er für mein Empfinden damit leben, dass die Spaltenbreite aller Spalten eben etwas "überhängt". Alternativ könnte man aus dem Array das die Prozentwerte der Spalten angibt einen Record machen und den noch mit einer Property Priority versehen. Die höchste Priorität (1) bleibt unverändert, die niedrigste Priorität (bspw. 5) wird in der Breite so verkleinert, dass noch alles auf den Schirm passt.

Wenn man es dann richtig machen will, dann spendiert man dem Record noch eine Property MinWidth . Würde der Wert unterschritten, dann geht man zur nächsten Spalte und verkleinert diese. Wurde die Spalte vom Benutzer jetzt so groß gezogen, dass, selbst wenn alle Spalten auf MinWidth runtergerechnet wurden, nicht alles auf den Schirm passt, dann hat der User eben Pech gehabt und muss horizontal scrollen.

Das wäre jetzt mal meine schnell dahingeschriebene Vorgehensweise.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#12

AW: ListView Spaltenbreite bei Form onResize neu berechnen?

  Alt 18. Jan 2017, 10:01
Genau daran arbeite ich gerade aber es geht alles schief.

Meine Idee ist aktuell WMEnterSizeMove-Event die aktuellen, prozentualen Breiten aller Spalten in ein extra Array zu schreiben
und dann im FormResize-Event wieder umzurechnen. Klappt aber nicht ganz.

Delphi-Quellcode:
procedure TForm1.WMEnterSizeMove(var msg: TMessage);
var
 i: Byte;
begin
 iAllColWidth := 0;
 for i := 0 to ListView1.Columns.Count - 1 do
  Inc(iAllColWidth, ListView1.Columns[i].Width);

 SetLength(lvDefaultWidthInPercent, Length(aDefaultSettings.lvDefaultWidthInPercent));
 for i := 0 to ListView1.Columns.Count - 1 do
  lvDefaultWidthInPercent[i] := getPercent(iAllColWidth, ListView1.Column[i].Width);

 inherited;
end;

// OnResize (Form)
for i := 0 to ListView1.Columns.Count - 1 do
 ListView1.Columns[i].Width := getPercentageValue(ListView1.Width, lvDefaultWidthInPercent[i]) - 2;
VirtualTreeView ist wirklich eine tolle Sache. Nur beherrscht die auch die verschiedenen Ansichten wie die ListView? Konnte ich auf deren Webseite noch nicht ausfindig machen.

Edit:
im Prinzip funktioniert alles mit obigen Code nun wie gewüscht. Einziges Problem ist, dass ich getPercentageValue als Base ListView1.Width übergebe und somit alle Spalten insgesamt immer maximal so breit sein können wie die ListView. iAllColWidth kann ich zwar übergeben, aber dann werden die Spalten kleiner statt größer

Geändert von a.def (18. Jan 2017 um 10:19 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: ListView Spaltenbreite bei Form onResize neu berechnen?

  Alt 18. Jan 2017, 11:07
VirtualTreeView ist wirklich eine tolle Sache. Nur beherrscht die auch die verschiedenen Ansichten wie die ListView? Konnte ich auf deren Webseite noch nicht ausfindig machen.
Also der VST ist ja darauf ausgelegt einen Tree anzuzeigen. Man kann ihn auch dazu "missbrauchen" eine Tabelle anzuzeigen was ja im Prinzip nichts anderes ist als Nodes nur auf der Root Ebene zu erzeugen welche eine bestimmte Anzahl an Spalten haben.

Die Kachel Ansicht funktioniert damit nicht direkt von Haus aus. Möglich wäre es schon indem man sehr viel selbst zeichnet (evtl. wäre hier der VirtualDrawTree der bessere Kandidat). Dann muss eben pro Node und pro Column unterschieden werden was man zeichnet und angeklickt hat. Ist etwas mehr Arbeit weil es nicht direkt die eigentliche Funktion abbildet, aber möglich ist es schon. Hatte mal so etwas ähnliches gemacht bei dem es darauf ankam, dass jede "Zelle" etwas spezielles machen sollte.

Durch die Abstraktion und das Virtuelle und die vielen Events die man zur Verfügung hat kann man sehr vieles mit der Komponente machen.

Aber man muss dazu sagen, dass man im Grunde alles selbst programmieren muss. Bei der ListView Komponente stellt man ja nur den Style um und schon hat man das gewünschte Ergebnis.

Das musst du also schlussendlich für dich selbst entscheiden ob sich der Aufwand für dich lohnt. Also ich will die Komponente nicht mehr missen und verwende sie fast überall für alles mögliche.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.995 Beiträge
 
Delphi 12 Athens
 
#14

AW: ListView Spaltenbreite bei Form onResize neu berechnen?

  Alt 18. Jan 2017, 11:14
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 21:57 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