Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форма в 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо