Dynamisch erstellte Komponente ansprechen
-
Hallo Leute,
Ich habe ein Programm geschrieben, mit welchem ich beliebig viele TLabel's dynamisch erstelle.
TLabel * newLabel3 = new TLabel(OR); newLabel3->Caption = "Out"; newLabel3->Name = "OR_Out_" + IntToStr(ORCounter+1); newLabel3->Font->Name = "Courier New"; newLabel3->Parent = this;Jetzt möchte ich wenn ich z.B. ein Button klicke, dass die Namen von diesen TLabel's in einem RichEdit erscheinen!
Meine Frage ist wie kann ich die ganzen TLabel's ansprechen und deren Name in RichEdit schreiben?
swlForm->swlRichEdit->Lines->Add("//Label " + ???????->Name);
-
Hallo
Siehe FAQ, Abschnitt Komponenten benutzen. Dort gibt es zum Beispiel einen Thread über dynamische Arrays von Controls.
bis bald
akari
-
Ok das hat geklappt!
Ich hoffe ich darf kurz das Thema erweitern. Ich habe jetzt ein anderes Problem.
Wie gesagt ich erstelle dynamisch die Komponenten folgender Maße.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;
Wie man sieht ist in dieser "And" Komponente gibt es auch andere Komponente "newLabel1". Folgender Maße spreche ich die Komponente "And" an!
void __fastcall TForm1::Button1Click(TObject *Sender) { for(int i=0; i < Form1->ComponentCount; i++) { // Alle Labels verändern if (Form1->Components[i]->ClassNameIs("TLabel")) { dynamic_cast<TLabel*>(Form1->Components[i])->Caption = "Alle Labels auf gleichen Wert setzen"; } // oder eine spezielle Behandlung if (Form1->Components[i]->ClassNameIs("TLabel")) { if (dynamic_cast<TLabel*>(Form1->Components[i])->Name == "Label1") dynamic_cast<TLabel*>(Form1->Components[i])->Caption = "Ausnahme Label1"; } } }Aber wie spreche ich meine Komponnete "newLabel1",welche sich in der Komponente "And" befgindet.

-
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 = ElementPropertyInHab 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