Komponenten mit C++Builder



  • Hallo,

    ich bin gerade dabei, mich mit dem CBuilder anzufreunden und probiere etwas herum. Dabei habe ich gemerkt, dass einfache Programme recht einfach zu entwickeln sind - fast wie in VB. Geht es aber daran Komponenten oder dlls zu entwickeln, bekomme ich Probleme und es kommen Laufzeitfehler beim installieren. Wenn ich bsp. die folgende Komponente in ein Package installieren will, so gibt die IDE eine Stapelüberlaufmeldung aus.
    Ich wollte mal Testen, wie man eingene Ereignisse schreibt bzw., wie man bestehende überschreibt.
    Ich hinterlege einfach mal den kompletten Code, da ich wirklich nicht mehr weis, wo der Fehler zu suchen ist:
    Dank im Vorraus

    //---------------------------------------------------------------------------
    
    #ifndef RightButtonH
    #define RightButtonH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    //---------------------------------------------------------------------------
    
    typedef void (__closure * TButtonEvent) (System::TObject *Sender, String Botschaft);
    
    class PACKAGE TRightButton : public TButton
    {
    private:
    TButtonEvent ButtonClick;
    
    protected:
    void __fastcall RClick(TWMRButtonDown);
    DYNAMIC void __fastcall Click(void);
    public:
    __fastcall TRightButton(TComponent* Owner);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_RBUTTONDOWN,TWMRButtonDown,RClick)
    END_MESSAGE_MAP(TRightButton)
    __published:
    __property TButtonEvent BClick = { read=ButtonClick, write=ButtonClick};
    };
    //---------------------------------------------------------------------------
    #endif
    
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    
    #pragma hdrstop
    
    #include "RightButton.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // Mit ValidCtrCheck wird sichergestellt, daß die erzeugten Komponenten
    // keine rein virtuellen Funktionen besitzen.
    //
    
    static inline void ValidCtrCheck(TRightButton *)
    {
    new TRightButton(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TRightButton::TRightButton(TComponent* Owner)
    : TButton(Owner)
    {
    }
    //---------------------------------------------------------------------------
    namespace Rightbutton
    {
    void __fastcall PACKAGE Register()
    {
    TComponentClass classes[1] = {__classid(TRightButton)};
    RegisterComponents("Beispiele", classes, 0);
    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TRightButton::Click()
    {
    if (ButtonClick)
    BClick(this, "Linke Maustaste");
    }
    
    void __fastcall TRightButton::RClick(TWMRButtonDown Message)
    {
    if (ButtonClick)
    BClick(this, "Rechte Maustaste");
    }
    


  • Hi,
    [quote=Hansderkanns ]

    BEGIN_MESSAGE_MAP 
    MESSAGE_HANDLER(WM_RBUTTONDOWN,TWMRButtonDown,RClick) 
    END_MESSAGE_MAP(TRightButton)
    

    [/quote]

    lese doch bitte mal das Tutorial in meiner Signatur. Vor allem die Seite über Messages.

    Die Messagemap erzeugt eine Methode,die DispatchMessage heißt.
    In EndMessageMap gibt man den Vorfahr an, damit die virtuelle Methode des Vorfahren aufgerufen wird.
    Du gibs hier die abgeleitete Klasse an, was natürlich zu einer Endlosschleife und letztendlich zu einem Stapelüberlauf führt.



  • Besten Dank für die schnelle Antwort,

    manchmal sollte man eben doch erst versuchen den Quelltext zu verstehen. Aber das ist im CBuilder manchmal gar nicht so leicht.



  • Hansderkanns schrieb:

    Aber das ist im CBuilder manchmal gar nicht so leicht.

    Wie wahr *rooleyes*


Anmelden zum Antworten