| 
| 
 | Вопрос # 5 012/ вопрос решён / | 
 |  Здравствуйте, эксперты!Вопрос яйца ломанного не сто'ит и простыми средствами
 решается на раз, но хочется научиться это делать красиво.
 Итак, есть две кнопки A и B и соответственно 2 обработчика :
 
 ( См. код )
 
 Простой путь - прописать процедуры alfa и beta отдельно и
 вызвать первую по кнопке А безусловно, по B - по условию.
 
 А если написа'ть один обработчик, а в нем :
 Begin
 if ((вызов по кнопке А) or (условие)) then выполнить действия аlfa .........
 ;
 
 Интуиция мне подсказывает, что "вызвавшего абонента" можно определить по Sender, но дельфийскими словами выразить не могу.
 
 Я так понимаю, что goto lab_другого_обработчика не годится.
 Приложение:Переключить в обычный режим Procedure BtnA.Click ( Sender : Tobject )Begin  end ; Procedure BtnB.Click ( Sender : Tobject )Begin  end ;  
|  |   Вопрос задал: Толяныч (статус: 4-ый класс)Вопрос отправлен: 9 февраля 2011, 22:10
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: IlluminatI Здравствуйте, Толяныч!Практически у каждого компанента в Delphi есть такое замечательное свойство Tag. Выставляем у BtnA свойство Tag = 1, у BtnB соответственно Tag = 2 (на самом деле, можно любые int числа :) ). Дальше тыкаем два раза в любую из двух кнопок - среда создаст нам обработчик для этой кнопки. У второй кнопки находим событие OnClick и соотносим его с событием OnClick первой кнопки. В самом обработчике пишем такое:
 case (Sender as TButton).Tag of
 1: // нажали первую кнопку...
 2: // нажали вторую кнопку...
 end;
 Вот вроде бы и вся хитрость.
 P.S: Также, чтобы проверить является-ли Sender нужным нам объектом можно так: if (Sender is TButton) then ...; // является
 
|  | Ответ отправил: IlluminatI (статус: 2-ой класс)Время отправки: 9 февраля 2011, 22:59
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо. Исчерпывающе. Про Tag я не знал - свойство не самоочевидное. А Sender, выходит, определят тип объекта, не имя ? |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 11 февраля 2011, 08:28; участников в обсуждении: 5. 
|   | Ерёмин А.А. (статус: *Администратор), 10 февраля 2011, 09:44 [#1]: Цитата (Толяныч): А Sender, выходит, определят тип объекта, не имя ? (Sender as TButton).Name даст имя.
 |  
|   | Вадим К (статус: Академик), 10 февраля 2011, 10:47 [#2]:Толяныч: Мне исходное Ваше решение нравится больше, чем предложенное  IlluminatI.  Почему? да просто кликнул по кнопке - увидел. А в варианте IlluminatI  ещё нужно идти, проверять свойство tag. 
 Шумиха вокруг свойстав Tag сильно уж перегрета.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | bugmenot (статус: 3-ий класс), 10 февраля 2011, 11:58 [#3]:Толяныч, есть еще одна возможность ветвления 
 procedure TForm17.ButtOnClick(Sender: TObject);
begin
  { православный CASE использовать нельзя :-/ }
  if Sender = ButtOn then
    PlaySound(PChar(SND_ALIAS_SYSTEMSTART), 0, SND_ALIAS_ID)
  else if Sender = ButtOff then
    PlaySound(PChar(SND_ALIAS_SYSTEMEXIT), 0, SND_ALIAS_ID)как видишь, привязываться к Name - не очень кошерно
 Волшебные числа в Tag чрезвычайно неудобно поддерживать
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  10 февраля 2011, 12:08: Статус вопроса изменён на решённый (изменил автор вопроса — Толяныч) 
|   | Вадим К (статус: Академик), 10 февраля 2011, 12:34 [#5]:если alfa и beta - не просто процедуры, а методы формы, то никакого противоречия ООП  нет. Во вторых - лучше две маленькие процедуры, чем одна большая.
 В третьих, если запутываетесь - пишите коментарии, пишите более понятные имена процедур и методов.
 
 Sender.Tag - так нельзя, дело в том,  что Sender имеет тип TObject, где этого свойства еще нет. Нужно привести как минимум к TComponent (если правильно помню, та там оно появляется).
 
 а вот что такое public label - я не знаю. или это label, объявленный в секции interface?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Толяныч (статус: 4-ый класс), 10 февраля 2011, 12:49 [#6]:Вадим К: а вот что такое public label - я не знаю. или это label, объявленный в секции interface?
 Если таким макаром метку в одном обработчике сделать доступной из другого обработчика? Нельзя?  Ну и ладно. Нет - так  нет.
 |  
|   | min@y™ (статус: Доктор наук), 10 февраля 2011, 13:05 [#7]:Не смотря на то, что вопрос решен, предложу свои 5 копеек с одним обработчиком: 
 procedure BtnA_and_B.Click(Sender: TObject);
begin
  // выполнить действия аlfa, если нажата BtnA ИЛИ (нажата BtnB И (условие = true ))
  if (Sender = BtnA) or ((Sender = BtnB) and ({ условие }))
    then { выполнить действия аlfa };
  // выполнить действия beta (в любом случае)
end;Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 10 февраля 2011, 13:18 [#8]:Толяныч: с помощью меток нельзя перейти в середину другой процедуры/метода. это противоречит паскалю вообще.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | bugmenot (статус: 3-ий класс), 10 февраля 2011, 13:47 [#9]:> из последнего примера конструкция компилиться не будет или будет работать неправильно? не понял вопроса, прекрасно работает потому что сравниваются указатели на объекты
 а в CASE требуются константные выражения, коими указатели не являются
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Толяныч (статус: 4-ый класс), 10 февраля 2011, 23:57 [#10]:Все, теперь полная ясность до следующего туману.Всем мерси. bugmenot: А конструкцию case я недолюбливаю еще с тех пор, когда ( лет 10 назад ) на фирме делал микроконтроллерные устройства , а мой молодой коллега - к ним программы верхнего уровня. Так он мне сказал : поскольку я как верхний уровень тут главный, то ты в своем протоколе применяять модификатор в команде не смей, т.к. в таком случае я не смогу применить Case, в результате мне пришлось дописывать пару страниц ассемблера в МК. Справедливости ради cто'ит отметить, что моих изделий с МК было поставлено несколько сотен, но увы - ни у одного заказчика не появилась потребность в верхнем уровне.
 Все, сорри за маленький оффтоп. Bye !
 |  
|   | min@y™ (статус: Доктор наук), 11 февраля 2011, 08:28 [#11]: Цитата (Толяныч): когда ( лет 10 назад ) на фирме делал микроконтроллерные устройства Ой, тоже молодость вспоминаю, когда помимо программ я написал на Delphi свой отладчик под свои же программы для микроконтроллеров. Было время!
 Щас смотрю я на ентот свой отладчик - ЁПРСТ, что за корявая хренотень! А люди до сих пор им пользуются, не смотря на ошибки.
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |