Dynamisch erstellte Komponente ansprechen



  • newLabel1 befindet sich nicht in einer anderen Komponente.
    And ist ein TImage und newLabel1 ist ein TLabel.Das Prinzip bleibt gleich.



  • Das Problem ist, das sobald du den Scope verlässt And und newLabel nicht mehr existieren.



  • Hallo,
    das stimmt aber nicht!
    da wenn ich folgends mache, kriege ich alle Komponent aufgezählt, welche bei mir auf meiner Form sind.

    this->Label1->Caption = IntToStr(this->ComponentCount);
    

    Ohne dynamisch erstellte Komponente "And" kriege ich eine Zahl von 4, da ich auf meiner Form 2 Buttons und 2 Labels fest sitzen habe.
    Wenn ich eine dynamische Komponente erstelle un die obige funktion aufrufe dann bekomme ich 5 Komponete als ComponentCount.

    Laut deiner Aussage knl muss ich aber 6 Komponente als Zahl für ComponentCount bekommen, da ich bei dynamischer Erstellung ein TImage und TLabel erstelle.
    Ich habe zuerst auch so gedacht, dann habe ich aber die obige Funktion ausprobiert.

    Falls ich dich falsch verstanden habe, dann sorry! 🙄

    So sieht mein Code momentan mit dem ich diese Komponente anspreche aus!

    void __fastcall TLogicWin::Button2Click(TObject *Sender)
    {
    	for (int ANDtranslate = 0; ANDtranslate < this->ComponentCount; ANDtranslate++)
    	{
    		for (int iAndCounter = 1; iAndCounter <= AndCounter; iAndCounter++)
    		{
    			if (this->Components[ANDtranslate]->Name == "AND_" + IntToStr(iAndCounter))
    				{
    				 swlForm->swlRichEdit->Lines->Add("//Component " + this->Components[ANDtranslate]->Name);
    				 swlForm->swlRichEdit->Lines->Add("    U " + this->Components[ANDtranslate+1]->Name + ";" );
    				 }
    		}
    
    	}
    	this->Label1->Caption = IntToStr(this->ComponentCount);
    	swlForm->Show();
    
    }
    


  • Sorry das ich hier grad meine Frage einfach so rein schmeiße, aber ich hantiere gerade auch mit dynamische erstellten Objekten herum.

    Meine Frage: Kann ich Objekte auch vollständig dynamisch erstellen ?
    Heißt: Den Namen für das Objekt muss ich immer selber vorgeben ..

    Ist das so okay ?

    for(int i=0; i < this->ComponentCount; i++){
          TImage *NewOb = new TImage(this);
          NewOb->Parent = this;
          NewOb->Name = ("IMG_Prog" + String(i));
          }
    

    Gruß Pixtar



  • swunder schrieb:

    Aber wie spreche ich meine Komponnete "newLabel1",welche sich in der Komponente "And" befgindet. 😕 😞

    Wie schon gesagt, dein newLabel1 befindet sich nicht in dem TImage And, sondern liegt sozusagen oben drauf. Es ist aber weiter ein eigenständiges Objekt und wird ganz normal angesprochen:

    newLabel1->Caption = "blabla";
    

    Pixtar schrieb:

    for(int i=0; i < this->ComponentCount; i++){
          TImage *NewOb = new TImage(this);
          NewOb->Parent = this;
          NewOb->Name = ("IMG_Prog" + String(i));
          }
    

    Ist das so okay ?

    Nein. Die Name-Eigenschaft einer Komponente ist nur ein Anzeigename. Der echte Name aller deiner TImage-Instanzen wäre New0b, und das gibt Chaos.
    Du brauchst die oben erwähnten Arrays.



  • Jansen schrieb:

    Wie schon gesagt, dein newLabel1 befindet sich nicht in dem TImage And, sondern liegt sozusagen oben drauf. Es ist aber weiter ein eigenständiges Objekt und wird ganz normal angesprochen:
    

    Gut das habe ich schon verstanden!! Aber wie spreche ich dieses TLAbel "newLabel1", welches auf dem TImage "And" liegt an, wenn es gar nicht in "ComponentCount" aufgezählt wird??



  • @ swunder: Ich glaube du meinst -> Das deine for-Schleife dann nicht alle Elemente ansprechen kann.

    Ich habs grad mal getestet, funktionieren tuts bei mir wenn ich den Code verwende:

    this->Label1->Caption = this->ComponentCount+(And->ComponentCount);
    

    @ Jansen: Welche erwähnten Arrays meinst du denn?
    Ich sehe hier im Thread nur ein Array und das ist This->Components[i]; ?!

    Gruß Pixtar



  • Pixtar,

    vielleicht blöde Frage aber was ist bei dir "And"?? 😮
    Es is ja unmöglich die dynamisch erstellte Komponnete "And" direkt zu adressieren oder? 😮
    Kannst du mir den Code geben, der bei dir funktioniert hat?



  • Na ich hab grad nichts anderes gemacht als deinen Code genommen:

    TImage *And = new TImage(this);
    And->Parent = this;
    
    And->Transparent = true;
    And->Height = 50;
    And->Width = 97;
    And->Name = "AND_" + IntToStr(AndCounter+1);
    And->OnMouseDown = StartPos;
    And->OnMouseMove = MoveElement;
    
    //Graphik
    And->Canvas->Pen->Color = clBlack;
    And->Canvas->Brush->Color = clWhite;
    And->Canvas->Rectangle(X, Y, X + 50, Y + 50);
    
    //Eigenschaften
    TLabel * newLabel1 = new TLabel(And);
    newLabel1->Left = X - 30;
    newLabel1->Top = Y - 10;
    newLabel1->Caption = "In1";
    newLabel1->Name = "AND_In1_" + IntToStr(AndCounter+1);
    newLabel1->Font->Name = "Courier New";
    newLabel1->Parent = this;
    newLabel1->Transparent = true;
    newLabel1->OnDblClick = ElementPropertyIn
    

    Hab nen paar Variablen die ich nicht hatte durch Werte ersetzt

    Und dann habe ich deinen Code

    this->Label1->Caption = IntToStr(this->ComponentCount);
    

    einfach angepasst an das bereits gepostete

    this->Label1->Caption = this->ComponentCount+(And->ComponentCount);
    

    Naja im ersten Code erstellst du ein Objekt Namens And vom Typ TImage. Dann erstellst du nen Objekt Namens newLabel1 vom Typ Label das aber auf deinem Objekt And liegt.
    Die Objekte auf der Form zählst du + die Objekte auf deinem And-Objekt.

    Weiter ging mein Gedanke nicht, ich weiß nicht mals ob jetzt gleich nicht irgendein Freak vorbei kommt und sagt: DAS DARF MAN GARNICHT MACHEN oder WAS DU GESAGT HAST IST BULLSHIT .... naja es funzt aber 😉

    Hoffentlich wars verständlich 😉

    Gruß Pixtar



  • hahahahahahah!

    Beim Compelieren schreibt kriege ich einen Fehler!

    Undefined Symbol And
    

    😮 😕 😮 😕 😮 😕

    Das ist doch ein scherz oder??



  • ach so!

    das hat deswegen funktioniert, weil du alles in einer Schleife machst.

    ich muss es in einer anderen Schleife machen!!

    sprich

    void __fastcall TLogicWin::ElementAND (int X, int Y)
    {
    // komponnete erstellen
    }
    void __fastcall TLogicWin::schreibe (int X, int Y)
    {
    // dynamische komponente ansprechen
    }



  • Ich glaub zu dem Code muss ich nicht mehr viel sagen oder ?

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    int GetCount(TForm1 *FormPtr, TImage *ImgPtr);
    void CreateObj(TForm1 *FormPtr);
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
       CreateObj(this);
    }
    
    //---------------------------------------------------------------------------
    int GetCount(TForm1 *FormPtr, TImage *ImgPtr){
        int Counted = FormPtr->ComponentCount+(ImgPtr->ComponentCount);
        return Counted;
    }
    //---------------------------------------------------------------------------
    void CreateObj(TForm1 *FormPtr){
        TImage *And = new TImage(FormPtr);
        And->Parent = FormPtr;
    
        And->Transparent = FormPtr;
        And->Height = 50;
        And->Width = 97;
        And->Name = "AND_1";
    
        //Graphik
        And->Canvas->Pen->Color = clBlack;
        And->Canvas->Brush->Color = clWhite;
        And->Canvas->Rectangle(20, 20, 20 + 50, 20 + 50);
    
        //Eigenschaften
        TLabel * newLabel1 = new TLabel(And);
        newLabel1->Left = 20 - 30;
        newLabel1->Top = 20 - 10;
        newLabel1->Caption = "In1";
        newLabel1->Name = "AND_In1_1";
        newLabel1->Font->Name = "Courier New";
        newLabel1->Parent = FormPtr;
        newLabel1->Transparent = true;
    
        //Eigenschaften
        TLabel * newLabel2 = new TLabel(And);
        newLabel2->Left = 20 - 30;
        newLabel2->Top = 20 - 10;
        newLabel2->Caption = "In1";
        newLabel2->Name = "AND_In1_2";
        newLabel2->Font->Name = "Courier New";
        newLabel2->Parent = FormPtr;
        newLabel2->Transparent = FormPtr;
        FormPtr->Label1->Caption = IntToStr(GetCount(Form1,And));
    }
    

    Ich hoffe damit kommst du der Lösung deines Problems näher !

    😃 Greez Pixtar



  • ich scahaue den den Code später an! Frau ruft!! 😃

    Falls was melde ich mich später!!



  • Pixtar:
    Ich meine den von akari angesprochenen FAQ-Eintrag zu dynamischen Arrays.



  • Hi Pixtar,

    Also wie gesagt dein Code funktioniert nicht so wie ich es brauche. Bei dir geschieht alles während deine Komponente erstellt wird. Beim Erstellen wird bei dir eine Funktion aufgerufen, die die Komponente zählt.

    Bloß es ist nicht das was ich brauche.

    Da ich erst einmal sagen wir mal 5 "And" Komponente erstelle und dann einen Knopf drücke, der mir alle Komponente, auch die TLabels die auf "And" liegen, in mein RichEdit bzw. Memo reinschreiben soll.

    Kann mir da vielleicht jemand helfen??



  • Hallo

    Irgendwie verstehe ich dein Problem nicht. Insbesondere sehe ich keinen Sinn die Labels mit Owner = Image und Parent = Form zu erstellen. Was erhoffst du dir davon?

    bis bald
    akari



  • @akari
    stell dir mal ein AND-Glied vor. Er hat 2 Eingänge und 1 Ausgang. Durch die diese TLabels werden die Eingänge und Ausgang benannt. Das AND-Glied muss auf der Form verschiebbar sein und TLabels (Caption) müssen veränderbar sein.
    Dafür muss ich diese TLabels ansprechen können, um die Tlabels zu ändern.

    Mir ist keine andere Lösung eingefallen, daher habe ich das so gemacht.

    Ich weis wie ich diese TLabels (Caption) verändern kann, wenn ich auf diese Tlabels oder TImage drücke, was auch funktioniert.
    Im nächsten Schritt muss ich alle TLabels, die sich bei mir auf dem TImage befinden, ansprechen und in TRichEdit bzw TMemo auflisten.

    Natürlich gibt es eine andere Möglichkeit die Tlabels in TRichEdit bzw. TMemo reinzuschreiben. Z.B. bei der Erstellung dieser TLabels. Bloß mein Prof. verlangt, das ich diese so anspreche, wie oben es beschrieben ist.

    Gruß
    swunder



  • Hallo

    Das ist ja schön und gut, aber trotzdem ergibt die besagte Belegung von Owner und Parent keinen Sinn. Also zitier ich doch die BCB-Hilfe :
    - Owner gibt an welcher Container für die Speicherverwaltung der Komponente zuständig ist. Dabei wird das Control in das Array Components des Owners eingetragen und ist darüber iterierbar.
    - Parent gibt an in welchem Container das Control angezeigt werden soll.

    Wenn du also sowohl Owner als auch Parent der Labels auf das Image setzt, kannst du alle Labels (und nur diese Labels) über Components des Images iterieren.

    bis bald
    akari



  • @akari
    Also irgendwie komme ich nicht ganz dahinter, was du mir damit sagen möchtest!
    Wie würdest du den mein Problem Lösen bzw. die Komponente mit TLabels erstellen?

    😕 gruß



  • Meinst du das ich die Komponente so erstellen soll!

    const int x = 10; 
    TImage *img[x]; 
    
    for (int i = 0; i < x; i++) 
    { 
      img[i] = new TImage(this); 
      img[i]->Parent = this; 
      img[i]->Width = 32; 
      img[i]->Height = 32; 
      img[i]->Top = i * 35; 
    
       TLabel * newLabel1 = new TLabel(And);
       newLabel1->Left = 20 - 30;
       newLabel1->Top = 20 - 10;
       newLabel1->Caption = "In1";
       newLabel1->Name = "AND_In1_1";
       newLabel1->Font->Name = "Courier New";
       newLabel1->Parent = FormPtr;
       newLabel1->Transparent = true;
    
    }
    

    und dann so ansprechen soll!

    for (int ii = 0; ii < x; ii++) 
    { 
    Form2->RichEdit1->Lines->Add[Form1->img[ii]->newLabel1->Name];
    }
    

    Wird es gehen? Kann leider nicht ausprobieren, da ich auf der Arbeit bin.


Anmelden zum Antworten