举个例子:
type
  TMyClass = class(Tobject)
public
   procedure dosomething;
end;
procedure TMyClass.dosomething;
begin
  ShowMessage('TMyClass.dosomething');
end;
//以上是类定义和实现
procedure TForm1.Button1Click(Sender: TObject);
var i : Integer;
    p:PMyClass;
    myList:TList;
begin
  myList := TList.Create;
  for i := 0 to 3 do
  begin
    New(p);
    P^.dosomething;
    myList.Add(p);
  end;
end;
//以上按你的要求循环创建,并调用方法。

解决方案 »

  1.   

    new只能由于指针。
    其实没必要用指针,对象本身就是指针,直接用对象就可以了  for I := 0 to List.Count - 1 do
      begin
        MyObj := TMyClass.Create;
        List.Add(MyObj);
      end;
      

  2.   

    先谢谢iroi和太阳风,但是两位大虾我还是没有明白为什么  pMyClass.doSomething(parameter);不能操作 ,iroi我写的代码和你的一样的,但是上面的那句还是不能正常执行,你自己能不能执行一下试试看,好像不行的,如果执行通过了,那就太感谢你们两了,谢谢
      

  3.   

    对象的创建要用Create构造函数
      

  4.   

    blazingfire(烈焰)兄的意思是什么:直接用create?我要创建很多个类的实例对象,就这样是嘛?
      for I := 0 to List.Count - 1 do
      begin
        MyObj := TMyClass.Create;
        List.Add(MyObj);
      end;
    但是我真正想弄明白的是为什么我创建了对象后不能对这个对象操作呢?
    下面例子才是问题所在:
        new(pMyClass);  {pMyClass是指向 myclass的指针}
        pMyClass.doSomething(parameter);{我在者里想通过这个指针来操作类的一个函数,发现程序在这里发出一个异常,好象是读写了非法地址,怎么办?但是奇怪的是如果我new的如果是个记录的话,(没有了函数操作)旧没有问题了,是不是new 不能new 类的对象啊,或是不能对这个类的函数操作?请指教}
        myList.add(pMyClass);
      
      

  5.   

    for I := 0 to List.Count - 1 do
    begin
        MyObj := TMyClass.Create;
        MyObj.Name := 'MyClass'+IntToStr(i);
        List.Add(MyObj);
        TMyClass(FindClass('MyClass'+IntToStr(i))).dosomething;
    end;
      

  6.   

    menliwxj(有缘) 兄:
      你能不能把这个例子在你的机器上运行一边,我这刚卸了delphi,不能验证,麻烦你了
      

  7.   

    没问题啊,我用下面的代码,完全没有错误:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMyClass = class
      public
        procedure AAA;
        procedure BBB;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      PObj: ^TMyClass;
    begin
      try
        New(PObj);
        PObj.AAA;
        PObj.BBB;
        PObj^.AAA;
        PObj^.BBB;
      finally
        Dispose(PObj);
      end;
    end;{ TMyClass }procedure TMyClass.AAA;
    begin
      ShowMessage('AAA');
    end;procedure TMyClass.BBB;
    begin
      ShowMessage('BBB');
    end;end.
      

  8.   

    从object继承过来的类,不能用findclass,我的代码基于TComponent才行的.不知你自己的类是不是用tobject开始写的?
      

  9.   

    windofsun(太阳风)的是可行的.不过在实际应用中,很少用new来生成对象,而是调用类的create来创建的.
      

  10.   

    调用类名的create方法来新建一个对象实例:
     oClassXX = TClassXX.Create
      

  11.   

    太阳风兄,有缘兄:
      太阳风兄的代码我试过了,没问题,但是,我在过程TMyClass.AAA;里面传递了几个参数进去,就有问题了;比如我使用了这样的代码:
    procedure TMyClass.AAA(i:integer);
    begin
       m_int1:=i;
    end;
      每次执行PObj^.AAA(4);就由异常产生了,怎么解决阿?
    还是请教:)
      

  12.   

    是你的赋值语句有问题.
    我的例子在delphi 5下运行正常.
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TMyClass = class
      private
        procedure DoSomething;
      public
        procedure AAA(i: integer);
        procedure BBB;
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TMyClass }procedure TMyClass.AAA(i: integer);
    begin
      showmessage(IntToStr(i));
    end;procedure TMyClass.BBB;
    begin
      showmessage('bbb');
    end;procedure TMyClass.DoSomething;
    begin
      showmessage('MyClass Is Doing Somethind!');
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
      obj: TMyClass;
    begin
      for i := 0 to 5 do
      begin
        with TMyClass.Create do
        begin
          try
            aaa(i);
            bbb;
          finally
            free;
          end;
        end;
      end;
    end;end.
      

  13.   

    我改成下面的也没有问题unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMyClass = class
      public
        procedure AAA(A: Integer);
        procedure BBB(B: Integer);
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      PObj: ^TMyClass;
    begin
      try
        New(PObj);
        PObj.AAA(111);
        PObj.BBB(222);
        PObj^.AAA(333);
       PObj^.BBB(444);
      finally
        Dispose(PObj);
      end;
    end;{ TMyClass }
    { TMyClass }procedure TMyClass.AAA(A: Integer);
    begin
      ShowMessage(IntToStr(A));
    end;procedure TMyClass.BBB(B: Integer);
    begin
      ShowMessage(IntToStr(B));
    end;end.
      

  14.   

    哦,谢谢有缘兄的指教,我在试试看,还是请您和太阳风兄关注,麻烦你们留个email给我,我们再联系,,晚上我还在这,我会继续法帖子问的,谢谢,
      

  15.   

    [email protected]
    不过我晚上不在
      

  16.   

    我的代码:
    unit w1;{我的类的定义}interface
    uses
      Dialogs;type
      TMyclass = class(Tobject)
      private
        { Private declarations }     m_a:integer;
         m_b:string;
      public
        { Public declarations }
       
        
       procedure GetA(i:integer);
       function GetB(s:String):String;
      end;implementation
    procedure TMyclass.GetA(i:integer);
    begin
    showmessage(inttostr(i));//光执行这句话没有问题
       m_a:=i;//但是一执行到这句话就有问题了
    end;
    function TMyclass.GetB(s:String):String;
    begin
       showmessage(s);//这句话也没有问题
       m_b:=s;//但是一执行到这句话就有问题了
       result:=s;
       
    end;end.
    /////////////////////////////////////////////////////////////////
    unit w2;{主窗体}interfaceuses
      Windows, Messages, SysUtils, Classes,contnrs, Graphics, Controls, Forms, Dialogs,w1,
      ExtCtrls, StdCtrls;
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
       
      private
        { Private declarations }
        m_list:TList;
          public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
     pMyClass: ^TMyclass;
    begin
      m_list:=TList.Create;
     for i:=0 to 3 do
      begin
       new(pp);
       pp^.GetA(10);
       pp^.getb('s');
       m_list.Add(pp);
      end;
       dispose(pp);
    end;
    end.
    上面就是我的代码;我试过上面两位兄台的代码,确实没有任何的问题
    但是如果在myclass里的函数和过程对myclass私有变量赋值,m_a:=i;m_b:=s;就会有问题了
    各位可以试试看
      

  17.   

    iroi你给我的代码
    有这么一句
    New(p);
        P^.dosomething;
    但是我的程序里的
        P^.dosomething(parameter);
    也就是说我要传一个值进去,很奇怪的是如果在
        dosomething里对myclass的私有变量赋值就会有问题
     比如
         procedure TMyclass.dosomething(parameter:integer) 
         begine
           m_private:=parameter; {m_private是TMyclass的私有变量}  
         end;
       小弟我是vc程序员出身,刚接触delphi,所以很对不起大家,让大家伤脑筋
      在此感谢
      

  18.   

    用CREATE吧,你的写法我觉得只是分配了指针的空间,但没有分配指针所指的对象的空间,所以给私有变量赋值就有问题。用CREATE没问题。
      

  19.   

    没必要用链表吧,动态数组就行了,很好用的
    例如:
    var data : array of TMyClass;for i := 0 to n do
    begin
        Setlength(data,High(data) + 2);
        data[High(data)] := TMyClass.Create;
    end;
    使用生成的类的对象时直接访问数组就行了(下标)。
    释放时用 data := nil;
    OK!!!