Hallo,
Die Problembeschreibung:
Ein Formular mit einer Listview im ViewStyle vsReport. OwnerData ist true. Es werden verschieden Columns erzeugt. Diese erhalten um sie später indentifiezieren zu können in der Tag-Property eine Nummer. Im OnData-Event wird dann aufgrund der Tag-Eigenschaft entschieden welcher Wert ausgegeben werden soll.
(hier ein Beispiel für die Ausgabe
)
Delphi-Quellcode:
procedure TForm52.ListView1Data(Sender: TObject; Item: TListItem);
var
i: Integer;
str_tmp: string;
begin
with Item do
begin
for i := 0 to ListView1.Columns.Count - 1 do
begin
str_tmp := Format('Row:%d i:%d Tag:%d ID:%d Index:%d', [Item.Index, i, ListView1.Column[i].Tag, ListView1.Column[i].ID, ListView1.Column[i].Index]);
if i = 0 then
begin
Item.Caption := str_tmp;
end else
begin
Item.SubItems.Add(str_tmp);
end;
end;
end;
end;
Der Anwender kann die Oberfläche umschalten zwischen "nur einen Eintrag auswählen" und eine Art Bearbeitungsmodus, in dem dann u.a. erlaubt sein soll viele Einträge zu selektieren.
Das Problem:
Wenn die Columns vom Anwender durch Drag&Drop verschoben werden, ändert sich u.a. die Tag-Eigenschaft der Columns ohne mein zutun. D.h. Die Column, wird im OnData-Event falsch wieder erkannt. Zu diesem Zeitpunkt scheint aber die Column-Nummer noch korrekt zu sein (also unverändert, obwohl jetzt an anderer Stelle).
Wird nun aber z.B. MultiSelect ein- oder ausgeschaltet stimmen die Werte für Tag wieder und die Column-Nummer entspricht auch wieder der "Sichtbarkeitsposition".
Grund dürfte das RecreateWND sein, dass hier intern aufgerufen wird, wenn der Wert von MultiSelect eines ListViews geändert wird.
Die Frage:
Wie relalisiere ich jetzt ein sauberes OnData-Event (Identifiezierung der Column)?
- Die Tag-Eigenschaft ist nicht zuverlässig, da ich nicht weiß, ob der Anwender die Column verschoben hat oder nicht.
- Die ID jeder Column ändert sich, sobald der Modus umgeschaltet wird (MultiSelect an/aus). Dann ist Tag aber wieder gültig.
- Die Caption der Column kann nicht ausgewertet werden, da diese immer wieder andere Werte haben könnte
Außerdem bleibt die Frage offen, was passiert eigentlich, wenn ich z.B. einen Anwender habe der die Software immer offen läßt und den Modus ständig wechselt. ID ist ein Integer. Bei jedem Wechsel wird die ID um die Anzahl der Spalten in der Listview erhöht. Irgendwann läuft die ja auch über (auch wenn das vergleichsweise lange dauern dürfte)
Zur Vereinfachung habe ich ein kleines Beispiel angehängt.
Erstellt mit Delphi 2007 unter Win7.
Ich hoffe auf Antworten
Gruß, Chris