1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Komponenten mit C++Builder

Discussion in 'Programmieren' started by Hansderkanns, Jul 21, 2003.

Thread Status:
Not open for further replies.
  1. 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

    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. 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

    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
     
Thread Status:
Not open for further replies.

Share This Page