Eigene Komponente: Ungültige Variant-Typumwandlung



  • hallo,
    ich bin dabei gewesen mir eine eigene Komponente zu schreiben. das ganze sollte ein button werden. nach dem ich die grundlegenden dinge fertig hatte, wollte ich das gute stück ausprobieren. ich öffne also ein neues projekt und clicke doppelt auf meinen button.

    nun werd ich mit fehler-meldungen â "Ungültige Variant-Typumwandlung" und so weiter überhäuft. Wenn ich die schliesslich alle weggeclickt habe und das Programm ausführen will, gibt's gleich eine nette exception und ich lande in einer datei namens "sysvari.h", zeile 2898. ich arbeite mit dem BCB 5.0 Student Version. also hier mal der code meines buttons:

    TFlatButton.cpp

    #include <vcl.h>
    #pragma hdrstop
    
    #include "FlatButton.h"
    #pragma package(smart_init)
    
    static inline void ValidCtrCheck(TFlatButton *)
    {
            new TFlatButton(NULL);
    }
    
    __fastcall TFlatButton::TFlatButton(TComponent* Owner)
            : TCustomControl(Owner)
    {
            SetSize( Rect( 0, 0, 80, 20 ) );
            pressed = false;
            moved = false;
    }
    
    namespace Flatbutton
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TFlatButton)};
                     RegisterComponents("User Components", classes, 0);
            }
    }
    
    void __fastcall TFlatButton::SetSize( TRect rect )
    {
         Left       = rect.Left;
         Top        = rect.Top;
         Height     = rect.Bottom - rect.Top;
         Width      = rect.Right - rect.Left;
    }
    
    void __fastcall TFlatButton::Paint( void )
    {
         Canvas->Pen->Width = penWidth;
    
         Canvas->Brush->Color = colorBrush;
         Canvas->Pen->Color = colorPen;
         Canvas->Font->Color = Font->Color;
         Canvas->Font->Name = Font->Name;
         Canvas->Font->Size = Font->Size;
         Canvas->Font->Style = Font->Style;
    
         Canvas->Rectangle( 0, 0, Width, Height );
         Canvas->TextOut( ( Width/2 ) - ( Canvas->TextWidth( Caption ) / 2 ), ( Height / 2 ) - ( Canvas->TextHeight( Caption / 2 ) ), Caption );
    }
    

    TFlatButton.h

    #ifndef FlatButtonH
    #define FlatButtonH
    
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    
    class PACKAGE TFlatButton : public TCustomControl
    {
    private:
            bool pressed;     // gedrückt == true | nicht gdrückt == false
            bool moved;       // mouse over == true | mouse nicht over == false;
    
            // Properties
            TColor colorBrush;
            TColor colorPen;
            TColor colorBrushPressed;
            TColor colorPenPressed;
            TColor colorFontPressed;
            TColor colorBrushMoved;
            TColor colorPenMoved;
            TColor colorFontMoved;
    
            int penWidth;
            //void __fastcall SetColor( void );
    protected:
              virtual void __fastcall Paint( void );
    public:
           void __fastcall SetSize( TRect rect );
            __fastcall TFlatButton(TComponent* Owner);
    __published:
                // ereignisse
                __property OnClick;
                __property OnMouseDown;
                __property OnMouseUp;
                __property OnMouseMove;
                __property OnEnter;
                __property OnExit;
                __property OnKeyPress;
                __property OnKeyDown;
                __property OnKeyUp;
                // eigenschaften
                __property Caption;
                __property Font;
                __property int PenWidth = { read = penWidth, write = penWidth, default = 1 };
                __property TColor ColorBrush = { read = colorBrush, write = colorBrush, default = clBtnFace };
                __property TColor ColorPen = { read = colorPen, write = colorPen, default = clGray };
                __property TColor ColorBrushPressed = { read = colorBrushPressed, write = colorBrushPressed, default = clBtnFace };
                __property TColor ColorPenPressed = { read = colorPenPressed, write = colorPenPressed, default = clSilver };
                __property TColor ColorFontPressed = { read = colorFontPressed, write = colorFontPressed, default = clSilver };
                __property TColor ColorBrushMoved = { read = colorBrushMoved, write = colorBrushMoved, default = clBtnFace };
                __property TColor ColorPenMoved = { read = colorPenMoved, write = colorPenMoved, default = clWhite };
                __property TColor ColorFontMoved = { read = colorFontMoved, write = colorFontMoved, default = clWhite };
    };
    
    #endif
    

    ich kann mit diesem fehler echt nix anfangen. 😞 hoffentlich kann mir aber jemand von euch helfen. falls ihr noch mehr informationen braucht einfach melden!

    ciao, cypoc



  • cypoc,
    da fällt mir erst mal nichts ein, aber Du könntest Deine Komponenten-Unit in ein Testprojekt direkt einbinden und den Button zur Laufzeit erzeugen. Dadurch hättest Du die Möglichkeit zu Debuggen und herauszubekommen wo genau der Fehler auftritt.



  • genau das ist mein problem. ich hab schon mal so einen button erstellt, da funktionierte alles wunderbar...
    werde aber mal das laufzeit-erstellen ausprobieren.

    ich bin weitere tips sehr, sehr offen. 🙂

    ciao, cypoc



  • wenn ich den button zur laufzeit erstelle stellt sich sofort die besagte exception ein. 😞
    kann das etwas damit zu tun haben, dass ich den button in ein neues packages und damit installiert habe? in meinen projekt-optionen compiliere ich meine anwendungen aber laufzeit-packages. hat das überhaupt was miteinander zu tun?

    ciao, cypoc

    edit: wenn ich die komponente auf das formular ziehe bekomme ich außerdem noch diesen fehler: Leinwand/Bild erlaubt kein zeichnen!

    was heißt das denn?

    nochmal ciao, cypoc



  • [cpp]Canvas->TextOut( ( Width/2 ) - ( Canvas->TextWidth( Caption ) / 2 ), ( Height / 2 ) - ( Canvas->TextHeight( Caption / 2 ) ), Caption ); [/cpp]

    oh, ich dussel! seht ihr, was ich sehe?! Caption durch zwei geteilt erzeugt Fehler in der Art, in der ich sie eben noch hatte! 😃

    ciao, cypoc


Anmelden zum Antworten