我的代码中好多处用到编辑框清空,我想通过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);但怎么就传不进去。请高手指教一下。

解决方案 »

  1.   

    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;
      

  2.   

    再优化一下:
    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;
      

  3.   

    procedure Empty(A: TEdit);  stdcall;
    begin
      A.Text := '';
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      empty(Edit1);
      empty(Edit2);
    end;
      

  4.   

    我试过你们的办法了,错误提示说TEdit没定义,然后我在use后加TEdit,又说TEdit.cu不存在。
      

  5.   

    TEdit类是在StdCtrls单元中定义的,你需要uses StdCtrls;
      

  6.   

    我还有个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;请问这有什么问题吗?
      

  7.   

    if A<>nil then A.Text := '';
    if ....
    empty(Edit1, Edit2,Edit3 , nil, memo1);或者在函数定义时,参数直接定义为指针类型.
      

  8.   

    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]);
      

  9.   

    楼上的办法也是办法中的一种. 但最好是模仿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;
      

  10.   

    你这写法不简洁啊,以后要是要加多一个MEMO或者EDIT的时候,你不是又得更改函数的参数,
    还有调用的方式,我不赞成什么API的调用方法,DELPHI是面向对象的,应该多利用他面向对象的特性.照我的方法,以后要初始化N个TCustomEdit的子类都可以不用更改函数的参数声明,只要
    empty([edit1,edit2......edit n,memo1,memo2.....memo n]);就可以了!
      

  11.   

    TO chenzhuo(灼):你说的也有一定道理。我的意思是:模仿Win32API写函数,因为,我们的程序是运行在Windows平台上的,模仿Win32API应该是一个不错的方向。另外,关于把巨多的控件Text属性清空,本来就不建议象楼主这样写函数的...这只是一个例子。谢谢您的讨论,欢迎提出不同意见。
      

  12.   

    我来回答一下楼主的答案吧,其实你的写法没错,不过只能是在delphi中,其实在编写dll文件时是不能有string作为参数的,你只要把string改为pchar就可以了,因为dll中字符串和delphi中的字符串是的存储结构是不一样的.你试试吧.兄弟.
      

  13.   

    用DLL时,要符合win32 API习惯,使用pchar类型参数代替string.