Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TMenuItem.Click -> any.dll\procedure


Страницы:   1 2 3 4 5 6 7 8

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 - он как окно должен быть со своим хендлом.
передали хендл приложению, дальше что?


Страницы:   1 2 3 4 5 6 7 8

Наверх

Титульная страница Поиск, карта сайта Написать письмо