![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форма в ScrollBox и OnKeyDown
P.N.P. © (2005-05-26 13:52:00)Создаю форму в ScrollBox:
NewForm:=TNewForm.CreateParented(ScrollBox.Handle);
Форма нормально создается, но событие OnKeyDown у нее напрочь несрабатывает.
Вопрос:
Кто в моем случае занимается обработкой сообщений с клавиатуры?
Можно ли как-то обойтись без хука?
Bel (2005-05-26 16:00:00) [1]У меня все работает, меню вызывается.
Попробуй сделать все это на чистом проекте. Может быть еще какая фигня мешает.
P.N.P. (2005-05-26 15:47:00) [2]>Bel © (26.05.05 15:36) [17]
Да, на Form1 KeyDown обрабатывается, это радует :)
Но системное попапменю (там где "Выделить все", "Копировать" и т.п.)
в Edit (который на Form2) все же не вылезает.
В принципе вопрос можно снять.
Bel (2005-05-26 15:36:00) [3]У меня с этим кодом все работает. И меню выскакивает, и KeyDown срабатывает (в Form1).
P.N.P. (2005-05-26 15:23:00) [4]Вот, в качестве примера - 2 формы, в *.dpr создается только
Form1, Form2 создается динамически.
На Form1 расположен TScrollBox, Align:=alClient;
На Form2 - только один TEdit.
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2:=TForm2.Create(Application);
Form2.Parent:=ScrollBox1;
Form2.SetBounds(10,10,200,200);
Form2.Visible:=True;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.Free;
end;
-=XP=- (2005-05-26 15:12:00) [5]Все это странно.
Приведите, пожалуйста, код.
Bel (2005-05-26 15:11:00) [6]> контекстное меню у того же Edit-а при правом клике не вылезает
У меня вылезает.
Bel (2005-05-26 15:10:00) [7]Здесь обработкой клавиш занимается форма-родитель. У неё надо устанавливать KeyPreview и обрабатывать клавиши.
P.N.P. (2005-05-26 15:00:00) [8]Хотя не все в порядке - контекстное меню у того же Edit-а при
правом клике не вылезает :(
Что за беда? Как тогда правильно форму в скролбокс вставить?
P.N.P. (2005-05-26 14:57:00) [9]>-=XP=- © (26.05.05 14:43) [10]
Нет, тут наличие заголовка не играет никакой роли.
(Если не считать того, что заголовок окна в "Неактивном" состоянии)
Клики мышой проходят нормально, да и вобще,
все конролы на форме работают как надо, беспокоит только
обработка нажатий клавиш самой формой.
-=XP=- (2005-05-26 14:43:00) [10]Единственное объяснение сему факту - наличие заголовка окна. Установите BorderStyle = bsNone - и все заработает.
Причину пока не выяснил.
Поведение такое, будто бы оно, это окно, находится вне контекста Parent окна. И по Tab'у на него не переходит фокус.
При включении заголовка - перестает ловить левый клик мыши.
А все остальное - работает так, как надо. Попробуйте кликнуть правой кнопкой мыши на любом контроле такого (с заголовокм) окна - оно поймает фокус и будет нормально работать. Можно фокус и через SetFocus устанавливать.
P.N.P. (2005-05-26 14:40:00) [11]>Bel © (26.05.05 14:37) [8]
Форма.
KeyPreview:=true;
Bel (2005-05-26 14:37:00) [12]> Однако всеравно, нажатие клавиш невоспринимает.
Кто не воспринимает? Форма или контролы на ней? KeyPreview правильно установлено?
P.N.P. (2005-05-26 14:35:00) [13]>Bel © (26.05.05 14:30) [6]
Да.
Дело в том, что форма изначально невидима,
добавил в OnShow Parent := ScrollBox и форма теперь
все-таки внутри скроллбокса. Однако всеравно, нажатие
клавиш невоспринимает.
Bel (2005-05-26 14:30:00) [14]> Изначально я так и пытался - NewForm:=TNewForm.Create(Application)
А парентом ей установил скроллбокс?
P.N.P. (2005-05-26 14:28:00) [15]>Johnmen © (26.05.05 14:25) [4]
>Будет.
Нет.
Изначально я так и пытался - NewForm:=TNewForm.Create(Application)
Johnmen (2005-05-26 14:25:00) [16]>P.N.P. © (26.05.05 14:17) [2]
>В этом случае форма не будет находиться внутри ScrollBox.
Будет.
А ты почему решил, что не будет?
TUser (2005-05-26 14:20:00) [17]А зачем ее туда? Для таких вещей придуманы фреймы.
P.N.P. (2005-05-26 14:17:00) [18]>Bel © (26.05.05 14:14) [1]
В этом случае форма не будет находиться внутри ScrollBox.
Bel (2005-05-26 14:14:00) [19]Вообще то CreateParented рекомендуется использовать для не-VCL окон. Лучше использовать
NewForm:=TNewForm.Create(Application);
NewForm.Parent := ScrollBox;