Data-Objekt einer ListView freigeben



  • Hallo,

    ich speicher bestimmte Daten über Data in einzelne ListItems einer ListView:

    listItem->Data = object;
    

    Wenn ich jetzt aber die ListView leeren möchte (Clear), dann werden imo die einzelnen Objekte, welche mit Data verknüpft sind nicht freigegeben. Oder liege ich da falsch?

    Wie kann ich sicher gehen, dass diese Objekte ebenfalls zerstört werden?

    Ist mein momentaner Ansatz korrekt?

    for (int i = 0; i < ListView1->Items->Count; ++i)
    	 {
    	   delete ListView1->Items->Item[i]->Data;
    	   // oder so?: ListView1->Items->Item[i]->Delete();
    	 }
    
    	 ListView1->Clear();
    

    Danke im Voraus



  • nki schrieb:

    Wie kann ich sicher gehen, dass diese Objekte ebenfalls zerstört werden?

    Dafür gibt es TListView::OnDeletion.



  • Hi,

    danke.

    Also in diesem Fall dann so?

    void __fastcall TFormMain::ListView1(TObject *Sender,
    	  TListItem *Item)
    {
         for (int i = 0; i < ListView1->Items->Count; ++i)
         {
           delete ListView1->Items->Item[i]->Data;
           // oder so?: ListView1->Items->Item[i]->Delete();
         }
    }
    

    Bitte korregier mich, wenn ich falsch liege.

    Gruß

    nki



  • nki schrieb:

    Also in diesem Fall dann so?

    Nein 🙄

    Ich nehme mal an, bei TFormMain::ListView1 handelt es sich um den Eventhandler für ListView1->OnDeletion. Zunächst wäre es dann ratsam, einen aussagekräftigeren Namen zu geben - das tut der Objektinspektor gewöhnlich ja auch. Was soll denn eine Funktion namens "ListView1" auch machen?

    Wenn du mal gelesen hättest, was in der Dokumentation, auf die ich verlinkte, steht, solltest du das Event auch richtig benutzen können:

    RAD Studio VCL Referenz schrieb:

    TListView.OnDeletion Ereignis

    C++:
    __property TLVDeletedEvent OnDeletion;

    Tritt ein, kurz bevor ein Element aus einer Listenansicht gelöscht wird.

    Mit einer Ereignisbehandlungsroutine für OnDeletion können Sie Aktionen durchführen, kurz bevor ein Element aus der Liste gelöscht wird. Der Parameter Item ist das entsprechende TListItem-Objekt der Eigenschaft Items.

    Folgst du dem Link hinter "TLVDeletedEvent", so findest du das hier:

    RAD Studio VCL Referenz schrieb:

    ComCtrls.TLVDeletedEvent Typ

    Pascal:
    TLVDeletedEvent = procedure (Sender: TObject; Item: TListItem) of object;

    C++:
    (Sender: TObject; Item: TListItem) ( TLVDeletedEvent)();
    (Anm.: Zugegebenermaßen ist das Unfug; die C++-Unterstützung in doc-o-matic, das AFAIK für die Dokumentation benutzt wird, ist noch unzureichend. Die genaue C++-Entsprechung sieht so aus:
    typedef void __fastcall (__closure * TLVDeletedEvent) (TObject* Sender, TListItem* Item);
    An der Nützlichkeit der Dokumentation ändert das aber nichts.)

    Sender ist die Listenansicht mit dem Element, das entfernt werden soll.

    Item ist das Element, das entfernt werden soll.

    Was ist daran so schwer zu verstehen?



  • Hi audacia,

    in meinen Projekten verwende ich aussagekräftige Namen. Ich habe in diesem Fall ein neues Projekt zum Test angelegt.

    Keine Ahnung, was mir da beim Funktionsnamen schief gegangen ist. Ich hatte ursprünglich das Ereignis OnDeletion dort stehen. Hab ich bestimmt was falsch gepastet ^^

    Danke für deine Hilfe, ich werde es jetzt mal mit TLVDeletedEvent versuchen/lösen.

    Gruß

    nki


Anmelden zum Antworten