Apelarea procedurii OnClick din modul
Bună, dragi maeștri.
Există un Form1. Pe butoanele formularului 2. Există un modul Unit2 (fără formular).
utilizări
# XA0; Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
# xA0; Vcl.Controls; Vcl.Forms; Vcl.Dialogs; Vcl.StdCtrls;
tip
# xA0; TForm1 = clasa (TForm)
# xA0; # xA0; Buton1: TButton;
# xA0; # xA0; Buton2: TButton;
# xA0; # xA0; procedura Button1Click (Expeditor: TObject);
# xA0; # xA0; procedura Button2Click (Expeditor: TObject);
# xA0; privat
# xA0; # xA0;
# xA0; public
# xA0; # xA0;
# xA0; sfârșitul;
var
# xA0; Form1: TForm1;
procedura TForm1.Button1Click (expeditor: TObject);
începe
# xA0; Test;
se încheie;
procedura TForm1.Button2Click (expeditor: TObject);
începe
# xA0; ShowMessage ("Button2Click");
se încheie;
procedura de testare;
începe
# xA0; Form1.Button2Click (Form1);
se încheie;
procedura de test (expeditor: TObject);
procedura de test (expeditor: TObject);
începe
# xA0; Form1.Button2Click (Expeditor);
se încheie;
Ei bine, în consecință, procedura de testare va fi:
procedura TForm1.Button1Click (expeditor: TObject);
începe
# xA0; Test (auto);
se încheie;
1. Explicați, vă rog, popularitatea care este diferența dintre:
Form1.Button2Click (expeditor); // Numai dacă procedura este declarată ca: procedura Test (Expeditor: TObject);
Form1.Button2Click (Form1);
Form1.Button2Click (zero);
Form1.Button2.Click;
2. Este necesar să declare ca o procedură Test (Expeditor: TObject)?
Nu a verificat corectitudinea, ci pentru șiruri de caractere
Form1.Button2Click (expeditor); // Numai dacă procedura este declarată ca: procedura Test (Expeditor: TObject);
Form1.Button2Click (Form1);
Form1.Button2Click (zero);
Se va apela metoda de manipulare a evenimentului OnClick, la care argumentul este trecut în paranteze
Și de ce este necesar? Astfel de apeluri manual de manipulare sunt cod rău.
Form1.Button2.Click;
Se numește o metodă de clic, în interiorul căreia se cheamă, în special, un handler OnClick, dacă a fost atribuit, iar argumentul handler este o instanță a butonului 2
Vă mulțumesc foarte mult pentru răspunsul dvs.
Ie este mai bine să utilizați Form1.Button2.Click; ?
Pentru ce folosire? Este manuală declanșarea unui eveniment de clic pe butoane?
Nu exact.
În cazul meu, există câteva butoane, care sunt fixate pentru o anumită acțiune în număr mare (deci va trebui să handler aceste butoane trebuie să fie într-un modul separat pentru a împărți în proceduri separate, etc.).
Deci, uneori trebuie să apăsați un singur buton pentru a apela un handler OnClick unui alt buton, care poate fi inactiv.
Ie este important pentru mine nu evenimentul în sine, ci algoritmul de acțiune atribuit acestui buton.
Pentru a face mai clară, voi da un exemplu.
Există o variabilă globală, de exemplu, perem: integer;
În Unitatea 2, procedura următoare este stabilită pentru procedură, de exemplu:
procedura de test (expeditor: TObject);
începe
cu Form1
# xA0; perem de caz
# xA0; 1: // face ceva
# xA0; 2: // face ceva
# xA0;.
# xA0; 50: Buton2Click (Form1);
# xA0;.
# xA0; 100: // ceva de făcut
se încheie;
se încheie;
AZL. dacă
> nu este important evenimentul în sine, ci algoritmul
> acțiuni care sunt atribuite acestui buton.
> Pentru a fi mai clară, voi da un exemplu.
tip
# xA0; TForm1 = clasa (TForm)
# xA0; # xA0; Buton1: TButton;
# xA0; # xA0; Buton2: TButton;
# xA0; # xA0; Buton3: TButton;
# xA0; # xA0; procedura Button1Click (Expeditor: TObject);
# xA0; # xA0; procedura Button2Click (Expeditor: TObject);
# xA0; # xA0; procedura Button3Click (expeditor: TObject);
# xA0; privat
# xA0; # xA0;
# xA0; public
# xA0; # xA0;
# xA0; # xA0; procedura Raz ();
# xA0; # xA0; procedura Dva ();
# xA0; # xA0; procedura Tru ();
# xA0; sfârșitul;
var
# xA0; Danc123: TForm1;
procedura TForm1.Raz;
începe
# xA0; // Raz-raz-raz
# xA0; Dva;
# xA0; Tru;
se încheie;
procedura TForm1.Dva;
începe
# xA0; Raz;
# xA0; // Dva-două-două;
# xA0; Tru;
se încheie;
procedura TForm1.Tru;
începe
# xA0; Raz;
# xA0; Dva;
# xA0; // Tru-tru-tru;
se încheie;
procedura TForm1.Button1Click (expeditor: TObject);
începe
# xA0; Raz;
se încheie;
procedura TForm1.Button2Click (expeditor: TObject);
începe
# xA0; Dva;
se încheie;
procedura TForm1.Button3Click (expeditor: TObject);
începe
# xA0; Tru;
se încheie;
end.
Este clar acest lucru? și rezolvă problema dvs. sau spuneți despre "Expeditor" # xA0 și "Unit2"?
> când apăsați un singur buton, a fost apelat un handler OnClick al unui alt buton
Deoarece Sinele nu funcționează într-un modul separat, trebuie să scrieți numele formei în loc de Sine. De exemplu, Form1.Button2Click (Form1);
Și funcționează. Prin urmare, cred că tema poate fi închisă.
> O idee proastă.
Engleză este slabă. Nu ar trebui să folosiți două articole nedefinite într-un rând.
Mărturisesc că de multe ori am făcut-o la institut. Dar acum înțeleg că dacă "când apăsați un buton, se numește handlerul OnClick al celuilalt buton", atunci aceasta este în mod clar o arhitectură prost gândită. Cu toate acestea, dacă acesta este un "proiect de acasă al unui programator" ™, acesta poate și va coborî așa cum vă place.
Și totuși, decât să nu vă rugăm, Form1.Button2.Click; sau Form1.Button2Click (Nil); (în mod prestabilit, Expeditorul nu este activat)?
> Răspunde de la Yuri Zotov [19]
Și din aceasta urmează doar că, dacă și de a face prin acest loc, este mai corect să facem Form1.Button2Click (Form1.Button2);
> Form1.Button2Click (Expeditor); // Numai cu condiția că procedura
> este declarată ca: procedura Test (expeditor: TObject);
> Form1.Button2Click (Form1);
> Form1.Button2Click (zero);
> Form1.Button2.Click;
>
Govnocode, rezultând o eroare de acces la memorie.
Codul reutilizabil este formalizat în proceduri / funcții separate. Deși, eu sunt eu. despre elementele de bază cerute să nu mai vorbim.
> Dar acum înțeleg că dacă "prin apăsarea unui buton, m-am oferit voluntar
> Handlerul OnClick al unui alt buton ", atunci acest lucru este în mod clar prost gândit
> arhitectura.
Aparent, a meritat numirea subiectului diferit. Mai corect, probabil, a fost necesar să se numească: "Apel de procedură cu parametrul (Sender: TObject) din modul fără formular". Pentru că aici sarea nu este în OnClick, și anume în (Sender: TObject)
> Si inca nu te-ai lasat pe Form1.Button2.Click; sau Form1.
> Buton2Click (Nil);
Nu am scris că nu mă mulțumesc, i-am întrebat ce este diferența. Și s-ar putea adăuga: în ce cazuri, ce este mai corect să folosești?
> Și de aici urmează doar că dacă faceți acest loc,
> # xA0; atunci este mai corect să faceți Form1.Button2Click (Form1.Button2);
Depinde de ce ai nevoie pentru a obține.
Expeditor - (Form1.Button2)
Auto - (Form1)
> Codul reutilizabil se face în proceduri / funcții separate.
Și dacă această procedură particulară are un parametru (Sender: TObject), cum îl numiți din modul?
procedura TForm1.Exemplu (expeditor: TObject);
începe
# xA0; // face ceva;
se încheie;
> Și dacă această procedură particulară are un parametru (Sender: TObject),
Aceasta este procedura dvs. separată, nafig nu are nevoie de acest parametru, deoarece executați un cod delirant
Button2Click (Self)
> Aceasta este procedura dvs. separată nafig nu are nevoie de acest parametru,
> # xA0; dacă executați un cod delirant
Ce vrei să spui? Într-adevăr? Și dacă această procedură arată astfel:
procedura TForm1.Exemplu (expeditor: TObject);
începe
# xA0; dacă (Sender este TButton) atunci
.
se încheie;
Aici programatorul trebuie să fie angajat, fără opțiuni.
Șters de moderator
Notă: conferință pentru începători
Trebuie doar să înțelegeți o bază simplă: modulul este primar, iar forma este secundară.
Modulul nu cunoaște nimic despre orice formă, iar forma cunoaște modulele pe care le solicită.
Fă ce vrei. Cel puțin utilizați-l. Pentru tot felul de „tradiție“ de programare nu este întotdeauna justificat de ceva mai mult decât un bryaknuvshem mahmureala unele guru, care să facă acest lucru nu este un lucru bun atunci mindlessly luat restul.
De exemplu, în general, pe toate butoanele, atârn un singur manipulator, în el un comutator de la butonul de buton, ceea ce permite să nu mă deranjez în cele din urmă să chem ceva de oriunde. Este atât de convenabil pentru mine. Și programele sunt scrise pentru utilizatori, nu pentru alți programatori. Și dacă este convenabil pentru mine, utilizatorii sunt confortabili, apoi restul este irelevant.
> Conferința pentru începători, precum și pentru cei care consideră dificilă
> explica ce vrea. Cererea adresată participanților de a fi reciprocă,
> # xA0; pentru profesioniști, o cerere separată trebuie să fie indulgență.
În al doilea rând, dacă nu puteți explica de ce ar trebui să răspundeți? Ori nu știți sau nu puteți explica. M-am concentrat în mod special asupra acestui fapt, știind cum oamenii de aici preferă să scuture aerul și să facă asemenea declarații. Nu trebuie să rezolv o problemă specifică, am nevoie doar de o înțelegere clară a utilizării parametrilor, pe care am cerut să le explic.
> Trebuie doar să înțelegem o bază simplă: modulul este primar și
> formă - secundară.
> Modulul nu cunoaște nimic despre forme, dar forma știe
> modulele necesare.
Acest lucru este mai constructiv. Dar acest lucru este de înțeles, esența problemei este destul de diferită.
În cele din urmă, explicația este simplă.
> procedura TForm1.Exemplu (expeditor: TObject);
> începe
> # xA0; dacă (Sender este TButton) atunci
> # xA0; # xA0; ShowMessage ("Buton")
> # xA0; altceva
> # xA0; # xA0; ShowMessage ("BitBtn")
> sfârșit;
>
> procedura TForm1.BitBtn1Click (expeditor: TObject);
> începe
> # xA0; Exemplu (Expeditor);
> sfârșit;
>
> procedura TForm1.Button1Click (expeditor: TObject);
> începe
> # xA0; Exemplu (Expeditor);
> sfârșit;
Numai cu un astfel de manipulator, condiția din procedura Exemplului va fi executată așa cum ne trebuie, adică va apărea un mesaj care indică ce buton a fost de fapt apăsat. În cazul Exemplului (Sine); Exemplu (Form1); Exemplu (nul); se va executa tot timpul ShowMessage ("BitBtn"), indiferent de ce buton a fost apăsat.
În cele din urmă, Form1.Button2.Click; - O metodă de apăsare programabilă a unui buton. De exemplu, dacă trebuie să apăsați de mai multe ori butonul, după un anumit interval de timp. Pentru a nu face acest lucru manual, îl puteți face prin cronometru. Specificarea butonului de operare a butonului de timp. De fapt, temporizatorul în loc de noi va face clic pe acest buton.
Asta am vrut să aud.
Mulțumesc tuturor, puteți închide subiectul.
Aici întrebarea nu a fost nici măcar cea mai bună sau cea mai corectă. Voiam doar să aud explicația pentru o înțelegere deplină.
Întrebarea "ce este trimis"? Aceasta este ceea ce ați pus acolo, va fi cauza evenimentului, și ce să faceți cu el sau nu, trebuie să vă hotărâți în mâna. În general, este necesară doar trimiterea, pentru a putea accesa obiectul, indiferent de numele curent, de la numărul curent de obiecte din formular și așa mai departe.
Modul de utilizare depinde de dorințe. Poate că ar trebui să-l sau butonul knopka_s_pridelannoy_mnoy_fintiflyushkoy definesc - asta, dar poate am nasozdavali dinamic (în timpul rulării) 100 butoane și de a aloca un handler va stabili ce fel de buton - este o alta, și, Mauger. și al cincilea, al zecelea și multe altele pot.
> Nu este chiar așa sau deloc.
Nu exact, sunt de acord. pentru că cu un buton inactiv al mouse-ului nu poate fi apăsat, iar cu această metodă procedura de OnClick va fi încă executată.
> azl # xA0; (20.10.14 14:21) [26]
> Deoarece Cu un buton inactiv, nu îl puteți apăsa,
Asta este, probabil, asta a vrut programatorul, când la un moment dat a făcut butonul inactiv.
> și cu această metodă se va executa încă procedura OnClick.
Și acest lucru este un alt programator --buratino-- încă în căutarea unui mod de a străpunge soba nas - spun ei, există o modalitate legitimă de a face acest lucru, și voi, domnilor maestri, de la mine-l ascundă.
Ce nonsens. Cum poate fi legat codul din cadrul handlerului de astfel de teorii cu privire la dorințele programatorului și boratinele?
Exemplu: există un anumit regulator de temperatură (cod în dispozitivul de manipulare), care se ocupă de procedeul de încălzire-răcire fumat. Există două butoane care pot fi răcite cu încălzire manuală. Ei numesc această procedură.
Există un mod automat. El oprește aceste butoane, dar esența acțiunilor sale este că și el presează unul, apoi altul.
Și ce, pentru a scrie o grămadă de la fel, pentru a nu fi un pinworm?
> nu sunt legate direct de butonul butonului? Și aceeași procedură
> apelați când apăsați butonul?
Bineînțeles că poți. în mod indirect. scrie o funcție a cărei semnificație este de a apela o altă funcție. Chiar nu am așteptat o astfel de ofertă de la un inginer de electronice;)
Exemple generale pot fi citate. Același regulator de temperatură.
Temperatura din rezervor este de 98 ° C. Programul de lucru:
Mod manual. Afișați inscripția roșie "Temperatura maximă admisă" de lângă butonul "+". Interziceți butonul „+“ sau raport „teperatura atins limita, în scopul de a preveni un accident exploziv rezervor, creșterea în continuare nu a fost făcut“ atunci când încercați să apăsați vocal politicos modulat.
Există mai multe moduri diferite pentru butonul de tratare a butoanelor și pentru dispozitivul de comparare.
Ah. În orice caz, în cazul în care "manipulatorul de buton pentru a scoate un modul separat, împărțiți în proceduri separate," apoi trageți înapoi de acolo pentru interfață.
Nu numai că puneți căruciorul înaintea calului, dar chiar și # 235; și strangulează această mare.
Propun să introduc servicii web în ambarcațiunile de mână, douăsprezece piese, pentru fiecare # 235; d # 235, propriul său și dasnap, pentru morman.