Funbktionspointer als Eigenschaft



  • Hoi zäme,

    Ich will eine Eigenschaft in meiner Klasse einfügen, welche einen Funktions-Pointer der wie folgt erstellt wurde, verlangt.

    void __fastcall (*fuk_p)(PPO2*);
    

    Wie realisiere ich sowas, das ich im Prinzip eine Funktion in der Klasse aufrufen kann, die Funktion sich aber in einer anderen Klasse befindet...?
    Danke! 😕 😕



  • Siehe Signatur / Komponentenentwicklung/ Ereignisse.



  • Profi_p->ParamError=IfError;
    Wenn ich so der Eigenschaft den Funktionspointer übergeben will, kruieg ich folgenden Fehler:"[C++ Fehler] MainForm.cpp(4404): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden"



  • Okay, ich konnte es wie folgt lösen:

    // Typedef:
    typedef void __fastcall (__closure *funk_p)(PPO2 *Value);
    //property-declaration:
    __property funk_p ParamError={ read=GetParamError, write=SetParamError };
    //private-var & Access-Function-declarations:
    funk_p* FParamError;
    void __fastcall SetParamError(funk_p value);
    funk_p __fastcall GetParamError();
    //Access-Function-implementations:
    void __fastcall TProfibus::SetParamError(funk_p value)
    {
            if((*FParamError) != value) {
                    (*FParamError) = value;
            }
    }
    //--------------------------------------------------------------------------
    -
    
    funk_p __fastcall TProfibus::GetParamError()
    {
            return (*FParamError);
    }
    //--------------------------------------------------------------------------
    

    Jetzt hab' ich aber noch das Problem, dass ich der Eigenschaft gerne im Konstruktor einen Default-Wert übergeben würde, damit ich vor dem Aufruf mit einer if() abchecken kann, ob ein gültiger Zeiger vorhanden ist. z.B. so:

    if (this->ParamError)
      {
      this->ParamError(&locrec_struct);
      i=DEF_CONTROL+1;
      }
    

    Aber wenn ich einfach im Konstruktor this->ParamError=NULL; einfüge, tritt eine Exception auf, wesshalb bloss? wie kann ich das umgehen? Danke!!!



  • wenn du
    if(ParamError)

    abfragst, rufst du die Getter-Methode auf, in der der Pointer dereferenziert wird. Wenn der Null ist, gibt das eine Zugriffsverletzung.
    Andere Frage, warum nimmst du einen Pointer auf einen Pointer ?
    Das ist meiner Meinung nach ziemlich überflüssig.
    funk_p FParamError;

    reicht doch aus. Das ist doch schon ein Pointer.



  • AndreasW schrieb:

    wenn du
    if(ParamError)

    abfragst, rufst du die Getter-Methode auf, in der der Pointer dereferenziert wird. Wenn der Null ist, gibt das eine Zugriffsverletzung.
    Andere Frage, warum nimmst du einen Pointer auf einen Pointer ?
    Das ist meiner Meinung nach ziemlich überflüssig.
    funk_p FParamError;

    reicht doch aus. Das ist doch schon ein Pointer.

    Das ist korrekt, ich hab es jetzt geändert und jetzt läufts... 🙂


Anmelden zum Antworten