关于dll文件中过程参数传递问题

landixin 2007-03-22 08:49:23
我的代码中好多处用到编辑框清空,我想通过dll文件中过程参数传递解决。dll文件中过程代码如下
procedure empty(s1,s2,s3,s4:string);stdcall
begin
s1:='';
s2:='';
s3:='';
s4:='';

end;
外面是这样的
empty (edit1.text,edit2.text,edit3.text,edit4.text);但怎么就传不进去。请高手指教一下。
...全文
1054 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuancaoer 2007-03-26
  • 打赏
  • 举报
回复
mark
shrek_cn 2007-03-26
  • 打赏
  • 举报
回复
用DLL时,要符合win32 API习惯,使用pchar类型参数代替string.
atspace 2007-03-25
  • 打赏
  • 举报
回复
她都说是小妹了,你还兄弟。。。


我同意楼上的说法。。


顺便接个分。。呵呵。
sunshine09010208 2007-03-25
  • 打赏
  • 举报
回复
这个明显的是错误吗
这个要想修改的话
必须得用指针
china_aspx 2007-03-23
  • 打赏
  • 举报
回复
MARK
www0571mmcn 2007-03-23
  • 打赏
  • 举报
回复


一拖32终端机,为老板节省资金投放成本,网络管理员的福音,你只要管理好一台服务器电脑就可以了,省钱、省心、安全、环保,免升级、简化IT管理、节省80%IT费用!!!
1台电脑主机2-30个用户同时独立办公,节省80%IT费用,节省98%电力资源, 1台电脑主机让30个用户同时独立网上冲浪、网络游戏、即时通信、电子邮件等应用。
详细请进网站了解: WWW.BLTHZ.COM
联系电话: 13588440735
联系QQ: 306099535

shen_shen1981 2007-03-23
  • 打赏
  • 举报
回复
我来回答一下楼主的答案吧,其实你的写法没错,不过只能是在delphi中,其实在编写dll文件时是不能有string作为参数的,你只要把string改为pchar就可以了,因为dll中字符串和delphi中的字符串是的存储结构是不一样的.你试试吧.兄弟.
lihuasoft 2007-03-23
  • 打赏
  • 举报
回复
TO chenzhuo(灼):

你说的也有一定道理。我的意思是:模仿Win32API写函数,因为,我们的程序是运行在Windows平台上的,模仿Win32API应该是一个不错的方向。

另外,关于把巨多的控件Text属性清空,本来就不建议象楼主这样写函数的...这只是一个例子。

谢谢您的讨论,欢迎提出不同意见。
landixin 2007-03-22
  • 打赏
  • 举报
回复
我还有个memo也要传进去的,其中有几个Edit是不传的。结果如下形式的代码出错
procedure Empty(A, B, C, D: TEdit;E:TMemo); stdcall;
begin
A.Text := '';
B.Text := '';
C.Text := '';
D.Text := '';
E.Text:='';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
empty(Edit1, Edit2,Edit3 , ,memo1);
end;

请问这有什么问题吗?
jadeluo 2007-03-22
  • 打赏
  • 举报
回复
TEdit类是在StdCtrls单元中定义的,你需要uses StdCtrls;
landixin 2007-03-22
  • 打赏
  • 举报
回复
我试过你们的办法了,错误提示说TEdit没定义,然后我在use后加TEdit,又说TEdit.cu不存在。
starsky2006 2007-03-22
  • 打赏
  • 举报
回复
procedure Empty(A: TEdit); stdcall;
begin
A.Text := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
empty(Edit1);
empty(Edit2);
end;
jadeluo 2007-03-22
  • 打赏
  • 举报
回复
再优化一下:
procedure Empty(A: array of TEdit); stdcall;
var
i : Integer;
begin
for i := Low(A) to High(A) do
A[i].Text := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
empty([Edit1, Edit2, Edit3, Edit4]); //TEdit组件实例数量可不固定为4个了
end;
jadeluo 2007-03-22
  • 打赏
  • 举报
回复
procedure Empty(A, B, C, D: TEdit); stdcall;
begin
A.Text := '';
B.Text := '';
C.Text := '';
D.Text := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
empty(Edit1, Edit2, Edit3, Edit4);
end;
landixin 2007-03-22
  • 打赏
  • 举报
回复
小妹谢谢大哥们帮忙,成功啦。这就给你们加分。
chenzhuo 2007-03-22
  • 打赏
  • 举报
回复
你这写法不简洁啊,以后要是要加多一个MEMO或者EDIT的时候,你不是又得更改函数的参数,
还有调用的方式,我不赞成什么API的调用方法,DELPHI是面向对象的,应该多利用他面向对象的特性.照我的方法,以后要初始化N个TCustomEdit的子类都可以不用更改函数的参数声明,只要
empty([edit1,edit2......edit n,memo1,memo2.....memo n]);就可以了!
lihuasoft 2007-03-22
  • 打赏
  • 举报
回复
楼上的办法也是办法中的一种. 但最好是模仿API函数的写法, 用空指针.

procedure Empty(A, B, C, D: TEdit;E:TMemo); stdcall;
begin
if A<>nil then A.Text := '';
if B<>nil then B.Text := '';
if C<>nil then C.Text := '';
if D<>nil then D.Text := '';
if E<>nil then E.Text := '';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
empty(Edit1, Edit2,Edit3 ,NIL ,memo1);
end;
chenzhuo 2007-03-22
  • 打赏
  • 举报
回复
empty(Edit1, Edit2,Edit3 , ,memo1);
调用有问题
procedure Empty(A: array of TCustomEdit); stdcall;
var
i : Integer;
begin
for i := Low(A) to High(A) do
A[i].Text := '';
end;

调用:
empty([Edit1, Edit2,Edit3,memo1]);
lihuasoft 2007-03-22
  • 打赏
  • 举报
回复
显式地定义为指针类型.
lihuasoft 2007-03-22
  • 打赏
  • 举报
回复
if A<>nil then A.Text := '';
if ....


empty(Edit1, Edit2,Edit3 , nil, memo1);

或者在函数定义时,参数直接定义为指针类型.

16,742

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧