我在dll里想使用spcomm控件,所以加了个窗体,现写了个函数,可是该控件却不能执行,是什么原因呀? ( 积分: 100 )

  • 主题发起人 主题发起人 doby_li
  • 开始时间 开始时间
D

doby_li

Unregistered / Unconfirmed
GUEST, unregistred user!
dll的窗体上写的函数如下:
function opencomm(scomm:string):LongBool;
begin
try
comm1.CommName:=scomm;
Comm1.StartComm;
messagedlg('打开'+scomm+'串口成功!',mtinformation,[mbyes],0);
Result:=true;
except
messagedlg('打开'+scomm+'串口时失败,可能该串口已被占用或不存在,请换另一个串口!',mterror,[mbyes],0);
Result:=false;
end;
end;

我用另一个程序来调用该dll的窗体上的上述函数时,却发现:
comm1.CommName:=scomm;
Comm1.StartComm;
这两条指令不能执行,请问是怎么原因呀?
调用的过程为:
procedure TFCOMM.btnopenClick(Sender: TObject);
begin
opencomm('COM1');
end;

请各位大虾指点,谢谢。
 
Dll中的窗体如果没有自动创建,则需要你编程手工创建,
然后窗体内的Comm1控件才有机会被自动创建。
 
我在dll中已经手工加了窗体及在窗体上放了spcomm控件了呀。
 
这个动态库窗体是需要去创建的,否则怎么能调用这个窗体类的函数呢?
 
我就是先新建一个dll,然后在这个dll里手工添加了个窗体的。如下:
library Project1;
uses
SysUtils,
Classes,
COMM in 'COMM.pas' {FCOMM};

{$R *.res}
exports
showmyForm,opencomm;
begin
end.
我的函数opencomm就是放在comm.pas里的。
spcomm控件就是放在comm.dfm上面的。
 
如果你不打算打开窗体,那为什么要把控件放在窗体上呢?
自己创建控件的实例吧:
function opencomm(scomm:string):LongBool;
var
comm1:TComm;
begin
comm1:=TComm.Create(nil);
try
try
comm1.CommName:=scomm;
Comm1.StartComm;
messagedlg('打开'+scomm+'串口成功!',mtinformation,[mbyes],0);
Result:=true;
except
messagedlg('打开'+scomm+'串口时失败,可能该串口已被占用或不存在,请换另一个串口!',mterror,[mbyes],0);
Result:=false;
end;
finally
comm1.Free;
end;
end;
 
或者(前提:ShowMyForm过程中创建了窗体,并且没有关闭)
procedure TFCOMM.btnopenClick(Sender: TObject);
begin
showmyform;
opencomm('COM1');
closemyform;//必须再增加一个关闭和释放窗体的导出过程;
end;
 
stargazer,你好,我现在按你说的创建控件的实例,现在可以打开串口了,
但程序执行到:messagedlg('打开'+scomm+'串口成功!',mtinformation,[mbyes],0);
然后按了"yes"按纽后,它就会自动关闭了调用程序,是什么原因呀?
代码如下:
library Project1;
uses
SysUtils,
Classes,
spcomm,
dialogs;

{$R *.res}
function opencomm(scomm:string):LongBool;
var
comm1:TComm;
begin
comm1:=TComm.Create(nil);
try
try
comm1.CommName:=scomm;
Comm1.StartComm;
messagedlg('打开'+scomm+'串口成功!',mtinformation,[mbyes],0);
//showmessage('打开串口成功');
Result:=true;
except
messagedlg('打开'+scomm+'串口时失败,可能该串口已被占用或不存在,请换另一个串口!',mterror,[mbyes],0);
Result:=false;
end;
finally
comm1.Free;
end;
end;

exports
opencomm;
begin
end.

调用程序的按纽的代码为:
procedure TFCOMM.btnopenClick(Sender: TObject);
begin
opencomm(slt_com.Text);
end;

谢谢。
 
关闭的问题已经搞定了。要在函数的后面加上stdcall就可以了。
function opencomm(scomm:string):LongBool;stdcall;
var
comm1:TComm;
begin
comm1:=TComm.Create(nil);
try
try
comm1.CommName:=scomm;
Comm1.StartComm;
messagedlg('打开'+scomm+'串口成功!',mtinformation,[mbyes],0);
Result:=true;
except
messagedlg('打开'+scomm+'串口时失败,可能该串口已被占用或不存在,请换另一个串口!',mterror,[mbyes],0);
Result:=false;
end;
finally
comm1.Free;
end;
end;
 
接受答案了.
 
后退
顶部