2017-11-20 8 views
1

auf True um. Ich stieß auf unerwartetes Verhalten von TListItem. Überprüfen Sie den folgenden Testcode:TListItem.Checked schaltet sich nach Assign()

var 
    Item: TListItem; 

    //... 

    ListView1.Checkboxes := True; 
    with ListView1.Items.Add do 
    begin 
    Caption := 'old item'; 
    Checked := False; 
    end; 

    Item := TListItem.Create(ListView1.Items); 
    Item.Caption := 'new item'; 
    Item.Checked := False; 

    ListView1.Items[0].Assign(Item); 

    Assert(ListView1.Items[0].Caption = 'new item'); 
    Assert(ListView1.Items[0].Checked = False); //WTF 

Assertionsfehler tritt auf, da die Checked-Eigenschaft sich irgendwie auf True umschaltet. Zu diesem Verhalten habe ich keine Hinweise in der Hilfedatei gefunden.

Ist das ein Fehler oder eine Funktion?

Ich benutze Delphi 7 mit allen Updates.

+3

Dies hat nichts mit 'Assign()' zu tun. Fügen Sie 'Assert (nicht Item.Checked);' vor 'Assign' ein und Sie werden sehen, dass es fehlschlägt. –

Antwort

7

Delphi kommt mit VCL-Quellcode. Suchen Sie in ComCtrls.pas nach der Implementierung von TListItem und TListView.

Haben Sie „Use Debug-DCU“ in Ihrer Projektoption und dann traten durch die TListItem Quellcode mit dem Debugger aktiviert ist, würden Sie genau gesehen haben, was geschehen. Item.Checked := False schlägt fehl und das Lesen Item.Checked gibt immer True zurück, weil Item.Index -1 ist (seit Sie TListItems.Add() umgangen haben).

Die Getter-Methode behandelt nicht die Möglichkeit, dass die ListView_GetCheckState() Makro (welches ein Wrapper für die LVM_GETITEMSTATE Nachricht ist) aufgrund fehlschlägt einen ungültigen Elementindex geführt wird.

Das manuelle Erstellen eines TListItem-Objekts reicht nicht aus, um das Element dem zugrunde liegenden Win32-ListView-Steuerelement hinzuzufügen. Wenn Sie eine TListItem über andere Mittel als TListItems.Add() oder TLisItem.Insert() erstellen, müssen Sie TListItems.AddItem() aufrufen, um die TListitem in das zugrunde liegende ListView-Steuerelement einzufügen.

Verwandte Themen