举个例子:
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;
//以上按你的要求循环创建,并调用方法。
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;
//以上按你的要求循环创建,并调用方法。
其实没必要用指针,对象本身就是指针,直接用对象就可以了 for I := 0 to List.Count - 1 do
begin
MyObj := TMyClass.Create;
List.Add(MyObj);
end;
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);
begin
MyObj := TMyClass.Create;
MyObj.Name := 'MyClass'+IntToStr(i);
List.Add(MyObj);
TMyClass(FindClass('MyClass'+IntToStr(i))).dosomething;
end;
你能不能把这个例子在你的机器上运行一边,我这刚卸了delphi,不能验证,麻烦你了
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.
oClassXX = TClassXX.Create
太阳风兄的代码我试过了,没问题,但是,我在过程TMyClass.AAA;里面传递了几个参数进去,就有问题了;比如我使用了这样的代码:
procedure TMyClass.AAA(i:integer);
begin
m_int1:=i;
end;
每次执行PObj^.AAA(4);就由异常产生了,怎么解决阿?
还是请教:)
我的例子在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.
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.
不过我晚上不在
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;就会有问题了
各位可以试试看
有这么一句
New(p);
P^.dosomething;
但是我的程序里的
P^.dosomething(parameter);
也就是说我要传一个值进去,很奇怪的是如果在
dosomething里对myclass的私有变量赋值就会有问题
比如
procedure TMyclass.dosomething(parameter:integer)
begine
m_private:=parameter; {m_private是TMyclass的私有变量}
end;
小弟我是vc程序员出身,刚接触delphi,所以很对不起大家,让大家伤脑筋
在此感谢
例如:
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!!!