窗体上有一个button,三个edit,代码如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
Tagent =class
name :string;
end; Tjobagent =class(Tagent)
procedure haha(Sender: TObject);
private
a :array of integer;
end; Tmachineagent =class(Tagent)
private
b :array of integer;
end; TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure Tjobagent.haha(Sender: TObject);
var
machineagent :Tmachineagent;
i :integer;
result1 :boolean;
begin
machineagent :=Tmachineagent.Create;
setlength(a ,6);
setlength(machineagent.b,6);
for i :=0 to 5 do
begin
a[i] :=random(100);
machineagent.b[i] :=a[i];
form1.Edit1.Text :=inttostr(machineagent.b[i]);
end;
for i :=0 to 5 do
begin
result1 := (a[i]<>0) or (a[i+1]<>0)
end;
if result1 then
form1.Edit2.Text :='ok'
else
form1.Edit2.Text :='no';
end;procedure TForm1.Button1Click(Sender: TObject);
var
jobagent :Tjobagent;
machineagent :Tmachineagent;
//i :integer;
begin
jobagent :=Tjobagent.Create;
machineagent :=Tmachineagent.Create;
jobagent.haha(Sender);
form1.edit3.Text :=inttostr(machineagent.b[3]);
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
Tagent =class
name :string;
end; Tjobagent =class(Tagent)
procedure haha(Sender: TObject);
private
a :array of integer;
end; Tmachineagent =class(Tagent)
private
b :array of integer;
end; TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure Tjobagent.haha(Sender: TObject);
var
machineagent :Tmachineagent;
i :integer;
result1 :boolean;
begin
machineagent :=Tmachineagent.Create;
setlength(a ,6);
setlength(machineagent.b,6);
for i :=0 to 5 do
begin
a[i] :=random(100);
machineagent.b[i] :=a[i];
form1.Edit1.Text :=inttostr(machineagent.b[i]);
end;
for i :=0 to 5 do
begin
result1 := (a[i]<>0) or (a[i+1]<>0)
end;
if result1 then
form1.Edit2.Text :='ok'
else
form1.Edit2.Text :='no';
end;procedure TForm1.Button1Click(Sender: TObject);
var
jobagent :Tjobagent;
machineagent :Tmachineagent;
//i :integer;
begin
jobagent :=Tjobagent.Create;
machineagent :=Tmachineagent.Create;
jobagent.haha(Sender);
form1.edit3.Text :=inttostr(machineagent.b[3]);
end;end.
edit2 ok
edit3 av错误
Tjobagent、Tmachineagent里的两个开放数组成员都是private的。楼主想玩Delphi,可暂时先改成public,运行通过了,再去考虑数据封装的问题。
var
jobagent :Tjobagent;
machineagent :Tmachineagent;//改成全局的才行
//i :integer;
begin
jobagent :=Tjobagent.Create;
machineagent :=Tmachineagent.Create;
jobagent.haha(Sender);//上边的machineagent跟haha里边的不是一个阿
form1.edit3.Text :=inttostr(machineagent.b[3]);//machineagent.b[3]根本没值
end;
procedure TForm1.Button1Click(Sender: TObject);
...
form1.edit3.Text :=inttostr(machineagent.b[3]);
/// ^^^^ 这个错误是很多刚入门的Delphi程序员容易
/// 犯的错误:
/// 类中的方法访问了它的某个确定的实例的成员。
/// 从面向对象的角度来看,这是绝对错误的!
/// 由于Delphi里每个窗体对应的Unit里都定义了一个
/// 窗体对象,比如 var Form1: TForm1;
/// 所以楼主这样的代码运行起来似乎也没什么错误,
/// 但从概念上,楼主这么做是错误的。
end; 另外:如果运行中又动态创建了一个 TForm1 的对象,那么,楼主的这个
函数的行为恐怕就,呵呵,不如楼主所想的那样了。
var
jobagent :Tjobagent;
machineagent :Tmachineagent;//改成全局的才行
//i :integer;
begin
jobagent :=Tjobagent.Create;
machineagent :=Tmachineagent.Create;
jobagent.haha(Sender);//上边的machineagent跟haha里边的不是一个阿
---> ^^^^ 错误在这!!!!!
jobagent 并为 machineagent 里的b 分配内存。
它只给它的一个“局部”Tmachineagent 对象的b 分配了内存。
(由于Delphi里的对象都是在堆上的,所以,说它“局部”不太合适)
form1.edit3.Text :=inttostr(machineagent.b[3]);//machineagent.b[3]根本没值
end;
,怎么改程序?