| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |