Einzelnen Beitrag anzeigen

Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

TListView Column.Tag ändert sich mit D&D der Columns

  Alt 8. Feb 2011, 15:49
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
Angehängte Dateien
Dateityp: zip ListView_MultiSelectProblem.zip (1,8 KB, 6x aufgerufen)
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat