Delphi中到底能不能把VCL窗体封装到DLL中?(100)

L

Lenic

Unregistered / Unconfirmed
GUEST, unregistred user!
如题:实现了VCL窗体封装到DLL中,但是总是出现莫名其妙的问题。现在就差最后一个问题了,不知道这里有没有人能够解决?问题是这样的:把VCL窗体封装到DLL之后(传进了Application和Screen两个参数和一个Owner参数)只要有操作字符串的代码一触发就会出现“Can't Assign a TFont to a TFont”这两天也查了不少资料,基本上得到的答复就是:复值不能够直接赋值
 
Z

znxia

Unregistered / Unconfirmed
GUEST, unregistred user!
肯定可以,我们以前就是这么处理的。操作字符串提示这种错误没遇到过,把你最简单的DLL代码贴出来。
 

地质灾害

Unregistered / Unconfirmed
GUEST, unregistred user!
操作字符串就遇到“Can't Assign a TFont to a TFont”,人品有问题。
 

地质灾害

Unregistered / Unconfirmed
GUEST, unregistred user!
如果主程序也用同一版本的Delphi编写,建议使用bpl而不是dll
 
D

djrj

Unregistered / Unconfirmed
GUEST, unregistred user!
可以的,以前就用过没出什么问题,再检查一下代码中的Application是否有备份恢复等
 

草原骏马

Unregistered / Unconfirmed
GUEST, unregistred user!
没有问题的。你在看看你的代码吧。
 
L

Lenic

Unregistered / Unconfirmed
GUEST, unregistred user!
DLL的工程代码是这样的:
代码:
library Project1;uses  ShareMem,  Forms,  Windows,  SysUtils,  Classes,  Unit1 in 'Unit1.pas' {Form1};{$R *.res}var  DllApp: TApplication;//定义保存原DLL的TApplication对象  DllScr: TScreen;//定义保存原DLL的TScreen对象function ShowForm(App: TApplication;
Scr: TScreen;
Owner: TForm):TForm;
export;
stdcall;
begin
  Application := App;
 Screen := Scr;
 if not Assigned(Form1) then
  begin
    Form1 := TForm1.Create(Owner);
   Form1.Show;
 end  else
    Form1.Show;
 Result := nil;
end;
procedure UnProcDll(Reason: Integer);
register;//定义DLL处理过程begin
  if (Reason = DLL_PROCESS_DETACH) OR     (Reason = DLL_THREAD_DETACH) then
  begin
    Application := DllApp;
   Screen := DllScr;
 end;
end;
exports  ShowForm;
begin
  DllApp := Application;//备份原DLL的TApplication对象  DllScr := Screen;//备份原DLL的TScreen对象  DllProc := @UnProcDll;//将重写后的入口函数地址付给DLLProcend.
启动DLL中的子窗体之后,执行这条语句就会出问题:
代码:
ShowMessage(Edit2.Text);
Edit2中的内容是“Edit2”窗体设置如下:KeyPreview := True;Visible := True;FormStyle := fsMDIChild;OldCreataOrder := False;其他没写出来的属性就是没动。
 
L

luweilove

Unregistered / Unconfirmed
GUEST, unregistred user!
用这个试试var DLLApp: TApplication;//定义保存原DLL的TApplication对象 DLLScr: TScreen;//定义保存原DLL的TScreen对象{$R *.res}function ShowForm(App: TApplication;
Scr: TScreen): TForm;
begin
Application := App;
Screen := Scr;
Application.CreateForm(TForm1, Form1);
result := Form1;
showmessage(Form1.Edit2.Text);
Form1.KeyPreview := True;
Form1.Visible := True;
Form1.FormStyle := fsMDIChild;
Form1.OldCreataOrder := False;
end;
procedure ExitDLL(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DLLApp;
Screen := DLLScr;
end;
end;
exports ShowForm;
begin
DLLApp := Application;
DLLScr := Screen;
DLLProc := @ExitDLL;
end.
 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!
把ParentFont改为False旧可以了!
 
L

Lenic

Unregistered / Unconfirmed
GUEST, unregistred user!
你们说的方法我都试过了都不行试着重新建一个工程就可以但是只要出过这问题一次之后就别想再改过来了我也不知道是怎么一回事现在给我的感觉就是Delphi貌似不能将VCL窗体封装到DLL中否则就会出现各种各样莫名其妙的问题哪怕是现在成功了说不定将来哪一天就会出现问题出现了问题还解决不了这样的问题在发布的程序上是绝对不允许的所以我决定放弃这个想法Delphi毕竟不是VCBorland也不是Microsoft不想了我用VC重新做一遍好了郁闷的是今天就得找导师到时候怎么说啊。。。。。。。。
 
L

Lenic

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 

Similar threads

回复
0
查看
808
不得闲
回复
0
查看
647
不得闲
顶部