Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Вниз

форма в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.014 c
2-1148386930
Бегин
2006-05-23 16:22
2006.06.11
TstringList


2-1148301709
Мурзилка
2006-05-22 16:41
2006.06.11
копирование в ФАРе


1-1146559645
neo_cleaner
2006-05-02 12:47
2006.06.11
сохранение формы


2-1148497893
S@shka
2006-05-24 23:11
2006.06.11
Ошика программы при старте под XP


2-1148639368
Glex
2006-05-26 14:29
2006.06.11
Как получить имена всех подпапок 1ур. данной папки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский