Marconius Temat założony przez niniejszego użytkownika |
Odwoływanie do dynamicznych obiektów typu Button i Label » 2011-06-14 12:50:22 Witam, Mam taki fragment kodu, w którym tworzę dynamicznie przyciski typu TButton: randomize(); ilosc_przyciskow++; for( int ilosc_przyciskow = 0; ilosc_przyciskow < 10; ilosc_przyciskow++ ) { TButton * Buttony = new TButton( this ); Buttony->Parent = Form1; Buttony->Name = "Button" +( String ) ilosc_przyciskow; Buttony->Caption = "Button" +( String ) ilosc_przyciskow; Buttony->Tag = ilosc_przyciskow; int left = random( Form1->Width - Buttony->Width ); int top = random( Form1->Height - Buttony->Height ); Buttony->Left = left; Buttony->Top = top; Buttony->OnClick = OnClick; int CC = ComponentCount; Label1->Caption = IntToStr( CC ); }
... i analogicznie etykiety typu TLabel: for( int ilosc_przyciskow = 0; ilosc_przyciskow < 10; ilosc_przyciskow++ ) { TLabel * Labele = new TLabel( this ); Labele->Parent = Form1; Labele->Name = "Labele" +( String ) ilosc_przyciskow;
funkcja OnClick wygląda tak: void __fastcall TForm1::OnClick( TObject * Sender ) { ShowMessage( ActiveControl->Name ); }
Pytanie brzmi: Jak w funkcji OnClick zrobić, aby po wciśnięciu dowolnego z tworzonych przycisków Button, pojawił się w odpowiednim obiekcie typu Label jakiś tekst? Chodzi o to, że tworze dynamicznie 'n' obiektów typu Button oraz Label. Wciskam np. Button5, i w obiekcie typu Label5 pojawia się napis "Wciśnięto analogiczny Button"? Dodam, że w OnClick widzę, który obiekt jest aktywny poprzez ActiveControl. Taką samą funkcję mogę przypisać do obiektów typu Label, ale... odpowiedni zapis mogę wprowadzić tylko do obiektu, który poprzez OnClick wcisnąłem... I nie wiem, jak zrobić interakcję, aby wciskając Button, zmienić Caption obiektu Label (tego dynamicznego, bo statyczny to wiem jak :) ). |
|
yoogi |
» 2011-06-14 12:55:49 Nie chcę mi się tego wszystkiego czytać co tu napisałeś, bo kiedyś się uczyłem Windows forms i powiem szczerze że nie przypadło do gustu, jedyny jego plus to taki że można sobie wszystko układać. Osobiście polecam WinAPI co prawda trochę kodu jest, ale większa kontrola nad kodem. |
|
DejaVu |
» 2011-06-14 13:01:53 Napisz warunek: jeżeli przycisk wciśnięty to ustaw tekst konkretnej etykiety. Metoda OnClick == kliknięcie przycisku, a do różnych elementów na TForm możesz się zapewne dostać poprzez zmienne należące do klasy. |
|
Marconius Temat założony przez niniejszego użytkownika |
» 2011-06-14 13:11:50 I właśnie tu jest pytanie, jak to zrobić? Bo mogę oczywiście zrobić tak, że: void __fastcall TForm1::OnClick( TObject * Sender ) { if(( ActiveControl->Name ) == "Button1" ) Label1->Caption = "tekst"; if(( ActiveControl->Name ) == "Button2" ) Label2->Caption = "tekst"; } Ale jak zrobić, aby właśnie te Label1, Label2 itd. jak tym sterować? Bo te Labele też są dynamiczne, a w programie mi będzie chodzić o to, aby tworzyć ileś ich... 1? 2? 100??? itd. Edit: Oczywiście zapomniałem dodać, że będę bardzo wdzięczny za pomoc :) Więc dodaję: będę bardzo wdzięczny za pomoc :) |
|
Marconius Temat założony przez niniejszego użytkownika |
» 2011-06-14 14:21:22 Wcześniej od ... ekhm... duszy strony się zabrałem do problemu. A teraz znalazłem rozwiązanie, jak zrealizować to, o co mi chodziło. Oczywiście dla potomnych się z tym podzielę. 1) Generuję sobie wektor, który będzie mi trzymał wskaźniki do etykiet (Label). #include <vector.h> vector < TLabel *> Veeeeeeeectorek; 2) W sekcji, gdzie tworzę dynamicznie Labele, dodaję linijkę: Veeeeeeeectorek.push_back( Labele ); 3) I na koniec, w zdarzeniu OnClick wystarczy dodać 3 linijki: int i = ActiveControl->Tag; TLabel * myLabel = Veeeeeeeectorek.at( i ); myLabel->Caption = "tekst";
I choć w ostatniej części w "at(i) mogłem od razu wkleić ActiveControl->Tag, dzięki temu nie zajmowałbym przestrzeni pamięci na "i", to może jednak warto trzymać w pamięci tę zmienną? Bo te i mogę wykorzystac także do innych dynamicznych obiektów o tym samym tagu :) |
|
« 1 » |