Parent Componente zum löschen ermitteln



  • Hallo,

    ich habe mir eine Komponente geschrieben, die ich von TPanel abgeleitet habe. Auf dieser Komponete habe ich verschiedene ComboBoxen, Labels und ein Button.

    Mein Ziel ist die Instanz meiner neuen Komponenten zu löschen, wenn ich auf den Button klicke.

    Wenn ich auf die abgeleitete Panel Komponente klicken würde, damit die Komponente gelöscht wird, wenn ich es wollte, würde ich es so machen:

    void __fastcall TMyComp::ButtonClick(TObject *Sender)
    {
       PostMessage(Handle, APPWM_DELETE_COMP, 0, reinterpret_cast<int>(Sender));
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm::WndProc(TMessage &Message)
    {
       if(Message.Msg == APPWM_DELETE_COMP)
       {
          delete reinterpret_cast<TMyComp*>(Message.LParam);
          Message.Result = TRUE;
       }
       else
          TForm::WndProc(Message);
    }
    //---------------------------------------------------------------------------
    

    Fakt ist aber, dass ich die Komponente nur löschen möchte, wenn auf den Button geklickt wird. Also müsste es mir irgendwie Möglichkeit sein, aus dem Sender die Instanz meiner Komponente zu erreichen, damit ich diese zum löschen, weiterleiten kann.

    Ich hoffe ich war verständlich. Würde mich über jede Hilfe freuen.

    Johannes



  • Johannes,
    ich nehme mal an, daß Du mit Hilfe von "Sender" Deine Komponente löschen willst und daß der Button Teil dieser Komponente ist.
    So könnte es gehen (ungetestet):

    if(Message.Msg == APPWM_DELETE_COMP) 
    { 
        TControl* pC = dynamic_cast<TControl*>(Message.LParam);
        if (pC != 0)
        {
            TMyComp* myComp = dynamic_cast<TMyComp*>(pC->Owner);
            if (myComp != 0)//sicher ist sicher: ist myComp vom Typ TMyComp ?
            {
                delete myComp;
            }
        }
    } 
    } 
    //---------------------------------------------------------------------------
    

    :xmas2:



  • Hallo,

    erstmal danke für die Anwort. Folgende Zeile:

    TControl* pC = dynamic_cast<TControl*>(Message.LParam);

    wirft die Fehlermeldung:

    Typumwandlung von int nach TControl* nicht zulässig.

    Hat jemand eine Idee, diesen Fehler zu beseitigen?

    Johannes



  • Jo, hier kommst du wirklich nicht um ein reinterpret_cast rum, das ist schon richtig so... Allerdings würde ich zunächst auf den tatsächlich mitgelieferten Typ casten (z.B. TObject) und dann mit dynamic_cast downcasten... hmmm

    -junix



  • Hi,

    ich hatte mal versucht Sender->Owner als Parameter weiterzuleiten aber das ging auch nicht. Zumindest vorher den Owner zu bestimmen und dann weiterzuleiten würde ich auch besser finden.

    Nur wie geht das?

    Johannes



  • Johannes,
    das hier sollte funktionieren:

    if(Message.Msg == APPWM_DELETE_COMP)
    {
      TObject* obj = reinterpret_cast<TObject*>(Message.LParam);
      TControl* pC = dynamic_cast<TControl*>(obj);
      if (pC != 0)
      {
        TMyComp* pP = dynamic_cast<TMyComp*>(pC->Parent);
        if (pP != NULL)
        {
          delete pP;
        }
      }
    }
    

    Das reinterpret_cast liefert einen Wert ungleich 0, wenn das Ziel (obj) mindestens so viele Bits wie die Quelle (Message.LParam) hat. Es liefert Dir also wenig Garantien.
    Andererseits hast Du die Auslösung des betreffenden Ereignisses voll unter Deiner Kontrolle, so daß Du auch statisch casten könntest und trotzdem nichts schief gehen sollte.



  • Ich weis dieser Thread ist schon alt, aber mich würde interessieren wie ich die Message Behandlung weitergebe wenn ich nicht weiss wer der rufende ist...
    kann mann irgendwie ein ELTERNKLASSE::WndProc(Message) realisieren?



  • Hi,

    FrankHof schrieb:

    kann mann irgendwie ein ELTERNKLASSE::WndProc(Message) realisieren?

    das wird doch gemacht(siehe erstes Posting):

    else
          TForm::WndProc(Message);
    

    Oder meinst Du etwas anderes?



  • Hi,

    ich meine was wenn nicht bekannt ist wer der rufende ist. wenn ich die WndProc allgemein halten will und zur laufzeit die wndproc der erst dann bekannten elternklasse rufen will... also eine dynamische lösung... zb.:
    TObject *my = <dynamic_cast TObject*> Message.LParam;

    TObject->Elternklasse::WndProc();


Anmelden zum Antworten