|
Вопрос # 6 667/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Стоит вопрос по передаче кода нажатой клавиши из основной формы в дочернюю.
Суть в следующем:
В основной форме есть TEdit.
При нажатии на клавиатуру в обработчике EditKeyPress(Sender: TObject; var Key: Char) код клавиши нужно послать в создаваемое дочернее окно Form2.
Окно Form2 модальное.
В Form2 имеется компонент DBGridEh, который уже сам обрабатывает полученное значение (поиск по букве в таблице).
Проблема: как передать нажатие клавиши из основной формы в создаваемое дочернее модальное окно.
Ниже приведен код, в котором никак не могу передать нажатие клавиши. Посоветуйте, как можно решить данный вопрос?
Приложение: Переключить в обычный режим- procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
- var f2:TForm2;
- begin
- if Key in [#13, #32..#255] then
- begin
- if Key=#13 then Key:=#0;
- f2:=TForm2.Create(self);
- try
- SendMessage(f2.Handle, WM_KEYDOWN, Ord(Key),0);
-
-
- f2.ShowModal ;
- finally
- f2.Free ;
- end;
- end;
- end;
-
 |
Вопрос задал: Ed (статус: 1-ый класс)
Вопрос отправлен: 1 июля 2017, 17:22
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 10 июля 2017, 01:54; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 1 июля 2017, 17:41 [#1]:
Нахрена SendMessage, если ты окно создаёшь? Передавай код клавиши прямо через параметр конструктора (или метода ShowModal) или через свойство Tag формы, или ещё 100500 способами.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ed (статус: 1-ый класс), 1 июля 2017, 18:00 [#2]:
Можно, конечно, передать тысячами другими способами, а потом уже внутри формы передать на внутреннюю обработку в DBGridEh. Но меня уже заинтересовала сама возможность передать данные в создаваемую модальную форму.
Скорее всего, нужно передать с задержкой, чтобы успело сработать f2.ShowModal.
|
|
min@y™ (статус: Доктор наук), 1 июля 2017, 18:12 [#3]:
WM_KEYDOWN дойдёт до контрола, когда он получит фокус. Не раньше.
Мой тебе совет: перестань заниматься всякой хуйнёй, усложняющей жизнь. В данном случае это надо - как зайцу стопсигнал.
Если так уж хочется извратиться, юзай метод Perform своего грида. Но не советую. Это как лечить зубы через жопу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ed (статус: 1-ый класс), 1 июля 2017, 21:39 [#4]:
Сделал самый простой вариант - передал через f2.Tag.
Но возникла новая проблема.
DBGridEh.KeyPress(var Key: Char) описан в разделе protected, к нему не могу обратиться.
При передаче через FormKeyPress(Sender: TObject; var Key: Char) значение Key в DBGridEh не идет.
Как пример, попробовал передать через нажатие на кнопку, не срабатывает:
procedure Tf2.Button1Click(Sender: TObject);
var c:char ;
begin
c:=char(parent.tag);
DBGridEh1.SetFocus;
FormKeyPress(self,c);
end;
Если непосредственно с клавиатуры ввожу - все нормально обрабатывается в DBGridEh1 (поиск по введенным буквам).
Кроме DBGridEh1 и кнопки на форме ничего нет.
Вопрос: как довести значение Form.tag до DBGridEh1?
|
|
min@y™ (статус: Доктор наук), 1 июля 2017, 21:55 [#5]:
Я ж тебе сказал - Perform юзай. Этот метод эмулирует приём оконного сообщения от системы.
Только я один хрен не понимаю, зачем тебе это всё понадобилось на практике...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ed (статус: 1-ый класс), 10 июля 2017, 01:54 [#6]:
Вопрос решен, Perform самодостаточен.
|
10 июля 2017, 01:55: Статус вопроса изменён на решённый (изменил автор вопроса — Ed)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|