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

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

форма в 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.


Наверх

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