最近刚刚学用D7,做了个上位机软件。一开始所有的代码都在同一个单元文件中,软件运行正常。
但是我感觉太乱了,数据处理和控件的事件触发都掺杂在一起,不利于维护,也没有可能重用神马的,
所以想新建个pas文件,然后单独把数据处理提出来,建个类,然后让控件触发时候引用类的方法来处理、显示数据。
但是麻烦了,好多错误,我google、baidu了一下,貌似都是基础语法相关的,但是目前我没找到一本比较好得的Delphi入门书,
翻了好几本都是一带而过,基本没用。只好自己一边写,一边GOOGLE,摸索着来。跑题了,我把问题精简了一下,基本就是:
软件就一个窗体,现在假设有一个按钮BUTTON1和一个文本框EDIT1,一个两个单元文件UNIT1和UNIT2,现在想实现在UNIT2里给文本框的TEXT属性赋值,点击BUTTON1,然后调用UNIT2里的类方法,实现这个功能。但是一直报错,如下:
UNIT2代码:
Type
    TNum = Class(TObject)
    public
        edText: TEdit;        Constructor Create;
        Procedure showNum();
    end;implementationuses unit1;Constructor TNum.Create;
begin
    Inherited Create;
    edText:= form1.Edit1;
    edText.Text:= 'asdfsdfsad';
 
end;Procedure TNum.showNum();
//    edText.Text:= 'asdfsdfsad';
begin
然后UNIT1里BUTTON1调用
Uses
    Unit2;
var
  obNum: TNum;
procedure TForm1.Button1Click(Sender: TObject);
begin
    obNum:= TNum.Create;
//    obNum.showNum();
    obNum.Free;
end;
可以改变EDIT1.TEXT的内容,但是我想实现在showNum()里改变edit1的text内容,可是不行,把UNIT2构造函数里的edText.Text:= 'asdfsdfsad';注释掉,然后在showNum()里写一样的代码,就报UNIT2.PAS: Unknown derictive 'edText'错误;
第二种方法是让构造函数里的edText:= TEdit(TComponent.FindComponent('edit1'));就报
UNIT2.pas:This form of method call only allowed for class methods 和
Unit2.pas(34): Unknown directive: 'edText'错误
好像FindComponent不是类方法,不能在这调用
弄了半天都搞不定,求高手相助啊!!!
Ps.最好是第二种方法,因为界面上有好多相同的控件,只是序号递增而已,我想用这种方法模拟实现VB的控件数组,
不然一个个的赋值就要死人了……
ps.不知道《DLEPHI6开发人员指南》适不适合我这种D7新手看?今天刚开始看,目前翻了几本书,都不咋样,
只了解了基本的语法,然后靠着C和JAVA的基础,一点点摸索着做。
还有据说《delphi7从入门到精通》也不错,但是好像罗征翻译的很烂?不知道看哪个比较好?
谢谢!!!

解决方案 »

  1.   

    对了,还有个问题
    构造函数在对象构造的时候不会自动调用吗?必须要TNum.Create;才会调用构造函数,初始化对象吗?不能像C++一样,在创建类对象时候自动根据构造函数初始化对象属性吗?
    还有TNum.Create完了是不是必须要TNum.Free释放?我那个上位机软件里相同的控件很多,所以obNum对象的初始化不能在控件事件里实现(也就是obNum:=TNum.create不能在控件事件里实现吧?),那create对象是该是在窗体的create里实现,free对象应该是点关闭按钮时候实现吧?
    谢谢!
      

  2.   

    1. 用Components可以遍历某个对象上放的所有控件,示例如下for i := 0 to form1.ComponentCount - 1 do
    begin
      if form1.Components[i] is TEdit then
      begin
        TEdit(form1.Components[i]).Text := "测试";
      end;
    end;这样应该可以实现你上面第二点啦
    2. Delphi中的类更像C++中的类指针,例如,CObject* obj,所以,是无法自动调用构造和析构函数的,因此,Create和Free都需要手动调用。
      

  3.   

    谢谢xinhun61
    可是如果用遍历控件的话,那我程序里几十上百个控件,没点一次按钮都遍历一次,那效率岂不是很低?
    能不能像我前面说的构造函数里用edText:=TEdit(FindComponent('edit')+InToStr(i));这样实现?ps.终于知道为啥TNum.showNum();总是edText报Unknown directive 'edText'错误了,原来我一不小心,把edText写到begin上面去了……
    但是改正后让TNum=class(TComponent),构造函数里让edText:=TEdit(FindComponent('edit1'));程序能执行了,
    但是shoNum()里edText.text:='xxxxxxx';确没有反应,这是咋回事啊?
    谢谢各位了!
      

  4.   

    解决了,原来改成edText:=TEdit(form1.FindComponent('edit1'));就OK了