![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TMenuItem.Click -> any.dll\procedure
Dennis I. Komarov © (2009-05-22 10:38:00)Вопрос - не вопрос но:
Есть: некое приложение, интерфейс которого грузим из некой БД согласно правам пользователя, который запустил это приложение. В частности, возьмем ситуацию с TMainMenu. Согласно правам загрузилось дерево меню и подменюшек. Есть некая "ссылка" (int) на то, что должно выполнится при вызове соответствующего пункта. Процедура сего действия, а так же все интерфейсы и т.п. вынесены в библиотеку (dll).
Вопрос такой: Какая (а точнее, кто придумает лучшую) логика должна быть, чтобы связать конечный пункт менюшки с соответствующей процедурой в библиотеке, при том чтобы выполнялось условие: в приложении описана только логика а конкретные данные вынесены из него, т.е. при добавлении нового пункта (в БД) не изменялось само приложение, а только библиотека (или добавлялась новая)
Dennis I. Komarov (2009-05-25 16:11:00) [101]
> Сергей М. © (25.05.09 16:02) [50]
procedure TFormMain.MenuItemClick(Sender: TObject);
var
LibHandle: THandle;
ShowUserI: TBaseFunction;
X: TFormMDIBaseCh;
begin
x:=TFormMDIBaseCh.Create(Application); begin
x.Caption := TMenuItem(Sender).Caption;
LibHandle:=LoadLibrary('users.dll');
try
if LibHandle <> 0 then begin
@ShowUserI:=GetProcAddress(LibHandle, 'CreateIUsers');
if Addr(ShowUserI) <> nil then begin
x.Caption:= IntToStr(ShowUserI(x.Handle));
// или просто ShowUserI(x.Handle);
end;
end;
finally
FreeLibrary(LibHandle);
end;
end;
end;
Dennis I. Komarov (2009-05-25 16:07:00) [102]Classes.pas
...
function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
function InitComponent(ClassType: TClass): Boolean;
...
Result := InternalReadComponentRes(ClassType.ClassName, FindResourceHInstance(
FindClassHInstance(ClassType)), Instance) or Result;
Вот в этой умерает где-то внутри, в асме запутался кто чего откуда
Сергей М. (2009-05-25 16:02:00) [103]Тогда приводи код вызова этой ф-ции - что и как передаешь параметром ..
Dennis I. Komarov (2009-05-25 15:59:00) [104]
> А вот в [24] что-то не видать соглашения ..
[24] писал с чужого компа, просто не дописал...
clickmaker (2009-05-25 15:01:00) [105]> Внутрь CreateParented не заходит
[x] Use debug DCUs в настройках проекта + rebuild all
Сергей М. (2009-05-25 14:52:00) [106]
> и там и там есть:
>
А вот в [24] что-то не видать соглашения ..
Dennis I. Komarov (2009-05-25 14:47:00) [107]
> Виноватый тот кто его втыкает там где он совершенно не нужен
> и, напротив, не втыкает там где он действительно необходим)
Ну если учесть что пишем ядро для "кроссплатформенных интерфейсов", то так уж он и не нужен? Для эксперемента снял его (и там и там) результат не поменялся :(
> если уж он есть, то и описание фунции в exe тоже должно
> быть с ним
Разумеется и там и там есть:
type
TBaseFunction = function(AParent: HWND): HWND; stdcall;
> прямо-таки здесь? а если отладчиком попробовать зайти в
> CreateParented?
пробывал, он сразу (по F7) и отпревляет на ... Внутрь CreateParented не заходит :(
clickmaker (2009-05-25 14:17:00) [108]> ctdcall виновытый?
если уж он есть, то и описание фунции в exe тоже должно быть с ним
> здесь:
> with TFrameUsers.CreateParented
прямо-таки здесь? а если отладчиком попробовать зайти в CreateParented?
Сергей М. (2009-05-25 14:14:00) [109]Виноватый тот кто его втыкает там где он совершенно не нужен и, напротив, не втыкает там где он действительно необходим)
Dennis I. Komarov (2009-05-25 14:13:00) [110]
> Подозреваю, что сейчас начнется свистопляска с соглашением
> о вызове)
ctdcall виновытый?
Сергей М. (2009-05-25 14:11:00) [111]
> Хэндл в функцию передается
Значит не передается, если тебе черным по белому пишут, что "control .. has no parent window"
Подозреваю, что сейчас начнется свистопляска с соглашением о вызове)
Dennis I. Komarov (2009-05-25 14:11:00) [112]здесь:
with TFrameUsers.CreateParented(AParent) do begin
clickmaker (2009-05-25 13:44:00) [113]> Ловим "control 'Frame' has no parent window
в какой момент?
Dennis I. Komarov (2009-05-25 13:39:00) [114]Все хорошо, но где-то не хорошо :(
[DLL]
...
type
TFrameUsers = class(TFrame)
ListViewUsers: TListView;
Splitter1: TSplitter;
PageControl1: TPageControl;
StatusBar1: TStatusBar;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
ToolBar1: TToolBar;
ImageList1: TImageList;
ToolButton1: TToolButton;
private
{ Private declarations }
public
{ Public declarations }
end;
function CreateIUsers(AParent: HWND): HWND; stdcall;
implementation
{$R *.dfm}
function CreateIUsers;
begin
with TFrameUsers.CreateParented(AParent) do begin
Result:=Handle;
end;
end;
Ловим "control 'Frame' has no parent window
Хэндл в функцию передается
...
clickmaker (2009-05-25 12:50:00) [115]т.е. function CreateFrame(AParent: HWND): HWND, конечно же
я к тому, что идеологически правильней передавать родителя при создании окна, чем принудительно его потом назначать, тем более, если он уже известен.
clickmaker (2009-05-25 12:42:00) [116]> не совсем понял, у нас же в длл есть созданный TFrame, по
> сути тот же Window
ну, наверно все-таки правильней так
[DLL]
function CreateFrame(AParent: HWND): TFrame;
begin
Frame := TAnyFrame.CreateParented(AParent);
Result := Frame.Handle;
end;
Dennis I. Komarov (2009-05-25 12:34:00) [117]
> в DLL передаем хэндл родителя и там либо CreateWindow либо
> CreateParented
не совсем понял, у нас же в длл есть созданный TFrame, по сути тот же Window
> либо возвращаем хэндл из DLL и делаем SetParent
т.е.
[DLL]
TAnyFrame.Create(nil);
Result:=TAnyFrame.Handle;
[EXE]
if SetParent(HandleFromDll, ActiveChildForm) = nil then ...
clickmaker (2009-05-25 11:57:00) [118]> передали хендл приложению, дальше что?
а тут всего 2 варианта. Либо в DLL передаем хэндл родителя и там либо CreateWindow либо CreateParented, либо возвращаем хэндл из DLL и делаем SetParent
Dennis I. Komarov (2009-05-25 11:56:00) [119]
> решается и кросплатформенность: напеши фрейворк, определи
> типы контролов, и типы евентов... аля 1С получица
ну сейчас еще с окнами повожуся и приступлю к написанию "2С" :)
Dennis I. Komarov (2009-05-25 11:54:00) [120]
> clickmaker © (25.05.09 11:20) [31]
Ну и я про то, что о VCL придется забыть...
Мануал - пример можно?
Ну создали мы некий TAnyFrame - он как окно должен быть со своим хендлом.
передали хендл приложению, дальше что?