Komponenten mit C++Builder

Dieses Thema im Forum "Programmieren" wurde erstellt von Hansderkanns, 21. Juli 2003.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Hansderkanns

    Hansderkanns ROM

    Registriert seit:
    11. Juni 2003
    Beiträge:
    6
    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 hinterlege einfach mal den kompletten Code, da ich wirklich nicht mehr weis, wo der Fehler zu suchen ist:

    //---------------------------------------------------------------------------

    #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");
    }
     
  2. SourceLE

    SourceLE Kbyte

    Registriert seit:
    4. November 2002
    Beiträge:
    488
    UPS! Hätt ich ehrlich gesagt auch nicht so schnell gefunden. Zählt zu den sogenannten Fluchfehlern...

    Zimmer auf und ab gehen, Fehler suchen, Fluchen, wieder Zimmer auf und abgehen, Fluchen, Fluchen, ...

    :-)
     
  3. Hansderkanns

    Hansderkanns ROM

    Registriert seit:
    11. Juni 2003
    Beiträge:
    6
    Danke für die Antwort!

    Habe den Fehler mittlerweile gefunden.

    Schau Dir mal den Abschnitt an:

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

    Der Fehler ist, dass ich bei END_MASSAGE_MAP auf meine Klasse und nicht die der geerbten Klasse (TButton) verweise. Dadurch kommt es zu ner Endlosschleife und nem Stapelüberlauf.
    Es ist halt im Builder gegenüber bsp. VB etwas dumm, dass man solche Eventhandler noch per Hand programmieren muß. Oft schreibt man es ja noch direkt aus der Hilfe ab und weis gar nicht, was es bedeutet.

    mfg
     
  4. SourceLE

    SourceLE Kbyte

    Registriert seit:
    4. November 2002
    Beiträge:
    488
    Hi u...

    das Programm enthält absolut keine Fehler. Wahrscheinl. solltest Du mal Deine IDE Einstellungen überprüfen. Leider kann ich Dir von der Ferne so nicht Helfen, da es hier eine ganze Anzahl von Einstellungen gibt. Die wichtigste Einstellung dürfte(n) aber meist die/eine Pfadangabe für die zu linkenden Header sein. Zu 90% liegt meist der Fehler dort.

    MfG & CU
     
Status des Themas:
Es sind keine weiteren Antworten möglich.

Diese Seite empfehlen