Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TListColumn.Caption zur Laufzeit ändern


bug0815 - Fr 17.07.09 14:05
Titel: TListColumn.Caption zur Laufzeit ändern
Hallo zusammen,

ich versuche verzweifelt zur Laufzeit an einem bestehenden ListView eine Spaltenbeschriftung zu ändern. Bis jetzt leider ohne Erfolg. Den verwendeten Code findet Ihr unten, die auskommentierten Zeilen habe ich in allen erdenklichen Kombinationen bereits probiert.

Wenn ich den Wert von .Caption oder .DisplayName im Debugger verfolge, wird der richtige Wert gesetzt und ist auch beim zweiten Durchlauf noch erhalten. Die Spalte zeigt aber beharrlich noch ihre alte Caption an.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
//Erster Versuch
//LV_Positionen.Columns.BeginUpdate; 
LV_Positionen.Columns[3].Caption     := 'Beschreibung (gefiltert)';
//LV_Positionen.Columns[3].DisplayName := 'Beschreibung (gefiltert)';
//LV_Positionen.Columns.EndUpdate;
   
//Zweiter Versuch
//LV_Positionen.Columns.BeginUpdate;
LV_Positionen.Columns.Items[3].Caption     := 'Beschreibung (gefiltert)';
//LV_Positionen.Columns.Items[3].DisplayName := 'Beschreibung (gefiltert)';
//LV_Positionen.Columns.EndUpdate;


Hat wer einen Ansatz für mich?

lg,
Andi


Renegade - Fr 17.07.09 14:10

Versuch mal folgendes:


Delphi-Quelltext
1:
2:
 Listview1.Column[0].Caption:='Test';
 Listview1.Invalidate;


bug0815 - Mo 20.07.09 09:08

.Invalidate war ein Sache die ich noch nicht probiert habe. Das ganze restliche Programm habe ich schon durch. (.Refresh, .Repaint, .Update)

Leider alles ohne Erfolg, ich stehe also immer noch auf dem Schlauch.

lg,
Andi


Lannes - Mo 20.07.09 09:32

Hallo,

das verändern der Caption wird eigentlich automatisch ausgeführt.

Benutz Du eventuell Items.BeginUpdate ohne EndUpdate, das hat auch Einfluss auf das aktualisieren der Caption.
Besteht das Problem bei allen Spalten der ListView?
Benutzt Du eine OnDraw...-Ereignis?

Hast Du das Problem auch bei einem reduzierten Projekt?


bug0815 - Mo 20.07.09 14:10

Zitat:
Benutz Du eventuell Items.BeginUpdate ohne EndUpdate, das hat auch Einfluss auf das aktualisieren der Caption.

Beim Laden der Items nutze ich Items.BeginUpdate und Items.EndUpdate. An dieser Stelle ist (oder sollte) allerdings die Umschaltung der Spaltenüberschrift schon lange passiert sein.

Zitat:
Besteht das Problem bei allen Spalten der ListView?

Ja, das Problem besteht bei allen Spalten.

Zitat:
Benutzt Du eine OnDraw...-Ereignis?

Nein, eines der .OnDraw Ereignisse nutze ich in diesem Fall nicht.

Zitat:
Hast Du das Problem auch bei einem reduzierten Projekt?

Ja, das (Fehl)Verhalten lässt sich mit jedem ListView hinstellen.

-----

Ich habe das Problem jetzt über die StateImages gelöst, aber der andere Weg muss ja auch irgendwie funktionieren.

lg,
Andi


Lannes - Mo 20.07.09 14:13

Hallo,

was hat StateImages mit Column[x].Caption zu tun :gruebel:


bug0815 - Mo 20.07.09 14:54

Tja, wenn man es nicht schafft die Spaltenbeschriftung von "Beschreibung" auf "Beschreibung (gefiltert)" zu ändern, dann zeigt man halt ein entsprechendes StateImage (bzw. Spaltenimage) an. :wink:

Hat nichts mit der anderen Sache zu tun, ist nur ein anderer Lösungsansatz. Es würde mich allerdings doch interessieren wie man die Spaltenbeschriftungen zur Laufzeit ändern kann.

lg,
Andi


Lannes - Mo 20.07.09 16:14

Hallo,

user profile iconbug0815 hat folgendes geschrieben Zum zitierten Posting springen:
Es würde mich allerdings doch interessieren wie man die Spaltenbeschriftungen zur Laufzeit ändern kann.
so wie Du es im Anfangspost beschrieben hast, interressant ist doch eher die Ursache des Fehlverhaltens.

user profile iconbug0815 hat folgendes geschrieben Zum zitierten Posting springen:
Ja, das (Fehl)Verhalten lässt sich mit jedem ListView hinstellen.

mach doch mal eine Demo-Projekt mit dem Fehler und lade das -incl. exe und allen Projektdateien- hier hoch, dann kann man mal auf Fehlersuche gehen.


bug0815 - Di 21.07.09 09:43

Beim erstellen des Demo-Projektes hab ich mir meinen Code noch mal etwas genauer angeschaut und :autsch:.

In der Zeile 16 hat sich ein CopyAndPaste Fehler eingeschlichen, welcher meine Spalten durch ein fehlendes LV_Positionen.Columns.EndUpdate blockiert hatte.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
  LV_Positionen.Columns.BeginUpdate;
  myColumn          := LV_Positionen.Columns.Add;
  myColumn.Caption  := EmptyStr;
  myColumn.Width    := 20;
  myColumn.MinWidth := 20;
  myColumn.MaxWidth := 20;
  myColumn          := LV_Positionen.Columns.Add;
  myColumn.Caption  := 'App';
  myColumn.Width    := 44;
  myColumn          := LV_Positionen.Columns.Add;
  myColumn.Caption  := 'Vepos';
  myColumn.Width    := 44;
  myColumn          := LV_Positionen.Columns.Add;
  myColumn.Caption  := 'Beschreibung';
  myColumn.Width    := 500;
  LV_PositionenAuswahl.Columns.EndUpdate;

  //PositionenAuswahl
  LV_PositionenAuswahl.Columns.BeginUpdate;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := EmptyStr;
  myColumn.Width    := 20;
  myColumn.MinWidth := 20;
  myColumn.MaxWidth := 20;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := 'App';
  myColumn.Width    := 44;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := 'Vepos';
  myColumn.Width    := 44;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := 'Beschreibung';
  myColumn.Width    := 470;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := 'Anzahl';
  myColumn.Width    := 62;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := 'IsKauf';
  myColumn.Width    := 0;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := 'IsDemo';
  myColumn.Width    := 0;
  myColumn          := LV_PositionenAuswahl.Columns.Add;
  myColumn.Caption  := 'Zusatztext';
  myColumn.Width    := 0;
  LV_PositionenAuswahl.Columns.EndUpdate;


Danke Euch für die Tipps, das Problem sitzt mal wieder an der Tastatur. :wink:

lg,
Andi