dynamic_cast ? WideString TTntListView TTntListitem Ondata



  • hi,

    kann ich den cast so stehen lassen ?
    Ohne den cast kann ich einfach keinen UnicodeString in die Unicodefähige TTntListView über das Ondata Ereigniss schreiben.

    void __fastcall TForm1::TntListView_TextData(TObject *Sender, TListItem *Item)
    {
            if(this->Speicher != NULL)
            {
                TTntListItem *TntItem = dynamic_cast<TTntListItem*> (Item); //ohne cast auf TTntListItem kein WideString !!!!
                if(TntItem)
                   TntItem->Caption = Speicher[TntItem->Index].Name;
            }
    }
    


  • Glaub nicht.



  • Es funktioniert aber so.



  • dynamic_cast ist grundsätlich keine gute Idee. Könnte in dem Fall evtl. sogar vertretbar sein (zwar immer noch eine schlechte Idee, aber so in der Art, ist nur GUI und überschaubar, also wurscht).
    Kann es passieren, dass du an der Stelle keinen TTntListItem bekommst? Wenn nicht, wärs besser, gleich static_cast zu nehmen. Ansonsten müssten diesen Dinger sowas wie eine "Tag" Eingeschaft haben, wo man etwas speichern kann, die könnte man auch für deinen Index benutzen.



  • Ja static_cast geht und es kann eigentlich überhaupt nicht passieren das ich kein TTntListItem bekomme.



  • was heißt "eigentlich"?
    Ich sehe hier kein Problem mit dynamic_cast. Klar frisst der etwas Performance. Da muss man schauen ob das ins Gewicht fällt. Andereseits gibt es undefined behaviour falls es eben mal doch kein TTntListItem ist. Sowas kann dann schwer zu findende Fehler produzieren.
    Falls man Performance und Sicherheit kombinieren will kann man ja ein

    assert(dynamic_cast<TTntListItem*> (Item));
    

    am Anfang einfügen.



  • Oder man verwendet &dynamic_cast<TTntListItem&>(*Item) , das wirft einen std::bad_cast , wenn der Cast fehlschlägt.



  • Ist halt die Frage. Wenn man weiß, dass das immer ganz sicher dieser Typ ist, dann finde ich static_cast semantisch besser. Sonst denkt sich jeder, der den Code liest, kann das auch was anderes sein? Wenn es doch einen Grund gibt, warum das mal was anderes sein könnte, dann dynamic_cast.



  • Funktioniert das denn, wenn du über den ListView gehst und dir da deinen Eintrag holst und besetzt?

    void __fastcall TForm1::TntListView_TextData(TObject *Sender, TListItem *Item)
    {
       MyTntListView->Items->Item[Item->Index]->Caption = Speicher[Item->Index]->Name;
    }
    

    Vermeidet mit aller Gewalt einen cast 😉
    Ich würde hier aber tatsächlich einen dynamic_cast benutzen.



  • DocShoe schrieb:

    Funktioniert das denn, wenn du über den ListView gehst und dir da deinen Eintrag holst und besetzt?

    void __fastcall TForm1::TntListView_TextData(TObject *Sender, TListItem *Item)
    {
       MyTntListView->Items->Item[Item->Index]->Caption = Speicher[Item->Index]->Name;
    }
    

    Vermeidet mit aller Gewalt einen cast 😉
    Ich würde hier aber tatsächlich einen dynamic_cast benutzen.

    ja wenn ich direkt drauf gehe ist es WideString aber über die OnData Funktion bleibt es AnsiString, Er trägt kein Unicode ein, also muss ich casten. Es fehlt halt die OnData WideString Methode für die WideString TTntListView die wird nicht mitgeliefert unde auch nicht überladen geliefert, es bleibt ohne cast nur AnsiString.



  • DocShoe schrieb:

    Funktioniert das denn, wenn du über den ListView gehst und dir da deinen Eintrag holst und besetzt?

    Um missverständnisse zu vermeiden ja das funktioniert natürlich.



  • So der Direktzugriff auf die TTntListView in der Ondata Funktion funktioniert überhaupt gar nicht,
    habe es deshalb nun doch so gemacht wie schon Anfangs erwähnt nur eben mit static_cast.

    void __fastcall TForm1::TntListView_TextData(TObject *Sender, TListItem *Item)
    {
            if(this->Speicher != NULL)
            {
                    TTntListItem *TntItem = static_cast<TTntListItem*> (Item); //ohne cast kein TTntListItem für WideString !!!!
                    if(TntItem)
                            TntItem->Caption = Speicher[TntItem->Index].Name;
            }
    }
    

Anmelden zum Antworten