Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft? (https://www.delphipraxis.net/163300-spaltenreihenfolge-tlistview-aendern-mit-listview_setcolumnorderarray-fehlerhaft.html)

Luckie 26. Sep 2011 11:17

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ListView1.Columns[0].Caption);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ListView1.Columns[0].Index := 1;
end;
Button1 zeigt die richtige Caption an.

CCRDude 26. Sep 2011 11:41

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Genau was DeddyH gesagt hat - SetIndex ist über die property Index verfügbar.

Weil TListView gerade mein Lieblingsbugsuchkind ist, habe ich das eben auch ausprobiert - zu Luckies Beispiel möchte ich nur noch ergänzen, daß bei mir danach ein ListView1.Refresh notwendig war, weil nach Zuweisung des Index nur der Header, nicht aber die Daten, aktualisiert waren (nach dem Refresh war dann alles okay).

Luckie 26. Sep 2011 11:46

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
OK, das kann sein. Ich habe eben nur schnell einen Listview genommen, Spalten mit dem Oi angelegt und mir nicht noch die Mühe gemacht Daten dazu einzugeben.

delphitrixer 26. Sep 2011 11:50

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Das mit dem .Index ist mir soweit klar aber soweit ich das beurteilen kann habe ich ein Problem, wenn ich mehrere Spalten verschieben möchte.

Wenn ich also die Spalten 1, 2, 3, 4 und 5 z.B in eine komplett neue Reihenfolge umsortieren will bekomme ich doch Probleme, weil sich Spalten mit jedem .index := x wieder veränder.

Wenn also

1 = 1
2 = 3
3 = 5
4 = 3
5 = 4

werden soll' dann lässt sich das mit einer Schleife nich bewerkstelligen, da nach jedem .index := x sich alles wieder ändert.

oder blick ich da schon wieder nicht durch?

Luckie 26. Sep 2011 11:53

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Du musst natürlich nach jeder Änderung diese in den folge Änderungen berücksichtigen.

delphitrixer 26. Sep 2011 12:06

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Ich denke, dass wird bei z.B. 5 Spalten noch einigermassen gehen, aber ich habe ca. 50 Spalten die individuell pro Benutzer umsortiert werden sollen. Es geht schlussendlich darum, dass sich ein Benutzer die Spalten per Drag&Drop verschieben kann, die Reihenfolge in der DB gespeichert wird und später wieder geladen wird. Das funktioniert zwar alles, nur kann nach dem Laden der Reihenfolge eben nicht mehr korrekt auf den Inhalt zugegriffen werden, weil die "interne" Columnorder von Delphi nicht stimmt.

Dabei den Überblick zu behalten welche Spalte schlussendlich wohin soll, dürfte via .index fast unmöglich sein.

Deshalb bin ich vermutlich auch auf den direkten API Aufruf gekommen. Irgenwie müsste nun hinterher nur noch der Spaltenorder von Delphi wieder aktualisiert werden.

ChrisE 26. Sep 2011 12:42

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Hallo,

also zumindest da kann ich dir den denk anstoß geben, den ich dann gefolgt bin. Ich bau die Columns immer komplett neu auf, nachdem der User es angepasst hat. Die Tag-Eigenschaft speichert die Identifizierung zur DB-Column. Somit spreche ich die Column nur noch über die Tag-Eigenschaft an bzw- im OnData-Event werden die Daten aus der DBColumn[Column.Tag] geholt. Das ganze geschickt mit beginUpdate/EndUpdate gekoppelt und der Anwender sieht nicht mal was flackern. Bedingung ist halt, dass die Daten für ListView im OnData-Event geholt werden, und nicht jedesmal komplett gefüllt werden.

Alternativ eine andere Komponente für TListView suchen - mir fällt nur gerade der Name nicht ein :-(

Gruß, Chris

[Edit]Solltest du dann auch über die Tag-Eigenschaft gehen, bitte aufpassen. Den hier tritt dann zumindest bei Delphi 2007 dieses merkwürdige Verhalten auf, dasd ich dir in meinem ersten Beitrag gepostet habe[/Edit]

DeddyH 26. Sep 2011 12:43

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Du meinst wahrscheinlich den Virtual StringTree.

ChrisE 26. Sep 2011 12:45

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Zitat:

Zitat von DeddyH (Beitrag 1126688)
Du meinst wahrscheinlich den Virtual StringTree.

Genau :thumb:

delphitrixer 26. Sep 2011 15:29

AW: Spaltenreihenfolge TListView ändern mit ListView_SetColumnOrderArray fehlerhaft?
 
Ich habe nun aus den verschiedenen Antworten und Lösungsansätzen von Euch eine für mich funktionierende Lösung gefunden. Wie von ChrisE vorgeschlagen arbeite ich nun mit den ListView.Column[x].Tag in Verbindung mit dem SetIndex (ListView.Column[x].Index := x) um mir die Spaltenreihenfolge zu merken bzw. pro Benutzer wieder zu setzen.

Die direkten API-Aufrufe von "ListView_SetColumnOrderArray" und "ListView_GetColumnOrderArray" habe ich aus dem Code verbannt.

Mit Euren Ideen und Vorschlägen habt Ihr mir Alle zu den richtigen Denkanstössen verholfen. Teilweise ist man einfach etwas "festgefahren".

Vielen Dank an Euch Alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr.
Seite 2 von 2     12   

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