如何让子窗体的名称显示在主窗体的窗口列表中
解决方案 »
- 如何设置DBGridEh按排班的格式显示?
- 请教一个问题,熟悉Delphi和VC++的一个小问题....结贴率100%...........................................
- 线程数组与单线程的疑问。
- toolbar 和MainMenu1关联的问题
- 我用程序在注册表中修改了“我的电脑”图标,为什么要重新起运后才看得到被修改后的图标了?能不能用程序实现修改后马上生效呢?
- 修改手机接收到短信的时间
- 救命啊,存储过程里面的错误,要怎么修改,在线等
- 关于当前打印任务
- 急难办的问题,一点思路也没有,求助?
- 如何在Win2000下截取具有密码属性的TEdit控件中的内容?
- 高手帮忙看看代码什么地方能够出错了?
- 中文系统下保存日文编码文本文件的问题。
form1.FormStyle :=fsMDIForm;
with TForm.Create(Application.MainForm) do
begin
FormStyle := fsMDIChild;
Show;
Caption := 'Budded '
end;
end;
var
form2: Tform;
begin
form1.FormStyle :=fsMDIForm;
form2:= TForm.Create(Application.MainForm );
form2.FormStyle := fsMDIChild;
form2.Show ;
form2.Caption :='1';
form2.WindowState :=wsMaximized;
End;
var
form2: Tform;
begin
form2:=Tform.Create(self);
form2.FormStyle :=fsMDIchild;
form1.FormStyle :=FsMDIform;
form2.Show ;
Form2.Caption :='1';
form2.WindowState :=Wsmaximized;
end;
unit AbstractForm;interface
uses Forms;type
TAbstractForm = class(TForm)
end; TAbstractFormClass = class of TAbstractForm;
implementationend.//创建一个窗体,继承至上面创建的祖先窗口
unit ChildForm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, AbstractForm;type
TForm1 = class(TAbstractForm)
cxButton1: TcxButton;
cxMemo1: TcxMemo;
private
{ Private declarations }
public
{ Public declarations }
end;
....//省略
end;//创建一个用于装载DLL窗口的公共方法,这个文件可以被包含到多个DLL项目中。
unit DLLManager;interface
uses Forms, Windows, AbstractForm;/// <summary>
/// DLL入口函数。设置DLL中窗口的Application为主程序的Application对象,
/// 置DLL中窗口的窗体对象为主程序窗体对象;
/// </summary>
procedure InitDll(dWseason: DWORD);
/// <summary>
/// 装载DLL中的MDI窗体
/// </summary>
/// <params name='FormClass'>要创建的窗体对象的类型</params>
/// <params name='App'>主程序的Application对象</params>
/// <params name='Scr'>主程序窗体对象</params>
/// <returns>返回指定类型的窗体对象</returns>
function LoadForm(FormClass: TAbstractFormClass; App: TApplication; Scr: TScreen): TAbstractForm; StdCall;implementationvar
GApplication: TApplication ;
GScreen: TScreen;function LoadForm(FormClass: TAbstractFormClass; App: TApplication; Scr: TScreen): TAbstractForm; StdCall;
var
LPtr: PLongint;
form :TAbstractForm;
begin
Application := App;
Screen := Scr;
LPtr := @Application.MainForm;
LPtr^ := Longint(App.MainForm);
Form := FormClass.Create(App.MainForm);
Result := Form;
end;procedure InitDll(dWseason: DWORD);
begin
case dWseason of
DLL_PROCESS_ATTACH:
begin
GApplication := Application;
GScreen := Screen;
end;
DLL_PROCESS_DETACH:
begin
Application := GApplication;
Screen := GScreen;
end;
end;
end;end.//DLL项目单元文件
uses
Windows,
ChildForm in 'ChildForm.pas' {Form1},
DLLManager in 'DLLManager.pas',
AbstractForm in 'AbstractForm.pas';{$R *.res}
function TChildForm: TAbstractFormClass; stdcall;
begin
Result := TForm1;
end;
exports
LoadForm,
TChildForm;begin
DllProc := @InitDll;
InitDll(DLL_PROCESS_ATTACH);
end.
//调用程序
type
TLoadForm = function (formclass: TAbstractFormClass; App: TApplication; Scr: TScreen): TAbstractForm; StdCall;
TMainForm = class(TForm)
//省略
end;implementation
{$R *.dfm}
function TChildForm: TAbstractFormClass; external 'TestDllForm.dll';procedure TMainForm.CreateMDIChild(const Name: string);
var
Child: TAbstractForm;
LoadFrm: TLoadForm;
DllHandle: Cardinal;begin
DllHandle := LoadLibrary(Pchar('TestDllForm.dll'));
if DllHandle <= 0 then Exit;
LoadFrm := GetProcAddress(DllHandle, PChar('LoadForm'));
if @LoadFrm = nil then Exit;
Child := LoadFrm(TChildForm, Application, Screen);
end;该方法可以使得多个DLL中的MDI窗口的创建尽量减少代码量,和易于维护。