Форум: "Прочее";
Текущий архив: 2014.03.23;
Скачать: [xml.tar.bz2];
Внизвопрос по событиям Найти похожие ветки
← →
ПЛОВ © (2013-10-02 11:54) [0]Можно ли как-то обычную процедуру привязать к форме как событие? Типа такого:
procedure MyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
...
Form1.OnKeyDown := MyKeyDown;
← →
брат Птибурдукова (2013-10-02 11:56) [1]В сети были примеры… Чё-то там с типом TMethod. На ДелфиКингдом поищи. А лучше поищи другое решение.
← →
Dimka Maslov © (2013-10-02 12:08) [2]type TMyKeyDown = class (TObject)
class procedure MyKeyDown(...)
end;
Form1.OnKeyDown := TMyKeyDown.MyKeyDown;
← →
брат Птибурдукова (2013-10-02 12:21) [3]
> Dimka Maslov © (02.10.13 12:08) [2]
Вопрос ведь не о методе другого класса, а о не-методе.
← →
vuk © (2013-10-02 12:25) [4]А кто вообще мешает в обычном методе-обработчике вызвать эту процедуру?
← →
ПЛОВ © (2013-10-02 12:28) [5]
> type TMyKeyDown = class (TObject) class procedure MyKeyDown(.
> ..)end;Form1.OnKeyDown := TMyKeyDown.MyKeyDown;
Спасибо, но это немного не то.
> TMethod
Нашел пример, но там онклик. Сделал аналогично - ахис в момент срабатывания. Код такой:
var
M: TMethod;
...
M.Code := @_KeyDown;
M.Data := nil;
Btn[bi].OnKeyDown := TKeyEvent(M);
Btn[bi] - девэкспрессовская кнопка...
← →
Плохиш © (2013-10-02 12:29) [6]
> Типа такого:
Типа такого нельзя, параметра не хватает.
← →
Dimka Maslov © (2013-10-02 15:39) [7]procedure MyKeyDown(P: Pointer; Sender: TObject; var Key: Word; Shift: TShiftState);
тогда можно будет TMethod
← →
[ВладОшин] © (2013-10-02 17:15) [8]>> P: Pointer;
Точно, это ж Self :)
забыл..
← →
RWolf © (2013-10-02 17:26) [9]Почему бы просто не вызвать эту процедуру в обработчике события?
← →
ProgRAMmer Dimonych © (2013-10-02 20:47) [10]А я предлагаю ещё обсудить, что делается в этой процедуре. Как бы не оказалось, что процедуре самое место в методах класса.
← →
ПЛОВ © (2013-10-03 09:27) [11]создается форма для вывода сообщения, по нажатию эскейпа эту форму нужно закрыть
← →
ПЛОВ © (2013-10-03 09:29) [12]пож, только не пишите что есть рабоче-крестьянский MessageBox - он не годится :)
← →
ProgRAMmer Dimonych © (2013-10-03 09:33) [13]> [11] ПЛОВ © (03.10.13 09:27)
> [12] ПЛОВ © (03.10.13 09:29)
Чем не устраивает буржуазный ShowModal? Закрытие по Esc — это поведение формы с сообщением, туда и дорога этой строчке из 5 букв.
procedure TMyMessageForm.OnKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then
Close;
end;
А ежели в ней ещё и кнопка «Отмена» будет, как в лучших месседжбоксах винапи, так и вообще Cancel = True и забыть как страшный сон.
← →
ПЛОВ © (2013-10-03 09:43) [14]TMyMessageForm - у меня нету. Есть TForm - он создается, на него ставится текст и кнопки. Нужно к нему прикрутить обработчик.
Еще такой вопрос - как создать свой класс-наследник от TForm, чтобы он не требовал наличия dfm?
← →
ПЛОВ © (2013-10-03 09:45) [15]У меня ShowModal -ом форма и отображается. Но при нажатии Esc - закрытия не происходит.
← →
[ВладОшин] © (2013-10-03 09:45) [16]function Answer: TAnswer;
var
F: TCoolFormForQuest;
begin
F := TCoolFormForQuest.Create(nil);
F.ShowModal;
Result := CalcResult(F.SomePublicVal);
F.Free;
end;
и рисуй как хочешь TCoolFormForQuest, с любыми кнопками и любым поведением
а перед закрытием логику в паблик переменную сохранить
← →
Dimka Maslov © (2013-10-03 10:24) [17]
> У меня ShowModal -ом форма и отображается. Но при нажатии
> Esc - закрытия не происходит.
Для этого достаточно
1. Кнопке назначить Cancel = True
2. В обработчике её OnClick явно прописать Close или ModalResult := mrCancel (или что там ещё)
Всё. Не надо для этого изголяться и приписывать простые методы обработчику OnKeyDown всё формы
← →
ProgRAMmer Dimonych © (2013-10-03 11:11) [18]> TMyMessageForm - у меня нету. Есть TForm - он создается,
> на него ставится текст и кнопки. Нужно к нему прикрутить
> обработчик.
Это и есть TMyMessageForm. Как он называется у Вас — дело десятое. Закрыть она себя может и сама, без всяких обработчиков-не-методов.
> Еще такой вопрос - как создать свой класс-наследник от TForm,
> чтобы он не требовал наличия dfm?
Ответьте на два вопроса и поймёте, почему просите не странного, а невозможного.
1. Какая информация записывается в DFM?
2. Можно ли при наследовании избавиться от published-членов базового класса?
← →
jumping jack (2013-10-03 11:18) [19]>...TForm, чтобы он не требовал наличия dfm?
просто вызывать CreateNew вместо Create (если что - и вместо Application.CreateForm)
← →
Чайник © (2013-10-03 14:18) [20]
> У меня ShowModal -ом форма и отображается. Но при нажатии
> Esc - закрытия не происходит.
У TForm усть такое свойство - KeyPreview. Поставь его в True и тогда при нажатии эскейпа будет вызываться обработчик OnKeyPress самой формы, а потом уже ее контролов. Ну а в OnKeyPress формы вставь
if Key = #27 then Close;
← →
Kerk © (2013-10-03 14:23) [21]Почти не оффтоп. В XE5 появился еще один механизм работы модальных окон.
http://blog.marcocantu.com/blog/xe5_anonymous_showmodal_android.html
← →
брат Птибурдукова (2013-10-03 14:28) [22]
> Ну а в OnKeyPress формы вставь if Key = #27 then Close;
Повбывав бы…
Православный способ уже был озвучен в [17], пункт 1. На кой чёрт тут назначать обработчики событий — совершенно неясно.
← →
ProgRAMmer Dimonych © (2013-10-03 20:50) [23]> [22] брат Птибурдукова (03.10.13 14:28)
>
> > Ну а в OnKeyPress формы вставь if Key = #27 then Close;
>
> Повбывав бы…
>
> Православный способ уже был озвучен в [17], пункт 1. На
> кой чёрт тут назначать обработчики событий — совершенно
> неясно.
Ну, хотя бы потому что ТС до сих пор не подтвердил, что у него для этого действия есть соответствующая кнопка. Пока мы просто знаем, что там есть какие-то кнопки.
← →
все арамисы, а я Дартаньян (2013-10-03 21:03) [24]
> ТС до сих пор не подтвердил, что у него для этого действия
> есть соответствующая кнопка
Ну это да, зато желание назначить хитровыпиленный метод он изъявил в [0]… И не какой-то попсовый KeyPress, а хардкорный KeyDown (ждём ветки про KeyPreview, хотя о нём и сказали выше). .
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2014.03.23;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c