我的程序采用MDI模式,子窗体封装到了DLL中,当主程序调用DLL中的子窗体时“窗口”菜单不能新增这个项目,而调用主程序中的子窗体却可以在“窗口”菜单中显示,不知道我说清楚了没有,请高手指教。我的程序如下:主程序:
unit MainUnit;interfaceuses
......type
InvokeDLLForm = function(App: TApplication; Scr: TScreen): TForm;
TForm1 = class(TForm)
......var
Form1: TForm1;
DLLForm:TForm;//下面这个可以在“窗口”菜单中显示,TChildForm在主程序中。
procedure TForm1.NewItemClick(Sender: TObject);
var
Child: TChildForm;
begin
Inc(Count);
Child := TChildForm.Create(Self);
Child.Caption := Child.Caption + ' ' + IntToStr(Count);
end;//下面这个不能在“窗口”菜单中显示,子窗体在DLL中。
procedure TForm1.OrderForm1Click(Sender: TObject);
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
begin
DLLHandle := LoadLibrary('E:\DOrderForm.dll');
if DLLHandle <> 0 then
begin
@DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
if Assigned(DLLSub) then
begin
DLLForm := DLLSub(Application, Screen);
end;
end;
end;
==========================================================
//DLL子窗体
library DOrderForm;
.....var
DLLApp: TApplication;
DLLScr: TScreen;function CreateDLLForm(App: TApplication; Scr: TScreen):TForm;
begin
Application := App;
Screen := Scr;
Application.CreateForm(TfrmDLLForm, frmDLLForm);
Application.CreateForm(TForm1, Form1);
result:=Form1;
end;procedure ExitDLL(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DLLApp;
Screen := DLLScr;
end;
end;
exports
CreateDLLForm;begin
DLLApp := Application;
DLLScr := Screen;
DLLProc := @ExitDLL;end.
unit MainUnit;interfaceuses
......type
InvokeDLLForm = function(App: TApplication; Scr: TScreen): TForm;
TForm1 = class(TForm)
......var
Form1: TForm1;
DLLForm:TForm;//下面这个可以在“窗口”菜单中显示,TChildForm在主程序中。
procedure TForm1.NewItemClick(Sender: TObject);
var
Child: TChildForm;
begin
Inc(Count);
Child := TChildForm.Create(Self);
Child.Caption := Child.Caption + ' ' + IntToStr(Count);
end;//下面这个不能在“窗口”菜单中显示,子窗体在DLL中。
procedure TForm1.OrderForm1Click(Sender: TObject);
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
begin
DLLHandle := LoadLibrary('E:\DOrderForm.dll');
if DLLHandle <> 0 then
begin
@DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
if Assigned(DLLSub) then
begin
DLLForm := DLLSub(Application, Screen);
end;
end;
end;
==========================================================
//DLL子窗体
library DOrderForm;
.....var
DLLApp: TApplication;
DLLScr: TScreen;function CreateDLLForm(App: TApplication; Scr: TScreen):TForm;
begin
Application := App;
Screen := Scr;
Application.CreateForm(TfrmDLLForm, frmDLLForm);
Application.CreateForm(TForm1, Form1);
result:=Form1;
end;procedure ExitDLL(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DLLApp;
Screen := DLLScr;
end;
end;
exports
CreateDLLForm;begin
DLLApp := Application;
DLLScr := Screen;
DLLProc := @ExitDLL;end.
解决方案 »
- 我安装了delphi 2009。但是我现在编译不了程序!编译按钮(RUN & F9都变成了灰色!,其他的也变成灰色)求救!!!
- 将FileListBox的内容向ListView里写,希望还能排序
- 请教脱网时如何访问到本机127.0.0.1
- ●●●●为了自己方便,也为大家方便,建立了一个DELPHI程序员QQ群:8194759●●●●
- 请问在DELPHI中如何执行存储过程??详细点,Thanks
- 请帮忙,不知如何是好。
- 时间分析工具全解之二 测量周期预测
- Delphi 调用.net WebService方法360提示上传隐私??
- 各位大虾!!请教有关树型目录的问题???
- 请问如何在文本框禁止中文IME呢?
- adoquery新增字段的问题,100分求解。
- 新手求救!
//主程序
type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
Start: TMenuItem;
procedure StartClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;var
MainForm: TMainForm;implementation{$R *.DFM}procedure TMainForm.StartClick(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild;
begin
DllHandle := LoadLibrary('ProjectDll');
ProcAddr := GetProcAddress(DllHandle, 'ProvaChild');
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(Application,Self);
end;
end;
//子窗体的DLL
procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
var
Form1: TForm1;
DllProc: Pointer; { Called whenever DLL entry point is called }begin
Application:=ParentApplication; Form1:=TForm1.Create(ParentForm);
Form1.MyParentForm:=ParentForm;
Form1.MyParentApplication:=ParentApplication;
// windows.SetParent(Form1.Handle,ParentForm.Handle);
// Form1.FormStyle:=fsMDIChild;
Form1.Show;
end;procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;exports
ProvaChild;begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.