Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Odwoływanie do dynamicznych obiektów typu Button i Label

Ostatnio zmodyfikowano 2011-06-14 14:21
Autor Wiadomość
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:

C/C++
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; //ilosc komponentow na formie
    Label1->Caption = IntToStr( CC );
}

... i analogicznie etykiety typu TLabel:

C/C++
for( int ilosc_przyciskow = 0; ilosc_przyciskow < 10; ilosc_przyciskow++ )
{
    TLabel * Labele = new TLabel( this );
    Labele->Parent = Form1;
    Labele->Name = "Labele" +( String ) ilosc_przyciskow;
    //...ciąg dalszy jak przy butonach

funkcja OnClick wygląda tak:
C/C++
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 :) ).
P-34134
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.
P-34136
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.
P-34138
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:

C/C++
void __fastcall TForm1::OnClick( TObject * Sender )
{
    if(( ActiveControl->Name ) == "Button1" )
         Label1->Caption = "tekst";
   
    if(( ActiveControl->Name ) == "Button2" )
         Label2->Caption = "tekst";
    //i tak dalej...
}

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 :)
P-34139
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).

C/C++
#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:

C/C++
int i = ActiveControl->Tag; //po wciśnięciu na Button pobieram jego Tag (w dynamicznych tworzeniu buttonów ustawiałem tag jako kolejne cyfry - każdy tag jest unikalny)
TLabel * myLabel = Veeeeeeeectorek.at( i ); //wczytuję z wektora wskaźnik do mojej etykiety (Label)
myLabel->Caption = "tekst"; //i do mojej etykiety dopisuję to, co chcę :) [/cpp]

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 :)
P-34140
« 1 »
  Strona 1 z 1