![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TMenuItem.Click -> any.dll\procedure
Dennis I. Komarov © (2009-05-22 10:38:00)Вопрос - не вопрос но:
Есть: некое приложение, интерфейс которого грузим из некой БД согласно правам пользователя, который запустил это приложение. В частности, возьмем ситуацию с TMainMenu. Согласно правам загрузилось дерево меню и подменюшек. Есть некая "ссылка" (int) на то, что должно выполнится при вызове соответствующего пункта. Процедура сего действия, а так же все интерфейсы и т.п. вынесены в библиотеку (dll).
Вопрос такой: Какая (а точнее, кто придумает лучшую) логика должна быть, чтобы связать конечный пункт менюшки с соответствующей процедурой в библиотеке, при том чтобы выполнялось условие: в приложении описана только логика а конкретные данные вынесены из него, т.е. при добавлении нового пункта (в БД) не изменялось само приложение, а только библиотека (или добавлялась новая)
clickmaker (2009-05-26 14:18:00) [61]кстати, вместо фрейма можно вполне и TForm юзать
она менее придирчива )
procedure TCustomForm.CreateParams(var Params: TCreateParams);
if (Parent = nil) and (ParentWindow = 0) then
begin
WndParent := Application.Handle;
Сергей М. (2009-05-26 14:17:00) [62]
> нету у нас УмбаЮмба-приложения
А как же "кроссплатформенность", на которую ты пальцем кажешь ?)
Сегодня нет, а завтра найдется ..
Ты же сам же сказал - "Есть: некоеприложение".
Почему этому "некому" не быть тем самым УмбаЮмба-приложением, пытающимся использовать твою суперпуперкроссплатформенную дельфийскую DLL, которая у тебя сейчас пытается в муках родиться ?)
> "главное окно У-Ю приложения" все равно должно иметь некий
> идентификатор
Ты не понял: УмбаЮмба-приложение может вообще не иметь "главного окна", в том смысле и с той спецификой, как оно трактуется и используется в дельфийском VCL-приложении
Dennis I. Komarov (2009-05-26 14:13:00) [63]И то, по идее, хендла окно (от MDIChild) Должно быть в принципе достаточно, т.к. через него можно найти хендл Win-Application, но это уже другая песня...
Dennis I. Komarov (2009-05-26 14:07:00) [64]нету у нас УмбаЮмба-приложения. Могут быть только библиотеки, которые соответственно могут распоряжаться двумя параметрами: хендл Win-Application и хендл окна куда она должна поместить свое УмбаЮмба windiws-окно
???
ЗЫ
А "главное окно У-Ю приложения" все равно должно иметь некий идентификатор, если оно конечно как-то связано с Windows :)
Сергей М. (2009-05-26 13:59:00) [65]
> App.Handle приложение должно вернуть хендл главного окна
> приложения
Так точно.
И тут же вопрос: а что есть "главное окно" УмбаЮмба-приложения ?)
Dennis I. Komarov (2009-05-26 13:57:00) [66]Возможно и не прав, но
App.Handle приложение должно вернуть хендл главного окна приложения (не MainForm)
Сергей М. (2009-05-26 13:51:00) [67]Так у тебя библиотека-то твоя не на УмбаЮмба писана, а на Делфи)
А УмбаЮмба знать не знает ни про какие Делфи и уж тем более про объект Application и специфику использования его свойства Handle)
Dennis I. Komarov (2009-05-26 13:48:00) [68]Так вроде у нас библиотеки могут разрабатываются на таком класном IDE :)
Сергей М. (2009-05-26 13:42:00) [69]
> AHandle передает Application.Handle приложения
Угу.
А что, по твоему, должно передать в кач-ве Application.Handle хост-приложение, разработанное в каком-нить УмбаЮмбаIDE ?)
Dennis I. Komarov (2009-05-26 13:36:00) [70]
> Кто же хэндл формы использует в кач-ве хендла глоб.объекта
> Application ?
Да ни в коем разе...
хендел формы передавался параметром AParent, AHandle передает Application.Handle приложения :)
Сергей М. (2009-05-26 13:26:00) [71]
> после
> Application.Handle:=AHandle;
Ну ты и додумался)
Кто же хэндл формы использует в кач-ве хендла глоб.объекта Application ?
Dennis I. Komarov (2009-05-26 13:15:00) [72]Из копания в генофонде нашел:
procedure TCustomFrame.CreateParams(var Params: TCreateParams);
begin
inherited;
if Parent = nil then
Params.WndParent := Application.Handle;
end;
т.е.
после
Application.Handle:=AHandle;
ошибку победили, но фрэйм так и не появился :(
clickmaker (2009-05-26 12:43:00) [73]> [79] Dennis I. Komarov © (26.05.09 11:16)
> Да, я не пойму почему...
в методе CreateParams FParentWindow чему равно?
Dennis I. Komarov (2009-05-26 11:16:00) [74]Да, я не пойму почему...
Сергей М. (2009-05-26 11:04:00) [75]
> TForm.Handle не есть хендл окна?
Есть.
Ну так ты убедился что Params.WndParent = 0 ?
Dennis I. Komarov (2009-05-26 10:58:00) [76]да спросил конечно, чего его спрашивать то если и так видно :)
Тока вот почему... *SCRATCH*
TForm.Handle не есть хендл окна?
Сергей М. (2009-05-26 10:45:00) [77]
> Отладчик молчит по поводу значения WndParent
Так ты спроси у него конкретно - чему, мол, равно Params.WndParent)
Он же "бестолковый" - не понимает что ид-р WndParent имеет отношение к структуре Params)
Dennis I. Komarov (2009-05-26 10:36:00) [78]
> Dennis I. Komarov © (26.05.09 10:31) [74]
нет, обманул, не то окно пробежал, действительно попадаем внутрь :(
Dennis I. Komarov (2009-05-26 10:31:00) [79]
procedure TWinControl.CreateWnd;
var
Params: TCreateParams;
TempClass: TWndClass;
ClassRegistered: Boolean;
begin
CreateParams(Params);
with Params do
begin
if (WndParent = 0) and (Style and WS_CHILD <> 0) then
if (Owner <> nil) and (csReading in Owner.ComponentState) and
(Owner is TWinControl) then
WndParent := TWinControl(Owner).Handle
else
raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);
FDefWndProc := WindowClass.lpfnWndProc;
Отладчик молчит по поводу значения WndParent, но после 1-го if идем на выделенную строку, значит WndParent <> 0 (ну или Style and WS_CHILD = 0) :) Так что не тут ошибочка ...
KSergey (2009-05-26 10:29:00) [80]мне вот интересно
Идет обсуждение тех. реализации...
а может посмотреть на готовое? ну вот в винамп очень даже гибко встраивается
или есть еще микрософтовский API для mmc.
Может поизучать как и что люди делают?