ПредишенСледващото

Покана процедура OnClick на модул

Здравейте, скъпи господар.

Има форма Form1. В форма два бутона. Има Unit2 единица (без форма).

употреби
# XA0; Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
# XA0; Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

тип
# XA0; TForm1 = клас (TForm)
# XA0; # XA0; Button1: TButton;
# XA0; # XA0; BUTTON2: TButton;
# XA0; # XA0; процедура Button1Click (Sender: TObject);
# XA0; # XA0; процедура Button2Click (Sender: TObject);
# XA0; частен
# XA0; # XA0;
# XA0; обществен
# XA0; # XA0;
# XA0; край;

Var
# XA0; Form1: TForm1;

процедура TForm1.Button1Click (Sender: TObject);
започвам
# XA0; тест;
приключи;

процедура TForm1.Button2Click (Sender: TObject);
започвам
# XA0; ShowMessage ( "Button2Click");
приключи;

Процедура на изпитване;
започвам
# XA0; Form1.Button2Click (Form1);
приключи;

Процедура на изпитване (Sender: TObject);

Процедура на изпитване (Sender: TObject);
започвам
# XA0; Form1.Button2Click (подателя);
приключи;

Е и, съответно, на процедурата за изпитване на разговор е, както следва:

процедура TForm1.Button1Click (Sender: TObject);
започвам
# XA0; Test (Self);
приключи;

1. Обяснете, моля, популярен в разликата между:

Form1.Button2Click (подателя); // Само когато тази процедура е обявена като: Процедура за изпитване (Sender: TObject);
Form1.Button2Click (Form1);
Form1.Button2Click (нула);
Form1.Button2.Click;

2. Има ли нужда да се декларира, като теста процедура (Sender: TObject)?

не се провери коректността, но за струни
Form1.Button2Click (подателя); // Само когато тази процедура е обявена като: Процедура за изпитване (Sender: TObject);
Form1.Button2Click (Form1);
Form1.Button2Click (нула);

Ще предизвика метод манипулатор OnClick събитие, което се предава като аргумент, че в скоби

И защо е необходимо? Такива манипулатори наръчник за обаждания - лош код.

Form1.Button2.Click;
Начин ще се нарича Click, в рамките на които, по-специално, наречена OnClick манипулатор, когато той е назначен, и аргумент манипулатор е инстанция на BUTTON2

Благодаря ви много за отговора.
Т.е. по-добре да използвате Form1.Button2.Click; ?

За каква полза? Задейства ръчно, натиснете бутона 'събитие?

Не съвсем.
В моя случай, има няколко бутона, които са фиксирани за някои действия в големи количества (за да можете да имате манипулатор тези бутони трябва да бъде в отделен модул, за да се раздели на отделни процедури и т.н.).
Така че, понякога е необходимо да се предизвика манипулатор OnClick друг бутон, който може да се деактивира с натискане на един бутон.
Т.е. Аз не съм подвластен натискане на бутон се събитие и алгоритъм от действия, които се възлага на този бутон.

За да стане по-ясен, ще дам един пример.

Има една глобална променлива, например, perem: цяло число;

В процедурата Unit2 фиксирана, например, следното:

Процедура на изпитване (Sender: TObject);
започвам
с Form1 правя
# XA0; случай perem на
# XA0; 1: // направи нещо
# XA0; 2: // направи нещо
# XA0.
# XA0; 50: Button2Click (Form1);
# XA0.
# XA0; 100: // направи нещо
приключи;
приключи;

azl. ако
> Важно е да не бутон самостоятелно кликване събитие и алгоритъма
> Действие, което се възлага на този бутон.
на
> За да стане по-ясен, ще дам един пример.
тип
# XA0; TForm1 = клас (TForm)
# XA0; # XA0; Button1: TButton;
# XA0; # XA0; BUTTON2: TButton;
# XA0; # XA0; Button3: TButton;
# XA0; # XA0; процедура Button1Click (Sender: TObject);
# XA0; # XA0; процедура Button2Click (Sender: TObject);
# XA0; # XA0; процедура Button3Click (Sender: TObject);
# XA0; частен
# XA0; # XA0;
# XA0; обществен
# XA0; # XA0;
# XA0; # XA0; процедура Raz ();
# XA0; # XA0; процедура Два ();
# XA0; # XA0; процедура Tru ();
# XA0; край;

Var
# XA0; Danc123: TForm1;

процедура TForm1.Raz;
започвам
# XA0; // Раз-Раз-Raz
# XA0; Два;
# XA0; Tru;
приключи;

процедура TForm1.Dva;
започвам
# XA0; Raz;
# XA0; // Два-Два-Два;
# XA0; Tru;
приключи;

процедура TForm1.Tru;
започвам
# XA0; Raz;
# XA0; Два;
# XA0; // Tru-TRU-TRU;
приключи;

процедура TForm1.Button1Click (Sender: TObject);
започвам
# XA0; Raz;
приключи;

процедура TForm1.Button2Click (Sender: TObject);
започвам
# XA0; Два;
приключи;

процедура TForm1.Button3Click (Sender: TObject);
започвам
# XA0; Tru;
приключи;
край.

Ясно ли е? и няма да реши проблема, или се говори за "Подател" # XA0 и "Unit2"?

> С натискането на един бутон OnClick манипулатор предложи друг бутон

Като отделен модул Self не работи, вместо на Аза е необходимо да се напише името на формата. Например, Form1.Button2Click (Form1);
И тя работи. Ето защо, аз мисля, че темата може да бъде затворена.


> Една лоша идея.

Вашият английски е лошо. Не трябваше "т се използват два неопределен статия в един ред.

Признавам, Института е също така често се е случвало. Но сега разбирам, че ако "само с едно натискане на един бутон OnClick манипулатор предложи друг бутон", това е ясно зле обмислената си архитектура. Въпреки това, ако тя е "дом проект програмист» ™, той може и ще слезе, колкото искате.
И все пак това, което не е нужно доволен Form1.Button2.Click; или Form1.Button2Click (Nil); (По подразбиране Е Sender не се използва)?

> В отговор от Юри Zotov [19]

И това да бъде само, че ако се прави през това място, че е разумно да се направи Form1.Button2Click (Form1.Button2);


> Form1.Button2Click (подателя); // Само ако тази процедура
> Обявена като: Процедура за изпитване (Sender: TObject);
> Form1.Button2Click (Form1);
> Form1.Button2Click (нула);
> Form1.Button2.Click;
>

Govnokod което води до грешка при достъп до паметта.

Многократна употреба код се извършва в отделни процедури / функции. Въпреки, ч # 235; г-I. за основните положения не поиска да се спомене.


> Но сега разбирам, че ако "повикване с натискане на един бутон
> OnClick манипулатор друг бутон ", това е ясно зле обмислен
> Архитектура.

Очевидно е, че е необходимо да дадете име на темата по различен начин. По-правилно, може би, да се нарича: "Calling процедурата с параметър (Sender: TObject) от модула без форма." Тъй като не е сол OnClick, а именно (Sender: TObject)


> И все пак, това, което не е нужно доволен Form1.Button2.Click; или Form1.
> Button2Click (Nil);

Аз не съм писал, че не ми хареса, аз попитах каква е разликата. И човек може също да добавя, че във всеки случай, че е разумно да се използва?


> И това просто да бъде, че ако се прави чрез този сайт,
> # XA0, то е разумно да се направи Form1.Button2Click (Form1.Button2);

Това зависи от това, което трябва да се получи.
Подателя - (Form1.Button2)
Self - (Form1)


> Многократна употреба код е в отделни процедури / функции.

И ако тази конкретна процедура параметър (Sender: TObject), както я наричат ​​от модула?

процедура TForm1.Example (Sender: TObject);
започвам
# XA0; // направи нещо;
приключи;


> И ако тази конкретна процедура параметър (Sender: TObject)

nafig не се нуждаят от тази опция, че вашата конкретна процедура, след като имате работещ код налудно
Button2Click (Self)


> Nafig не се нуждаят от този параметър Това си отделна процедура
> # XA0; след като имате работещ код налудно

Какво искаш да кажеш? Наистина ли? И ако тази процедура е, както следва:

процедура TForm1.Example (Sender: TObject);
започвам
# XA0; ако (подателя е TButton) след това
.
приключи;

Тук е необходимо да се наеме програмист, без опции.

изтрит от модератора
Забележка: Конференцията за начинаещи

Просто трябва да разберем простата основа: Модул - е основна, а формата - е от второстепенно значение.
Модулът не знае нищо за никаква форма, както и под формата знае, че е необходимо модули.

Прави каквото удобно. Въпреки зелена използване. За всички видове "традиция" програмиране не винаги е оправдано от нещо повече от махмурлук bryaknuvshem някои гурута, които да направят това не е нещо добро, след това безсмислено вдигна останалите.
Например, аз правя всички бутони висят един процесор, той превключи от бутона на маркер, който ми позволява да се най-накрая не особено занимавам с вика нещо от всяко място. Чувствам се толкова удобно. Програма, написана за потребителите, а не за други програмисти. И ако аз съм удобни, потребителите удобно, останалото е без значение.


> Конференция за начинаещи и за тези, които е трудно
> Обяснете какво иска. От участниците се изисква да бъде vzaimovezhlivymi,
> # XA0; професионалисти отделна заявка - да бъде снизходителен.

На второ място, ако не може да обясни, защо отговорите? Или той не знае или не може да обясни. Аз специално обърна внимание на това, знаейки как хората тук обичат да се отърси от въздуха и прави такива изявления. Нямам нужда за решаване на конкретен проблем, аз просто се нуждаят от ясна представа за използването на параметри, които му зададох да се обясни.


> Просто трябва да се разбере един прост принцип: Модул - е основна, а
> Форма - е средно.
> Модул не знае нищо за никаква форма, както и под формата знае
> Необходимите модули към него.

Тук е по-конструктивно. Но това е очевидно, предмета съвсем различна.

И накрая, обяснението е просто.


> Процедура TForm1.Example (Sender: TObject);
> започне
> # XA0; ако (подателя е TButton) след това
> # XA0; # XA0; ShowMessage ( "Button")
> # XA0; останало
> # XA0; # XA0; ShowMessage ( "BitBtn")
> Край;
>
> Процедура TForm1.BitBtn1Click (Sender: TObject);
> започне
> # XA0; Пример (подателя);
> Край;
>
> Процедура TForm1.Button1Click (Sender: TObject);
> започне
> # XA0; Пример (подателя);
> Край;

Само с такова състояние манипулатор в Пример процедура се извършва, както имаме нужда, т.е. съобщението за това, което наистина е бил натиснат. В случая на Пример (самостоятелно); Пример (Form1); Пример (нула); всички времена ще се извършва ShowMessage ( "BitBtn"), независимо от това кой бутон е натиснат.

Накрая Form1.Button2.Click; - метод, предназначен за бутон софтуер преса. Например, ако имате нужда от много време, за да натиснете един бутон, например, след определен интервал от време. За да направите това ръчно, можете да го направите с таймер. Посочвайки манипулатор Button2.Click таймер; В действителност, вместо на таймера ще трябва да натиснете този бутон.

Това е, което исках да чуя.

Благодаря ви, темата може да бъде затворена.

Тук въпросът не е как по-добре или по-правилно. Просто исках да чуя обяснение за пълно разбиране.

Въпросът "Какво е да изпрати"? Ето какво трябва да достави, а след това на повикващия ще бъде събития, както и какво да правя или не, трябва да решат в манипулатор. Изпращане на всички просто трябва да бъде в състояние да се позова на един обект, независимо от текущите имената на текущия брой на обектите по форма и т.н ..

Как се да се използва зависи от желанията. Може би трябва да просто да го или бутон knopka_s_pridelannoy_mnoy_fintiflyushkoy определи - това, но може би аз nasozdavali динамично (по време на работа) 100 бутони и възлага един манипулатор ще след това определи какъв вид бутон - е друг, а Mauger. и петата, и десетата, и много повече Mauger.


> Не е много, или изобщо не.

Не е точно съгласни. защото когато неактивен бутон на мишката натиснете това е невъзможно, но с този метод все още ще бъде изпълнена процедура OnClick.

> azl # XA0; (10/20/14 14:21) [26]

> Тъй тя не може да се натисне, когато неактивен бутон на мишката,

Точно така, това е, което най-вероятно е искал програмист, когато в някакъв момент от време направих неактивен бутон.

> Но с помощта на този метод процедура OnClick ще продължи да се изпълнява.

И това е някаква друга --buratino-- програмист все още търси начин за пробиване на печката носа - те казват, има законен начин да се направи това, а вие, господа майстори, от мен да го скрие.

Ама че глупост. Както може да се свързва с кода вътре манипулатор такива teoriyamio програмист желанията и Пинокио?

Пример: е температурен контролер (код манипулатор), ангажирани шибан процедура отопление охлаждане. Има два бутона, които могат да бъдат ръчно нагрява охладени. Те наричат ​​тази процедура.
Има автоматичен режим. Той забранява на бутоните, но същността на действията му, той е и този, който да кликнете, после още една.

И това, да пиша куп едни и същи, така че да не бъде Пинокио?


> Не е свързан директно с натискането на един бутон? И същата процедура
> Наречен, когато е натиснат бутона?

Разбира се, че може. косвено. напише функция, цялата работа е да се обади друга функция. Не очаквах такова предложение за електроника;)

Типични примери могат да бъдат дадени. Същата температура контрола.

Температурата в 98TS резервоара. Работа proramma:

Ръчен режим. Появява се в непосредствена близост до натискане на бутона "+" червени "максималната допустима температура." Забрана върху бутона "+", или да подадете сигнал "teperatura достигнали лимита за да се предотврати случайно взривно резервоар, по-нататъшно увеличение не е направено", когато се опитате да натиснете учтиво модулиран глас.

Няколко различни начини на манипулатор бутон, както и сравнение на манипулатор.

Ах. Във всеки случай, "бутони манипулатор трябва да са в отделен модул, разделен на отделни процедури", за да се оттегли в задната част на интерфейса.

Не само, за да постави каруцата пред коня, но Еш # 235; и удуши кобилата.

Аз предлагам да се въведе занаяти в уеб услуги, единадесет парчета, като всяка # 235; г # 235; и си RGANI datasnap за купчина.

Подкрепете проекта - споделете линка, благодаря!