Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

TNotifyEvent;   Найти похожие ветки 

 
АБВ   (2009-02-05 12:20) [0]

Здравствуйте. Подскажите как к переменной Event типа TNotifyEvent, присвоить процедуру. Пробовал делать так:

procedure EventAction;
begin
 ShowMessage("TEST");
end;

var
 Event : TNotifyEvent;
begin
 Event := EventAction;
end;

не вышло .. подскажите как правильно это реализовать ?


 
Ega23 ©   (2009-02-05 12:22) [1]

type
 TNotifyEvent = procedure (Sender : TObject) of object;


 
АБВ   (2009-02-05 12:26) [2]

Понял, спасибо =)


 
АБВ   (2009-02-05 13:01) [3]

Мастера подскажите плз. Заполнил меню PopupMenu множеством элементов у которых одна общая процедура для отработки. Как в процедуре можно узнать из какого пункта меню была она вызвана.

Заполняю меню так:

var
 Event : TNotifyEvent;
begin
 Event := EventAction;
 N48.Add(NewItem(LogText, 0, False, True, Event, 0, "MenuItem1"));
end;

procedure EventAction(Sender: TObject);
begin
ShowMessage("TEST");
end;


 
Плохиш ©   (2009-02-05 13:09) [4]


> procedure EventAction(Sender: TObject);
>

Воспользуйся англо-русским словарём для перевода выделенного слова, раз уж в хелп заглянуть западло.


 
Ega23 ©   (2009-02-05 13:15) [5]


> Воспользуйся англо-русским словарём для перевода выделенного
> слова, раз уж в хелп заглянуть западло.


Тут не всё так просто. В данной ситуации в качестве Sender может TMenuItem придти. А может и TCustomAction.


 
Плохиш ©   (2009-02-05 13:22) [6]


> Ega23 ©   (05.02.09 13:15) [5]

Судя по [3], не может.


 
clickmaker ©   (2009-02-05 13:25) [7]

может
function NewItem(...)
...
 Result.Action.OnExecute := Event;


 
Плохиш ©   (2009-02-05 13:32) [8]


> clickmaker ©   (05.02.09 13:25) [7]
>
>

Хм, bds2006

function NewItem(const ACaption: string; AShortCut: TShortCut;
 AChecked, AEnabled: Boolean; AOnClick: TNotifyEvent; hCtx: THelpContext;
 const AName: string): TMenuItem;
begin
 Result := TMenuItem.Create(nil);
 with Result do
 begin
   Caption := ACaption;
   ShortCut := AShortCut;
   OnClick := AOnClick;
   HelpContext := hCtx;
   Checked := AChecked;
   Enabled := AEnabled;
   Name := AName;
 end;
end;

А в твоей версии AV будет :-P


 
АБВ   (2009-02-05 13:43) [9]

а мне как быть, подскажите плз =(


 
Плохиш ©   (2009-02-05 13:44) [10]


> АБВ   (05.02.09 13:43) [9]
>
> а мне как быть, подскажите плз

Тяжёлый случай, я тебе помочь не смогу, а пас...


 
Ega23 ©   (2009-02-05 13:45) [11]


> а мне как быть, подскажите плз =(


Чего надо-то?  :)
Изложи сюда свою задачу - авось чего и придумаем...


 
Плохиш ©   (2009-02-05 13:48) [12]


> Ega23 ©   (05.02.09 13:45) [11]
>
>

Ты чего над маленькими издеваешься? Он же в [3] сказал, что надо.


 
АБВ   (2009-02-05 13:52) [13]

Список элементов в меню заполняется автоматически. Все они вызывают одну процедуру. При отработке этой процедуры у меня должно появится окошко что то вроде "процедура вызвана меню: N72" Это лишь пример, на самом деле по имени меню я бы мог выполнять необходимые действия для каждого элемента меню индивидуально.


 
Плохиш ©   (2009-02-05 13:57) [14]


> АБВ   (05.02.09 13:52) [13]

Ещё раз попробую.

Выполнил рекомендацию из [4]?
В хелпе читал?


 
АБВ   (2009-02-05 14:01) [15]


> Выполнил рекомендацию из [4]?
> В хелпе читал?


перевел и читал. Только не пойму как мне Sender может дать нужную инфу.


 
clickmaker ©   (2009-02-05 14:04) [16]

> А в твоей версии AV будет :-P

не будет
function NewItem
...
 Result.Action := TAction.Create

o)


 
clickmaker ©   (2009-02-05 14:08) [17]

> как мне Sender может дать нужную инфу

сендер - это объект
у объекта есть свойства


 
АБВ   (2009-02-05 14:09) [18]


> сендер - это объект
> у объекта есть свойства


понял, спасибо))))) ох уж и чайник же я.

ShowMessage(TMenuItem(Sender).Caption);


 
Ega23 ©   (2009-02-05 14:21) [19]

ShowMessage(TMenuItem(Sender).Caption);


Обрати внимание на [5]. Если ты вдруг пункту меню назначишь Action, то в качестве Sender тебе придёт объект класса TAction, а не объект класса TMenuItem.
Если ты действительно никогда не будешь заморачиваться с экшенами, то данное приведение TMenuItem(Sender) у тебя всегда будет работать.
Если же части MenuItem ты назначишь прямой обработчик, а части - Action, то тогда получишь "бардак и коррупцию" (с) ДМБ.

Я года 3 назад аккурат с этим делом накололся.


 
Anatoly Podgoretsky ©   (2009-02-05 14:22) [20]

> АБВ  (05.02.2009 14:01:15)  [15]

Потому что Sender это TObject от него наследуются все остальные.


 
Плохиш ©   (2009-02-05 15:19) [21]


> АБВ   (05.02.09 14:09) [18]
>
>

Перед приведением типа, стоит проверить допустимость такого приведения. Читай справку про оператор is.


 
KSergey ©   (2009-02-05 16:42) [22]

> Плохиш ©   (05.02.09 15:19) [21]
> Читай справку про оператор is.

или as - тоже не плохо, хотя бы вместо всегдашнего безусловного приведения


 
Ega23 ©   (2009-02-05 16:45) [23]


> или as - тоже не плохо, хотя бы вместо всегдашнего безусловного
> приведения


А чё as? Внутре тупо проверка на is и в случае успеха - безусловное приведение.


 
Anatoly Podgoretsky ©   (2009-02-05 16:50) [24]

> Ega23  (05.02.2009 16:45:23)  [23]

А в случае неуспеха громкое исключение и автора вызываем из отпуска для исправления программы.


 
Ega23 ©   (2009-02-05 16:52) [25]


> А в случае неуспеха громкое исключение и автора вызываем
> из отпуска для исправления программы.


Угумс. Я вообще не понимаю нужность as, кроме случая приведения к интерфейсам.
Ну если только логика на эксепшенах не построена...  :)

а так
if (Sender is Что-то) then
 Что-то(Sender). .....



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.051 c
1-1208755921
OlBan
2008-04-21 09:32
2009.03.29
TAPDComport и модем


15-1233208661
charoey_mag
2009-01-29 08:57
2009.03.29
GSM сигнализация по температуре


15-1233084580
Eraser
2009-01-27 22:29
2009.03.29
Скрыть строку от отладчика и хекс-редактора


3-1217238791
Fynjy
2008-07-28 13:53
2009.03.29
как вручную создать TIBDataBase


2-1233138545
Oleg_teacher
2009-01-28 13:29
2009.03.29
Узнать могу ли я создать файл в папке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский