Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов процедуры OnClick из модуля


Страницы:   1 2 3

azl ©   (2014-10-17 20:48:00) 

Здравствуйте, уважаемые мастера.

Есть форма Form1. На форме 2 кнопки. Есть модуль Unit2 (без формы).

unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Test;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ShowMessage('Button2Click');
end;

end.


unit Unit2;

interface

procedure Test;

implementation

uses Unit1;

procedure Test;
begin
 Form1.Button2Click(Form1);
end;

end.


Либо:

unit Unit2;

interface

procedure Test(Sender: TObject);

implementation

uses Unit1;

procedure Test(Sender: TObject);
begin
  Form1.Button2Click(Sender);
end;

end.


Ну и, соответственно, вызов процедуры Test будет таков:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Test(Self);
end;


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

Form1.Button2Click(Sender); //Только при условии, что процедура объявлена как: procedure Test(Sender: TObject);
Form1.Button2Click(Form1);
Form1.Button2Click(nil);
Form1.Button2.Click;

2. Есть ли необходимость объявлять, как procedure Test(Sender: TObject)?

Большая просьба просто объяснить. Специально задал вопрос в разделе "Начинающим". Не нужно каких-то ненужных комментариев, типа: А зачем это нужно? А не проще ли...? Ты не понимаешь разницу между..., Ты не знаешь азов... и т.д.

Заранее спасибо.


Германн   (2014-10-23 02:13:00) [1]


> Плохиш ©   (23.10.14 02:12) [40]

+1
Опоздал со своим ответом. Я хотел предложить несколько другой бред. :)


Плохиш   (2014-10-23 02:12:00) [2]

Не только поставить телегу впереди лошади, но ещë и придушить эту кобылу...

Предлагаю внедрить в поделку веб-сервисы, штук надцать, на каждоë дëрганье свой и датаснап, для кучи.


DQ   (2014-10-22 20:29:00) [3]

эх... В любом случае если " обработчик кнопок выносить в отдельный модуль, разбивать на отдельные процедуры" то дёргать оттуда обратно за интерфейс....


Германн   (2014-10-22 01:39:00) [4]


>  Kilkennycat ©   (21.10.14 10:58) [30]
>
>
> > не связанную напрямую с нажатием кнопки? И ту же процедуру
> > вызывать при нажатии кнопки?
>
> конечно же можно. ненапрямую. написать функцию, весь смысл
> которой в вызове другой функции. вот уж не ожидал такого
> предложения от электронщика ;)

Боюсь ты меня не понял или понял с точностью до наоборот.


Kilkennycat   (2014-10-21 22:05:00) [5]

Да, если мы будем углубляться в частности мы получим миллионы разных комбинаций, где оба будем правы. И даже где еще куча мнений будет иметь право.
Но я не за это "борюсь" )
Я против навязывания шаблонов, типа неиспользования гоу-ту, разделения обработчиков и т.д.
Мы же не знаем конкретную задачу автора. А он создает не идеологию, а конкретную программу. И не зная частностей, крайне глупо утверждать, что так делать нельзя.
На мой взгляд, всегда считать байт 8-мибитным и начало нумерации массивов с нуля - это ограничить свое мышление, убить в зародыше возможные изящные решения.


Inovet   (2014-10-21 20:55:00) [6]

> [35] Inovet ©   (21.10.14 20:52)
> неисправность предохранителя нагревателя

"нагреватель" заменить на "регулирующий вентиль".


Inovet   (2014-10-21 20:52:00) [7]

Общие примеры можно привести. Тот же регулятор температуры.

Температура в баке 98Ц. Работа прораммы:

Ручной режим. Выводим рядом с копкой "+" красную надпись "Максимально допустимая температура". Запрещаем кнопку "+", или при попытке нажатия вежливым поставленным голосом сообщаем "Тепература достигла предела, в целях предотвращения взрывной аварии резервуара, дальнейшее увеличение не было произведено".

Автоматический режим. Выводим рядом с копкой "+" красную надпись "Максимально допустимая температура". При поступлении положительной разности от компаратора, вежливым поставленным голосом сообщаем "Внимание! Неполадки в системе. Возможные причины и способы их устранениня: утечка тепла в следствии открытых окон в зимний период - закройте окна, закрыты технологические вентили на радиаторах - откройте технологические вентили, неисправность предохранителя нагревателя - замените предохранитель, В остальных случаях обратитесь за помощью в авторизированный сервисный центр."

Несколько разные пути у обработчика кнопки и обработчика компаратора.


Kilkennycat   (2014-10-21 19:22:00) [8]

субъективно.


Inovet   (2014-10-21 17:01:00) [9]

> [32] Kilkennycat ©   (21.10.14 11:55)
> пользователем?

Собой


Kilkennycat   (2014-10-21 11:55:00) [10]


> Inovet ©   (21.10.14 11:18) [31]

для читаемости кем? пользователем?


Inovet   (2014-10-21 11:18:00) [11]

> [30] Kilkennycat ©   (21.10.14 10:58)

Ну так это правильнее вообще-то, для читаемости.


Kilkennycat   (2014-10-21 10:58:00) [12]


> не связанную напрямую с нажатием кнопки? И ту же процедуру
> вызывать при нажатии кнопки?

конечно же можно. ненапрямую. написать функцию, весь смысл которой в вызове другой функции. вот уж не ожидал такого предложения от электронщика ;)


Германн   (2014-10-21 02:34:00) [13]


> kilkennycat ©   (20.10.14 21:15) [28]
>
> Глупости какие. Как может быть связан код внутри обработчика
> с такими теориямио желаниях программиста и буратинах?
>
> Пример: есть некий регулятор температуры (код в обработчике),
>  занимающийся охрененной процедурой нагрева-охлаждения.
> Есть две кнопки, которыми можно вручную нагревать-охлаждать.
>  Они вызывают эту процедуру.
> Есть автоматический режим. Он выключает эти кнопки, но суть
> его действий, что он тоже то одну нажмет, то другую.
>
> И что, писать кучу одинакового, чтоб не быть буратиной?

А что в автоматическом режиме нельзя вызывать некую процедуру "нагрева-охлаждения", не связанную напрямую с нажатием кнопки? И ту же процедуру вызывать при нажатии кнопки?


kilkennycat   (2014-10-20 21:15:00) [14]

Глупости какие. Как может быть связан код внутри обработчика с такими теориямио желаниях программиста и буратинах?

Пример: есть некий регулятор температуры (код в обработчике), занимающийся охрененной процедурой нагрева-охлаждения. Есть две кнопки, которыми можно вручную нагревать-охлаждать. Они вызывают эту процедуру.
Есть автоматический режим. Он выключает эти кнопки, но суть его действий, что он тоже то одну нажмет, то другую.

И что, писать кучу одинакового, чтоб не быть буратиной?


NoUser   (2014-10-20 16:10:00) [15]

> azl   (20.10.14 14:21) [26]

;))))

> Т.к., при неактивной кнопке мышкой ее нажать нельзя,

Вот-вот, именно этого наверное и хотел программист, когда в какой-то момент времени делал кнопку неактивной !

> а с помощью этого метода процедура OnClick все равно выполнится.

А это уже какой-то другой --буратино-- программист, все равноищет способ проткнуть носом печку, - мол, есть же законный способ сделать это, а вы, господа Мастера, от меня его утаиваете...


azl   (2014-10-20 14:21:00) [16]


> Не совсем так или совсем не так.


http://delphimaster.net/view/2-1293352804/8

Не совсем так, согласен. Т.к., при неактивной кнопке мышкой ее нажать нельзя, а с помощью этого метода процедура OnClick все равно выполнится.


Германн   (2014-10-20 01:44:00) [17]


> Ну и наконец Form1.Button2.Click; - метод, предназначенный
> для программного нажатия кнопки. Например, если нужно много
> раз нажимать кнопку, скажем, через определенный интервал.
>  Чтобы не делать этого вручную, можно это сделать по таймеру.
>  Указав в обработчике таймера Button2.Click; По сути таймер
> вместо нас будет кликать эту кнопку.

Не совсем так или совсем не так. Но тут ещё читать и читать в т.ч. справку по TAction. Ибо этот метод появился только с появлением в Делфи акций.


Inovet   (2014-10-19 15:17:00) [18]

> [23] Inovet ©   (19.10.14 14:14)
> Send

Sender


Inovet   (2014-10-19 14:14:00) [19]

Вопрос "что такое send"? Вот что туда поставишь, то и будет вызывателем события, а что с этим делать или не делать, уже решать в обработчике. Вообще Send как раз и нужен, чтобы можно было обратиться к объекту, независимо от текущих имён, от текущего количества объектов на форме и т.п..

Как там его использовать уже зависит от желаний. Может, мне надо просто определить кнопка это или кнопка_с_приделанной_мной_финтифлюшкой - это одно, а, может, я насоздавал динамически (в рантайм) 100 кнопок и присвоил один обработчик, тогда определять буду что за кнопка - это другое, а, може... и пятое, и десятое, и ещё много чего може.


azl   (2014-10-19 13:08:00) [20]


> kilkennycat ©

Золотые слова. Абсолютно со всем согласен и добавить нечего. Спасибо большое.

Тут вопрос был даже не в том, как лучше или как правильнее. Просто хотел услышать объяснение для полного понимания.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо