Neue Komponente - Text beeinflussen



  • Hallo Leute!!

    Ich programiere mit Borland und habe eine neue Komponente erstellt. Ich habe alles von Komponente TCustomControl abgeleitet.

    |----|
    E0.0  ----|    |---- A0.0
              |----|
    

    Jetzt möchte ich, dass ich, wenn das Programm läuft, die Eingänge und Ausgänge gesetzt werden können! Sprich es muss möglich sein den Text wie bei der Komponente TEdit, beeinflußen zu können!

    Ich weis wie ich die Komponente in einer Richtung beeinflußen kann.

    .h Datei

    __property Text;
    

    .cpp Datei

    Canvas->TextOutA(50,30,Text);
    

    Aber wie kann ich den Text bei laufender Programm ändern, so wie bei TEdit?

    Grüße Stefan

    /Edit: "beeinflußen", da kriegt man ja Augenkrebs! 😉



  • Hallo

    Du könntest die Funktionalität von TEdit (bzw. dem dahinterliegendem WinAPI-Control) selber nachprogrammieren. Sprich du verwendest die Key-Events um Eingaben zu filtern (Buchstaben und Zahlen in Text-Eigenschaft einfügen, Pfeiltasten um Cursor zu verschieben). Das ist recht auswendig.
    Oder du setzt in dein Control noch ein TEdit-Control ein, das für dich die Eingabe übernimmt.

    bis bald
    akari



  • Danke für die Antwort!!
    Das habe ich mir auch überlegt, in meine Control zusätzlich TEdit reinzunehmen, leider funktioniert es irgendweie nicht!

    Weist du vielleicht wie das geht?

    Ich habe in die Header Datei der Komponente folgendes eingefügt!!

    TEdit *FEdtit;

    leider funktioniert es nicht!!



  • Hallo

    Naja es reicht nicht nur einen Pointer zu deklarieren. Du must schon noch die Instanz des Controls selber erzeugen und dem Pointer zuweisen. Siehe FAQ Abschnitt Komponenten benutzen, dort wird das dynamische Erstellen von Controls erläutert.

    Auch ist "funktioniert nicht" keine aussagekräftige Fehlerbeschreibung.

    bis bald
    akari



  • Sorry, mit es funktioniert nicht meine ich, dass es nicht passiert, auch keine Fehlermeldungen!!

    Also ich habe mir das FAQ genauesten angeschaut, aber keine Lösung zu diesem Problem gefunden!

    Zumindestens habe ich nichts gefunden beüglich, wie ich zu der neuen Komponente, die von TCustomControl abgeleitet ist, noch zusätzlich die Eigenschaften von TEdit gebe!?

    .h Datei

    #ifndef TAndH
    #define TAndH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE TAnd : public TCustomControl
    {
    TEdit *FEdtit;
    private:
     int GetIn1;
    
    protected:
      virtual void __fastcall Paint(void);
      virtual void __fastcall SetIn1(const WideString Value);
    public:
            __fastcall TAnd(TComponent* Owner);
    __published:
      __property Text;
      __property OnClick ;
      __property OnDblClick ;
      __property OnMouseDown ;
      __property OnMouseMove ;
      __property OnMouseUp ;
     // __property int In1 = {read=GetIn1, write=SetIn1, nodefault};
    
    };
    //---------------------------------------------------------------------------
    #endif
    

    .cpp Datei

    #include <vcl.h>
    
    #pragma hdrstop
    
    #include "TAnd.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // ValidCtrCheck is used to assure that the components created do not have
    // any pure virtual functions.
    //
    
    static inline void ValidCtrCheck(TAnd *)
    {
            new TAnd(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TAnd::TAnd(TComponent* Owner)
            : TCustomControl(Owner)
    {
    GetIn1=1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TAnd::Paint(void)
    {
    Canvas->MoveTo(0,20);   //Eingang1
    Canvas->LineTo(25,20);  //Eingang1
    
    Canvas->MoveTo(0,50);   //Eingang2
    Canvas->LineTo(25,50);  //Eingang2
    
    Canvas->Rectangle(25,10,75,60);   //Körper
    
    Canvas->MoveTo(75,35);   //Eingang2
    Canvas->LineTo(100,35);  //Eingang2
    Canvas->TextOutA(50,30,"&");
    //Canvas->TextRect("und",0,5,"??");
    }
    //---------------------------------------------------------------------------
    void __fastcall TAnd::SetIn1(const WideString Value)
    {
    //GetIn1=In1;
    }
    //---------------------------------------------------------------------------
    namespace Tand
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TAnd)};
                     RegisterComponents("Standard", classes, 0);
            }
    }
    

    Kann mir jemand helfen?



  • also eigentlich mußt du doch nur auf die Änderung des Textes reagieren, z.B.:

    __published:
      __property String Text  = { read=FText, write=SetText };
    private:
      String FText;
      void __fastcall SetText(String value);
    

    und die Funktion SetText

    void __fastcall TForm1::SetText(String value)
    {
      if(FText != value) 
      {
        FText = value;
        //Tu hier etwas wenn der Text sich ändert, z.B.:
        Paint();
      }
    }
    

    und im Programm dann einfach:

    TAnd *And = new TAnd();
    And->Text = "blah";
    


  • danke Linnea aber das ist mir schon bekannt!
    Und das ist nicht das was ich brauche!

    Ich will den Text beeinflussen, wo das Programmschon läuft, sprich compieliert ist!!!! Deswegen will ich irgendwie die Eigenschaften von TEdit oder sogar besser ComboBox implementieren!

    Das Problem dabei ist, ich habe meine Komponente schon von TCustomControl angeleitet, aber wie gebe ich dieser Komponente noch die Eigenschaften von TEdit bzw. Combobox??

    Help!!!

    Grüße Stefan



  • Lies Dir nochmal die Antworten durch!

    Du musst eine TEdit- Komponente in Deine Kompo einfügen - nicht auch noch von TEdit erben.

    Ein Zeiger reicht nicht!

    Du musst im Constructor die Komponente TEdit erzeugen - Parent = Deine Kompo.
    Im destructor sollte auch deletet werden.

    Die Ereignisse des TEdit kannst Du in Deiner Kompo dann nach Bedarf abfangen! Dazu muessen Methoden implementiert und den richtigen On... Ereignissen des TEdit zugeordnet werden.

    Gruss
    Frank



  • ja das was ich!

    Aber wie sieht der Code dazu aus??

    Das ist doch kein Code "TEdit erzeugen - Parent = Deine Kompo"!

    Mein Problem ist nicht das Verständniss sonder der Code!!!

    Ich brauche wenigstens ein kleines Besispiel!!!



  • Schau in die FAQ unter "Komponenten benutzen - zur Laufzeit erstellen, anzeigen und Events zuweisen"



  • swunder schrieb:

    Das ist doch kein Code "TEdit erzeugen - Parent = Deine Kompo"!
    ...
    Ich brauche wenigstens ein kleines Besispiel!!!

    Ist das Code?:
    (Anmerkung:
    alle Hauptfunktionen sind entfernt, das zeigt nur noch, wie Komponenten in
    Komponenten eingefügt werden können!)

    Eine Header- datei

    //---------------------------------------------------------------------------
    #ifndef VolCtrlH
    #define VolCtrlH
    //---------------------------------------------------------------------------
    //De folschend glasse is enne Gombonende for de
    //Reschelung dor Laudsderge un zum
    //ei un aus- gnibsen der Brabbelbogsen
    
    //Des Ganse muss nadierlich in enne baggasch gebaggd wern, sunsd
    //dut dos ned richtsch glabben
    class PACKAGE TVC : public TCustomPanel
    {
    private:
      TTrackBar *VolumeTrackBar;
      TSpeedButton *OnOff;
      TPicture *FSpeakerSymbol;
      void __fastcall SetSpeakerSymbol(TPicture *Pic);
    protected:
    //  virtual void __fastcall Loaded();
      void __fastcall VolumeChange(TObject *Sender);
      void __fastcall VolumeMute(TObject *Sender);
    public:
      virtual void __fastcall Loaded();
            __fastcall TVC(TComponent* Owner);
            virtual __fastcall ~TVC();
            DYNAMIC void __fastcall Resize();
    __published:
      __property TPicture *SpeakerSymbol ={read=FSpeakerSymbol, write=SetSpeakerSymbol};
      __property Align;
      __property Anchors;
      __property Enabled;
    };
    //---------------------------------------------------------------------------
    #endif
    

    Die CPP- datei

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "VolCtrl.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    
    //---------------------------------------------------------------------------
    // ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten keine
    // rein virtuellen Funktionen haben.
    //
    
    static inline void ValidCtrCheck(TVC *)
    {
            new TVC(NULL);
    }
    //---------------------------------------------------------------------------
    //Dor gonschdruggdor
    __fastcall TVC::TVC(TComponent* Owner)
               :TCustomPanel(Owner)
    {
      FSpeakerSymbol=new TPicture;
    
      VolumeTrackBar=new TTrackBar(this);
      VolumeTrackBar->Parent=this;
      VolumeTrackBar->Orientation=trVertical;
      VolumeTrackBar->TickMarks=Comctrls::tmBoth;
    
      OnOff=new TSpeedButton(this);
      OnOff->Parent=this;
    }
    //---------------------------------------------------------------------------
    //Dor Deschdruggdor
    __fastcall TVC::~TVC()
    {
      delete VolumeTrackBar;
      delete FSpeakerSymbol;
    }
    //---------------------------------------------------------------------------
    //wenns e neies Bildschen gibbt for de Anzeische
    void __fastcall TVC::SetSpeakerSymbol(TPicture *Pic)
    {
      FSpeakerSymbol->Assign(Pic);
    }
    //---------------------------------------------------------------------------
    //de folgnde fungdschon werd nur geruffn, wenn dis Ganze ne Gombonende is
    void __fastcall TVC::Loaded()
    {
      TCustomPanel::Loaded();
      OnOff->Flat=true;
      OnOff->AllowAllUp=true;
      OnOff->GroupIndex=1;
      try
      { OnOff->Glyph->LoadFromResourceName((int)HInstance,"VOLSPEAKERS");
      }
      catch (...)
      {
        //In de Resoorsen vun der Gombonende muss ooch e Bildchen drinne sin
        //sonsd gibbet's enne Egsebschn
        //Dor Nohme is e boor Zeiln vurher geschriem
      }
      //oder e Bildschen muss dr brobberdieh zugeordned sin
      if (!FSpeakerSymbol->Bitmap->Empty)
        OnOff->Glyph->Assign(FSpeakerSymbol);
      OnOff->Width=28;
      OnOff->Height=28;
      OnOff->Top=Height-OnOff->Height-2;
      OnOff->Left=(Width-OnOff->Width) / 2;
      OnOff->NumGlyphs=4;
      OnOff->GroupIndex=1;
      OnOff->Enabled=Enabled;
      OnOff->OnClick=VolumeMute;
    
      VolumeTrackBar->Align=alNone;
      VolumeTrackBar->Anchors=VolumeTrackBar->Anchors<<akLeft<<akTop<<akRight<<akBottom;
      VolumeTrackBar->Top=1;
      VolumeTrackBar->Left=1;
      VolumeTrackBar->Height=Height-30;
      VolumeTrackBar->Width=Width-2;
      VolumeTrackBar->ThumbLength=Width-20;
      VolumeTrackBar->OnChange=VolumeChange;
    }
    //---------------------------------------------------------------------------
    //wenns enne neie Grehse gibbt for de Anzeische vun dos Ganse
    void __fastcall TVC::Resize()
    {
      TCustomPanel::Resize();
      VolumeTrackBar->ThumbLength=Width-20;
      VolumeTrackBar->Height=Height-30-15;
      OnOff->Top=Height-OnOff->Height-2;
      OnOff->Left=(Width-OnOff->Width) / 2;
    }
    //---------------------------------------------------------------------------
    void __fastcall TVC::VolumeChange(TObject *Sender)
    {
      //Was bassiern soll, wenn's Bedahl verschohm wurde
    }
    //---------------------------------------------------------------------------
    void __fastcall TVC::VolumeMute(TObject *Sender)
    {
      //Was bassiern soll, wenn's Knebbelchen bedadcht werd
    }
    //---------------------------------------------------------------------------
    
    //Alles Annere muss erschd nuch dazugebasdeld wern.
    //Su dos ganse Zeisch, dormid dos ooch richdsch mid de Systemschdeierung
    //zusammebassen dud.
    
    //Dos gemehr habsch mah alles weggemochd, dormit dos ned suh
    //gomblidsierd guggen dud.
    

    Gruss
    Frank


Anmelden zum Antworten