Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.11;
Скачать: CL | DM;

Вниз

форма в DLL   Найти похожие ветки 

 
GanibalLector ©   (2006-05-04 14:02) [0]

Предположим,имеется приложение на форме которого расположен 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", но нужно именно так .


 
TUser ©   (2006-05-04 14:35) [1]

> я динамически загружаю форму из dll(Parent"ом которой является TPanel).

Это специально так - форма на панели? Лучше уж использовать фреймы и грузить их из bpl.


 
GanibalLector ©   (2006-05-04 18:55) [2]

Еще предложения есть???


 
Eraser ©   (2006-05-05 00:54) [3]


> GanibalLector ©   (04.05.06 14:02)  
>
> Предположим,имеется приложение на форме которого расположен
> TTreeView и TPanel. В зависимости от выбора элемента в  
> TTreeView я динамически загружаю форму из dll(Parent"ом
> которой является TPanel). Все как бы работает,но от Лукавого.
>  Т.е. если на форме,которая загружается из dll, находятся
> несколько TEdit, то при нажатии на Tab я НЕ перехожу к следующему,
> а перехожу в  TTreeView. Еще более ужасный эффект происходит
> с TStringGrid... т.е. ввел данные в некоторую ячейку и нажимаю
> Enter или стрелку вниз\вверх и,опять таки, фокус "уходит"
> из TStringGrid.

странно что это вообще работает... смысл использовать ДЛЛ, если при перекомпиляции таковой другой версией rtl - работать всё равно не будет (скорее всего)?


 
GanibalLector ©   (2006-05-05 01:01) [4]

Еще и как работает. Все сделано на интерфейсах,которые естественно проверяются.


 
jack128 ©   (2006-05-05 02:09) [5]

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 02:16) [6]

2 jack128 ©  
>То есть ты выставляешь Parent"а своей формы из dll через CreateParented/ParentWindow?

Да,через CreateParented.

Спасибо за [5] завтра проверю.

А что со скроллом? Как заставить его появиться ???


 
jack128 ©   (2006-05-05 02:27) [7]

GanibalLector ©   (05.05.06 2:16) [6]
Да,через CreateParented.

GanibalLector ©   (04.05.06 14:02)
Хотя для формы,на которой находится TStringGrid указан Parent =  TPanel главной формы

Как прикажешь тебя понимать, Саид?? (с)


 
jack128 ©   (2006-05-05 02:29) [8]

jack128 ©   (05.05.06 2:27) [7]

Проехали.  Я подумал, что под >>Хотя для формы,на которой находится TStringGrid указан Parent =  TPanel главной формы имелось в виду "указано свойство Parent"



Страницы: 1 вся ветка

Текущий архив: 2006.06.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.089 c
2-1148463740
Мурзилка
2006-05-24 13:42
2006.06.11
шрифты


3-1145361925
OlegOren
2006-04-18 16:05
2006.06.11
проверка: доступна ли БД?


2-1148449496
pavel_guzhanov
2006-05-24 09:44
2006.06.11
FastReport 3 и Delphi7


2-1148377208
Мурзилка
2006-05-23 13:40
2006.06.11
можно ли создать свой шрифт?


1-1146903019
kyn66
2006-05-06 12:10
2006.06.11
Реальное кол-во строк и столбцов в файле Excel