Beispiel aus Hilfe (Komponentenentwicklung) funzt nicht.



  • Hallo,

    ich hab versucht das Beispiel aus der hilfe für die Erstellung einer graphischen Komonente nachzuvollziehen, aber irgendwie haut das nicht hin.
    Mein .cpp Code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "est.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten
    // keine rein virtuellen Funktionen besitzen.
    //
    
    static inline void ValidCtrCheck(Test *)
    {
            new Test(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall Test::Test(TComponent* Owner)
            : TMemo(Owner)
    {
    }
    //---------------------------------------------------------------------------
    namespace Est
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(Test)};
                     RegisterComponents("Beispiele", classes, 0);
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TSampleShape::SetShape(TSampleShapeType Value)
    
    {
      if (FShape != Value)            // Ignorieren, wenn keine Änderung vorliegt
      {
         FShape = Value;               // Neuen Wert speichern
         Invalidate();                 // Neuen Bildaufbau auslösen 
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TSampleShape::Paint()
    
    {
      int X,Y,W,H,S;
      //Canvas->Pen = FPen;           // Stift der Komponente kopieren
      //Canvas->Brush = FBrush;       // Pinsel der Komponente kopieren
      W=Width;                      // Breite der Komponente verwenden
      H=Height;                     // Höhe der Komponente verwenden
      X=Y=0;                        // Kleinsten Wert für Kreise/Quadrate speichern
      if( W<H )
       S=W;
      else
       S=H;
      switch(FShape)
       {
        case sstRectangle:          // Rechtecke und Quadrate zeichnen
    
        case sstSquare:
          Canvas->Rectangle(X,Y,X+W,Y+H);
          break;
        case sstRoundRect:                     // Abgerundete Rechtecke und Quadrate
        case sstRoundSquare:
          Canvas->RoundRect(X,Y,X+W,Y+H,S/4,S/4);
          break;
        case sstCircle:                        // Kreise und Ellipsen zeichnen
        case sstEllipse:
          Canvas->Ellipse(X,Y,X+W,Y+H);
          break;
        default:
    
          break;
      }
    }
    

    und meine .h

    //---------------------------------------------------------------------------
    
    #ifndef estH
    #define estH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    #include <StdCtrls.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE Test : public TMemo
    {
    private:
    protected:
    public:
            __fastcall Test(TComponent* Owner);
    __published:
    };
    //---------------------------------------------------------------------------
    enum TSampleShapeType { sstRectangle, sstSquare, sstRoundRect, sstRoundSquare,
    
       sstEllipse, sstCircle };
    
    class PACKAGE TSampleShape : public TGraphicControl
    
    {
          private:
        TSampleShapeType FShape;
        void __fastcall SetShape(TSampleShapeType Value);
    
      protected:
        virtual void __fastcall Paint();
    
        __published:
        __property DragCursor ;
        __property DragMode ;
        __property OnDragDrop ;
        __property OnDragOver ;
        __property OnEndDrag ;
        __property OnMouseDown ;
        __property OnMouseMove ;
        __property OnMouseUp ;
        __property TSampleShapeType Shape = {read=FShape, write=SetShape, default = sstRectangle};
    
    };
    
    #endif
    

    wenn ich die Komonenten registriere und dann in einem neuen Projekt einbinden will, bekomme ich meine definierte Eigenschaft Shape nicht angezeigt und warum muss ich das von TMemo ableiten?

    Danke schon mal für Eure Mühe.



  • Hallo,

    ich hab es hinbekommen, es ist einfach so, das das TMemo da vollkommen falsch ist. Man muss die Komponente von TGraphicControl ableiten und dann alle Funktionen und Eigenschaften dort reinpacken. In der Hilfe sieht es aber so aus als gehöre es zusammen. Naja.



  • Kann ich nicht nachvollziehen.
    In der Hilfe unter Komponenten erzeugen -> Grafische Komponenten erzeugen -> Die Komponente erzeugen und registrieren steht eindeutig "Leiten Sie von TGraphicControl den neuen Komponententyp TSampleShape ab" und "class PACKAGE TSampleShape : public TGraphicControl" usw.



  • Hallo, wenn das bei Dir so steht, dann ist das ja gut, wenn ich den von Dir genannten Link ("Die Komponente erzeugen und registrieren") wähle erscheint bei mir.
    *
    Die Erstellung einer Komponente beginnt immer auf dieselbe Weise: Sie legen eine Unit an, leiten eine Komponentenklasse ab, registrieren diese und installieren die Klasse in der Komponentenpalette. Dieser Prozeß wird unter Eine neue Komponente erzeugen beschrieben.
    Für das vorliegende Beispiel halten Sie sich an das grundsätzliche Vorgehen und beachten folgende Besonderheiten:

    1 Speichern Sie die Unit der Komponente unter dem Namen YELMEMO. Die Header-Datei heißt also YELMEMO.H, die CPP-Datei YELMEMO.CPP.
    2 Leiten Sie eine neue Komponente namens TYellowMemo ab, die von TMemo abstammt.
    3 Registrieren Sie TYellowMemo auf der Registerkarte Beispiele der Komponentenpalette.

    Das Resultat sollte folgende Form haben:

    #ifndef YelMemoH

    #define YelmemoH
    //---------------------------------------------------------------------------
    #include <vcl\sysutils.hpp>
    #include <vcl\controls.hpp>
    #include <vcl\classes.hpp>
    #include <vcl\forms.hpp>
    #include <vcl\StdCtrls.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE TYellowMemo : public TMemo
    {
    private:
    protected:
    public:

    __published:
    };
    //---------------------------------------------------------------------------
    #endif

    Die zugehörige CPP-Datei sollte so aussehen:

    #include <vcl\vcl.h>

    #pragma hdrstop
    #include "Yelmemo.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init);
    //---------------------------------------------------------------------------
    static inline TYellowMemo *ValidCtrCheck()
    {
    return new TYellowMemo(NULL);
    }
    //---------------------------------------------------------------------------
    namespace Yelmemo
    {
    void __fastcall Register()

    {
    TComponentClass classes[1] = {__classid(TYellowMemo)};
    RegisterComponents("Beispiele", classes, 0);
    }
    }

    Hinweis
    In diesem Beispiel wird davon ausgegangen, daß Sie die Komponente nicht mit dem Komponenten-Experten, sondern manuell erstellen. Wenn Sie den Komponenten-Experten verwenden, wird TYellowMemo automatisch ein Konstruktor hinzugefügt.

    Und das hat so garnichtsmit TGraphicControl zu tun und hat mich total verwirrt.
    Sorry.
    Zu der entstandenen Komponente hab ich noch ne Frage, aber da wohl besser neues Thema.



  • ela schrieb:

    den von Dir genannten Link ("Die Komponente erzeugen und registrieren")

    Ich beziehe mich auf keinen Link sondern auf die entsprechende Themen-Hierarchie der 'Inhalt'-Seite im Hilfethemen-Fenster.



  • Okay,
    ich bin da irgendwie anders hingekommen und zwar über Index und dann ein paar mal weitergeklickt. Ich lerne nie aus. 🙂


Anmelden zum Antworten