In einer neuen Komponete eine Image Komponete benutzen



  • Hallo,

    richtig habe ich gerade auch schon drüber nachgedacht.

    Danke für Deine Hilfe.



  • //---------------------------------------------------------------------------
    __fastcall TDiagramm::TDiagramm(TComponent* Owner)
    	: TComponent(Owner)
    {
    	Image = new TImage(Owner);
         Image->Parent = ((TForm*)Owner)->Parent;
         Image->Width = 100;
         Image->Height = 100;
    	Image->Canvas->Brush->Color = clBlack;
         Image->Canvas->FillRect(Rect(0,0,Image->Width,Image->Height));
         Image->Visible = true;
    
    }
    

    Hier kann Parent aber immer nur vom Typ TForm sein, ich möchte aber für die Komponenete als Parent eine GroupBox haben. Versuche ich meine Komponente
    in eine GroupBox zu setzen erscheint das Image oben links in der Form
    und nicht in der GroupBox.
    Wie kann ich die Komponente am besten testen, öffne ich den Builder zweimal
    mit der zu testenden Komponenete, kann ich die Komponente nicht mehr erzeugen.
    Fehler :"Programm still running".



  • Hallo

    dan must du für TDiagramm eine Eigenschaft vom Typ TWinControl erstellen, die du den gewünschten parent zuweisen kannst. Diesen gibts du dann über den Setter an das Image weiter.

    bis bald
    akari



  • #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    class PACKAGE TDiagramm : public TComponent
    {
    private:
    	TImage* Image;
         unsigned short VSampleTime;
         TWinControll VParent;    	//Instanz vom Typ TWinControll erzeugen
    protected:
    public:
    	void __fastcall Paint();
    	__fastcall TDiagramm(TComponent* Owner);
    __published:
    	__property TWinControll Parent={read  VParent,write=VParent};  //und die Property dazu
         __property unsigned short SampleTime ={read=VSampleTime,write=VSampleTime};
    
    };
    

    Meinst du es so, funktioniert nicht kennt den Typen nicht muss ich noch einen
    Header includieren?
    Oder kann ich nicht besser gleich von TWinControll ableiten.



  • Hallo

    ich seh da auf anhieb mal ein paar Probleme :

    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    class PACKAGE TDiagramm : public TComponent
    {
    private:
    	TImage* Image;
         unsigned short VSampleTime;
         TWinControll *VParent;    	// Du brauchst einen Zeiger auf eine Instanz
    
         void __fastcall SetParent(TWinControl *NewParent); // Setter
    
    protected:
    public:
    	void __fastcall Paint();
    	__fastcall TDiagramm(TComponent* Owner);
    __published:
    	__property TWinControl *Parent={read = VParent,write=SetParent};  //wieder Pointer und fehlendes IstGleich, TWinControl falsch geschrieben
         __property unsigned short SampleTime ={read=VSampleTime,write=VSampleTime};
    
    };
    

    und dazu in der Implementation

    void __fastcall TDiagramm::SetParent(TWinControl *NewParent)
    {
      if (Image) Image->Parent = NewParent;
      VParent = NewParent;
      }
    
    // Im Konstruktor noch hinzufügen
      VParent = NULL;
    

    /Edit : Ich würde die Eigenschaft auch nicht nur Parent nennen, damit es nicht mit dem Parent von echten Controls verwechselt wird.

    bis bald
    akari



  • Alles klar, danke für das Beispiel.



  • Warum funktioniert die Zuweisung des Parent für Image hier nicht.

    //---------------------------------------------------------------------------
    __fastcall TDiagramm::TDiagramm(TComponent* Owner)
    	: TComponent(Owner)
    {
         Image    = new TImage(this);
         Image->Parent = ((TWinControl*)Owner)->Parent;  //Parent des aufrufenden Objects
         Image->Visible = true;
         Image->Canvas->Brush->Color = clBlack;
         Image->Width = 100;
         Image->Height = 100;
         Image->Canvas->FillRect(Rect(0,0,100,100));
    }
    

    Object erzeugen

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	Diagramm = new TDiagramm(this);    //Object erzeugen
    }
    


  • Manchmal treibt man ein Blödsinn, es muss natürlich heißen

    //---------------------------------------------------------------------------
    __fastcall TDiagramm::TDiagramm(TComponent* Owner)
        : TComponent(Owner)
    {
         Image    = new TImage(this);
         Image->Parent = (TWinControl*)Owner;  //Parent des aufrufenden Objects
         Image->Canvas->Brush->Color = clBlack;
         Image->Width = 100;
         Image->Height = 100;
         Image->Canvas->FillRect(Rect(0,0,100,100));
    }
    

    dann gehts.



  • zum Testen:

    ich öffne immer erst ein Testprojekt und dann die bpk Datei. Du musst aber darauf
    achten im Testprojekt immer etwas zu ändern bevor du es neu startest, sonst
    wird nicht die aktuelle Version deines Steuerelements eingebunden. also
    am einfachsten auf der Form etwas verschieben.

    100% klappt das aber leider wohl nicht immer. Ich habe eine grössere Ansammlung
    von Steuerelementen. Wenn ich die neu kompiliere während ein anderes Projekt offen
    ist, dann bekomm ich vom Kompiler einen Zugriffsfehler (Schutzverletzung)



  • hey...ich hab nur diesen thread gefunden.

    Wie benutze ich diese TImage. Wie immer werde ich aus der BCB Hilfe wieder nicht schlau...Ich will ein hintergrundbild für mein Programm 🙂

    Danke für euer hilfe ich mag euch alle schon jetzt 😃



  • ok ok ich habs gefunden 🙂 war doch einfacher als ich dachte hihihih


Anmelden zum Antworten