问题是这样的: 1. 如何把MDI子窗体封装在DLL动态链接库文件中? 2. 如何启动这个封装在DLL动态链接库文件中的子窗体? 3. 启动起来的MDI子窗体对Tab按键能够响应。具体情况是这样的:
在DLL中的子窗体上面有两个文本框(Edit),如果不封装在DLL, 而是直接集成在EXE中,能够根据Tab顺序响应Tab按键, 但是如果封装在DLL中,就不能够响应Tab按键。 现在最重要的就是解决DLL中封装的窗体响应Tab按键的问题。希望是这样解决问题的: 1. 不增加额外的代码。主要是指对每个控件设置一个跳转代码。 2. 利用新的技术或者设置一些什么。这段期间由于找工作原因,很可能玩两天结贴,但是相信我一定会结贴,您可以看我的结贴率。至于分数,考虑到这个问题的难度,特奉上100分供大家讨论。抱歉,在这里先感谢大家了!
在DLL中的子窗体上面有两个文本框(Edit),如果不封装在DLL, 而是直接集成在EXE中,能够根据Tab顺序响应Tab按键, 但是如果封装在DLL中,就不能够响应Tab按键。 现在最重要的就是解决DLL中封装的窗体响应Tab按键的问题。希望是这样解决问题的: 1. 不增加额外的代码。主要是指对每个控件设置一个跳转代码。 2. 利用新的技术或者设置一些什么。这段期间由于找工作原因,很可能玩两天结贴,但是相信我一定会结贴,您可以看我的结贴率。至于分数,考虑到这个问题的难度,特奉上100分供大家讨论。抱歉,在这里先感谢大家了!
解决方案 »
- 请教关于FieldDefs
- 庆祝上班一周安全度过!
- 偶没有分了,编辑框,身份证号码,偶希望存入数据表前进行合法性检查,最佳的事件?
- 有没有delphi下用原始socket编的嗅探器的源代码?
- 现在我想输入小数!下面的程序怎么改????
- StrinGrid的Cell能否象DBGrid.Column那样可以通过设置PickList实现下拉选择?
- d7 滚动字幕字幕带连接 在线急 Delphi高手帮忙 给分
- 求助帮忙看看程序哪里出错了,spcomm控件接受不到数据
- 向各位大虾请教
- delphi 6 第2碟一大堆控件,乱得很,看了半天,还不明白是些什么东西,有谁先我一步,给我介绍一下到底是什么东西(我E文可不太好)
- delphi 函数调用问题, 新手, 急 在线等.各位大虾帮帮我
- 水晶报表能否像QReport一样直接嵌入delphi里面呢?
2009
WinExec(PWideChar('Notepad'),SW_SHOW);
工程文件中
var
DLLAPP:TApplication;
procedure ExitDLL(Reason: Integer);
begin
if Reason=DLL_PROCESS_DETACH then
begin
Application:=DllApp;
end;
end;begin
DllApp:=Application;
DLLProc:=@ExitDLL;
end.procedure ShowMDIForm(App:TApplication;ParentForm:TForm);stdcall;
begin
Application := App;
if not Assigned(frmMDIForm) then
frmMDIForm:=TfrmMDIForm.Create(ParentForm);
frmMDIForm.Show;
end;
//子窗体关闭的时候
Action:=caFree;
frmMDIForm:=nil;
2、
TShowForm=procedure (App:TApplication;ParentForm:TForm);stdcall;
FShowForm:TShowForm;
begin
@FShowForm:=GetProcAddress(FDLLHandle,'ShowMDIForm');//FDLLHandle为DLL句柄
FShowForm(Application,Application.MainForm);
end;
3、
procedure WMHotKey(var Msg:TWMHotKey); message WM_HOTKEY;
var
H:THandle;
begin
if Msg.HotKey=id_SnapShot then
begin
H:=GetSysFocus;
while IsWindow(H) and (H<>frmMain.Handle) do
begin
SendMessage(H,WM_NEXTDLGCTL,0,0);
H:=GetParent(H);
end;
end;
end;procedure WMACTIVATEAPP(var Msg:TMessage);message WM_ACTIVATEAPP;
begin
if Boolean(Msg.WParam) then
RegisterHotKey(frmMain.Handle,id_SnapShot,0,VK_TAB)//定义热键 在程序得到焦点时
else
UnRegisterHotKey(frmMain.Handle,id_SnapShot);//释放已经登记的热键 在程序失去焦点时
end;
//此外在DLL中加一个CloseForm方法,用于应用程序退出时关闭子窗口
procedure CloseForm;stdcall;
begin
if Assigned(MDIForm) then
MDIForm.Close;
end
今天看到这么多人关注这个问题,我非常高兴,但是现在宿舍里面还没有开网, 所以说只能先把这些问题带回去,自己试验之后才能知道结果。这些问题先这样吧。 至于分数的问题,我按照顺序分给大家: hsmserver:这位超级大大,很辛苦,贴了这么多代码,我没时间看了,回去仔细研究————50分 yct0605:感谢你帮我找了点资料,我大概看了下,希望能够符合我的要求————30分 starluck:也是个超级大大,你头像挺酷的,之前我曾经试过用PAnsiChar('Notepad')转化不成功, 所以也不敢确定,先给你20分吧。 我先结贴了,但是问题可能还没有解决,我先把解决方案拿回去,如果有什么不懂的问题再向大家提问,可以吗? 其实我感觉,分数是次要的,主要是学会东西,在这里先感谢大家了。 补充一点,8楼的见解很精辟,这个方面我也想过,不过说起来,真要是带包编译,那DLL就没有任何意义了,呵呵。
晕死啊,打了半天的字提交没成功 这次不多说了,非常感谢两位超级大大对我问题的关注,现在是网吧,我只能把问题带回去,贴先结了。 总不能因为我个人的原因,让这么多热心人等着。 这样吧:
hsmserver:这位超级大大很辛苦,贴了这么多代码,而且专门针对我的问题,这里给60分了, 相信这点分不多。 yct0605:非常感谢你帮我找了适合的资料,给你30分吧,别见怪,你比人家hsmserver
人家少很多事呢
还没打完呢 starluck:这位头像很帅的超级大大,之前我曾经用WinExec(PAnsiChar('Notepad'),SW_SHOW) 这个命令试过,不起作用,所以我只能带回去。这里先给你10分好吗? 3150379:你见解很精辟,但是带包编译了,还要DLL干吗
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
begin
s := 'Notepad';
WinExec(PWideChar(s),SW_SHOW);
end;
这段代码编译无法通过,参数格式不对; 换成WinExec(PAnsiChar(s),SW_SHOW)可以编译过去,但是执行之后,不会出现任何结果。 在研究了7楼提供的那个链接之后,终于弄明白是怎么回事了。 Delphi 2009中默认的String类型是WideChar类型的,而非以前默认的AnsiString类型的, 这样强制转化为PAnsiChar自然就会出现问题,所以在Delphi 2009中需要多一步的转化,看下面这段代码:
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
begin
s := 'Notepad';
WinExec(PAnsiChar(AnsiString(s)),SW_SHOW);
end;
这就是结果,在这里贴出来,给需要的人!