Форум: "Основная";
Текущий архив: 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