![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
форма в DLL [D7, WinXP]
GanibalLector © (2006-05-04 14:02:00)Предположим,имеется приложение на форме которого расположен TTreeView и TPanel. В зависимости от выбора элемента в TTreeView я динамически загружаю форму из dll(Parent'ом которой является TPanel). Все как бы работает,но от Лукавого. Т.е. если на форме,которая загружается из dll, находятся несколько TEdit, то при нажатии на Tab я НЕ перехожу к следующему,а перехожу в TTreeView. Еще более ужасный эффект происходит с TStringGrid... т.е. ввел данные в некоторую ячейку и нажимаю Enter или стрелку вниз\вверх и,опять таки, фокус "уходит" из TStringGrid.
Как быть??? Ведь на момент запуска программы, она не знает ничего о TabStop и TabOrder элементов формы которые в dll.
И еще... предположим на форме в dll находится TStringGrid с Align=alClient и RowCount=1001. При показе этой формы в приложении ScrollBar по непонятным причинам отсутсвует. Хотя для формы,на которой находится TStringGrid указан Parent = TPanel главной формы. Если же для TStringGrid указать Align=alNone,то ScrollBar будет присутствовать.
В общем,такие вот мелкие неприятности,с которыми не могу разобраться :(
З.Ы. Знаю,"сколько уже истрачено черных пикселей на слова о "кривости" подхода форм в dll", но нужно именно так .
jack128 (2006-05-05 02:29:00) [1]jack128 © (05.05.06 2:27) [7]
Проехали. Я подумал, что под >>Хотя для формы,на которой находится TStringGrid указан Parent = TPanel главной формыимелось в виду "указано свойство Parent"
jack128 (2006-05-05 02:27:00) [2]GanibalLector © (05.05.06 2:16) [6]
Да,через CreateParented.
GanibalLector © (04.05.06 14:02)
Хотя для формы,на которой находится TStringGrid указан Parent = TPanel главной формы
Как прикажешь тебя понимать, Саид?? (с)
GanibalLector (2006-05-05 02:16:00) [3]2 jack128 ©
>То есть ты выставляешь Parent'а своей формы из dll через CreateParented/ParentWindow?
Да,через CreateParented.
Спасибо за [5] завтра проверю.
А что со скроллом? Как заставить его появиться ???
jack128 (2006-05-05 02:09:00) [4]GanibalLector © (05.05.06 1:01) [4]
Еще и как работает. Все сделано на интерфейсах,которые естественно проверяются.
То есть ты выставляешь Parent'а своей формы из dll через CreateParented/ParentWindow?
А по сути вопроса - имею сказать следующее:
procedure TCustomForm.CMDialogKey(var Message: TCMDialogKey);
begin
if GetKeyState(VK_MENU) >= 0 then
with Message do
case CharCode of
VK_TAB:
if GetKeyState(VK_CONTROL) >= 0 then
begin
SelectNext(FActiveControl, GetKeyState(VK_SHIFT) >= 0, True);
Result := 1;
Exit;
end;
...
end;
inherited;
end;
Это сообщение получает коневая форма(та что TreeView + Panel). Она не знает, что ты на неё поместил контролы из dll и все их просто игнорирует. Тебе нужно переопределить обработчик этого сообщения и если активное окно - дочка формы из dll, то перенаправить CM_DIALOGKEY - в эту саму форму из dll. Примерно так:
procedure TfrmMain.CMDialogKey(var Message: TCMDialogKey);
var
CurWindow: THandle;
begin
if (GetKeyState(VK_MENU) >= 0) and (Message.CharCode = VK_TAB) then
begin
CurWindow := GetFocus;
if GetParent(CurWindow) = FDllWindow then // в теории нужно ВСЕХ предков, а не только непосредственного родителя проверять..
Message.Result := SendMessage(FDllWindow, CM_DIALOGKEY,
TMessage(Message).WParam, TMessage(Message).LParam)
else
inherited;
end else
inherited;
end;
Сам естественно не проверял, но при некоторой доле везения должно заработать ;-)
GanibalLector (2006-05-05 01:01:00) [5]Еще и как работает. Все сделано на интерфейсах,которые естественно проверяются.
Eraser (2006-05-05 00:54:00) [6]
> GanibalLector © (04.05.06 14:02)
>
> Предположим,имеется приложение на форме которого расположен
> TTreeView и TPanel. В зависимости от выбора элемента в
> TTreeView я динамически загружаю форму из dll(Parent'ом
> которой является TPanel). Все как бы работает,но от Лукавого.
> Т.е. если на форме,которая загружается из dll, находятся
> несколько TEdit, то при нажатии на Tab я НЕ перехожу к следующему,
> а перехожу в TTreeView. Еще более ужасный эффект происходит
> с TStringGrid... т.е. ввел данные в некоторую ячейку и нажимаю
> Enter или стрелку вниз\вверх и,опять таки, фокус "уходит"
> из TStringGrid.
странно что это вообще работает... смысл использовать ДЛЛ, если при перекомпиляции таковой другой версией rtl - работать всё равно не будет (скорее всего)?
GanibalLector (2006-05-04 18:55:00) [7]Еще предложения есть???
TUser (2006-05-04 14:35:00) [8]> я динамически загружаю форму из dll(Parent'ом которой является TPanel).
Это специально так - форма на панели? Лучше уж использовать фреймы и грузить их из bpl.