Crearea de componente dinamice

Crearea dinamică a componentelor.

Bună, spune-mi răspunsul la această întrebare. Creez un panou dinamic și pe el un buton SpeedButton. Astfel de panouri cu butoane, în funcție de situație, pot fi un număr diferit. Comanda pentru apăsarea tuturor butoanelor este B.OnClick: = Form1.Informacia. # xA0; Spuneți-mi cum să creați un handler dinamic pentru fiecare buton creat. # xA0;
# xA0;

procedura TForm1.UserConnect;
var
B: TSpeedButton;
G: TGroupBox;
Informația: TNotifyEvent;
începe
// Creați un buton sub buton.
G: = TGroupBox.Create (Form1);
G. Parent: = Form1.ScrollBox1;
G.Capție: = ImiaKomp;
ButtonCoordinat; // Obțineți coordonatele.
G.Height: = H;
G. Left: = L;
G.Top: = T-ScrollBox1.VertScrollBar.Poziție;
G. Lățime: = W;
// Creați butonul.
B: = TSpeedButton.Create (Form1);
B.Parent: = G;
B.OnClick: = Form1.Informacia;
B.Glyph.LoadFromFile ("computer.bmp");
B. Înălțime: = 73;
B. Left: = 5;
B.Top:=15;
B. Lățime: = 90;
se încheie;

Ce înseamnă "a crea dinamic un handler"?

Atribuiți dinamic - este de înțeles (în codul dvs. este făcut: B.OnClick: = Form1.Informacia, numai Form1 este eliminat), dar ce înseamnă "crearea dinamic"?

Instrumentul de tratare a evenimentului este o metodă de clasă. Adică un cod de mașină, o piesă a programului. Doriți programului să creeze o piesă din același cod?

În general, acest lucru se poate face, dar fără o cunoaștere sigură a asamblorilor și a comenzilor de mașină pentru această sarcină, este mai bine să nu o luăm nici măcar. Pentru incepatori, astfel de lucruri sunt, evident, prea dure si nu sunt bune pentru incepatori.

Faptul este că în acest cod, când faceți clic pe oricare dintre butoane, accesați procedura B.OnClick: = Form1.Informacia. Și este necesar ca fiecare buton să-i cheme pe handlerul său, să-mi spună cum să schimb codul.


> B.OnClick: = Form1.Informacia. Dar este necesar ca fiecare buton
> i-am sunat pe handlerul său, spune-mi cum să schimb codul.

1) Fiecare buton atribuie propriul handler
2) În robot să se uite, ce buton a cauzat și de a executa codul diferit.

În această întrebare, nu știu cum să o fac, spune-mi.

Ce nu știi cum să faci?
fiecare buton propriu handler sau verifica ce buton este într-un singur manipulator

Butoanele sunt create dinamic, astfel încât infecția nu se știe cât timp va fi, deci nu pot scrie un handler pentru fiecare buton. În manipulatorul generat, nu pot găsi motivele pentru a determina butonul numit manipulator și cum să accesați butoanele create dinamic.


> # xA0; verificați ce este acest buton într-un singur handler

Cum să determinați ce buton numit manipulator?

> Cum se poate determina ce buton a apelat?

Și puteți utiliza linia de exemplu, nu puteți găsi cum să faceți acest lucru?

Multe mulțumiri tuturor celor care au participat la conferință, dar poate ajuta cineva să spargă impasul, să renunțe la un exemplu.

Prin cauza nu a reușit să funcționeze dacă:
dacă expeditorul = SpeedButton începe apoi
# xA0; # xA0;.
# xA0; # xA0; se încheie;

> dacă expeditorul = SpeedButton începe apoi

V-ați verificat singur codul?

Și ce nu-ți place aici?

Încercați să spuneți în cuvinte că verificați codul.

Dacă este apăsat butonul SpeedButton, faceți-l.

Verificarea faptului că expeditorul este membru al clasei TSpeedButton este realizat cu is.
Dacă expeditorul este TSpeedButton atunci.

Și întrebarea este diferită (pentru fiecare buton individual) în acest caz pentru butonul sub numele SpeedButton

Dacă valoarea SpeedButton este o proprietate Nume, atunci

Dacă TSpeedButton (Sender) .Name = SpeedButton atunci.

Dacă (Sender ca TSpeedButton) .Name = SpeedButton atunci.

Nu, nu funcționează opțiunea mea și nici măcar nu am verificat nici una dintre aceste probleme. )))


> B.OnClick: = Form1.Informacia. Dar este necesar ca fiecare buton
> i-am sunat pe handlerul său, spune-mi cum să schimb codul.

B: = TSpeedButton.Create (Form1);
B.Parent: = G;
B.OnClick: = Form1.Informacia;
b.tag: = 15;
C: = TSpeedButton.Create (Form1);
C.Parent: = G;
C.OnClick: = Form1.Informacia;
C.tag: = 16;
D: = TSpeedButton.Create (Form1);
D.Parent: = G;
D.OnClick: = Form1.Informacia;
Db.tag: = 17;

în dispozitivul de manipulare
cu expeditor ca TSpeedButton să înceapă
# xA0; dacă sender.tag = 15, atunci butonul handler al cărui etichetă este 15
# xA0; dacă sender.tag = 16, atunci butonul handler al cărui etichetă este 15
# xA0; dacă sender.tag = 17, atunci butonul handler al cărui etichetă este 15

# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; sfârșitul

Memorie: 0,76 MB
Timp de timp: 0.062 sec