1.结构与类都是自定义类型,结构可以直接使用,内存是自动管理;类对象需要创建才可以使用,并在使用完成后需要对其手动释放。例如
type
TMyRecord = Record
d:TDate;
end;
TMyClass = class
d:TDate;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
myRecord : TMyRecord;
myClass : TMyClass;
begin
//使用结构(不需要初始化,内存自动管理)
myRecord.d := Now;
ShowMessage(DateToStr(myRecord.d));
ShowMessage(IntToStr(SizeOf(myRecord)));//8
//使用类
myClass := TMyClass.Create; //初始化对象
myClass.d := Now;
ShowMessage(DateToStr(myClass.d));
ShowMessage(IntToStr(SizeOf(myClass)));//4
myClass.Free; //释放对象
end;
2.关于类的方法,在上一篇类的的文章中已经有所涉及。这里就不再详述。一般情况下,类都会定义在interface区;在implementation区定义的类只能本单元使用。
3.关于类的属性
类属性的定义:
{定义两个属性}
TMyClass2 = class
private
FName : string;
FAge : Integer;
procedure SetAge(const Value:Integer); //Value设置为常量
procedure SetName(const Value:string);
published
property Name: string read FName write SetName;
property Age : Integer read FAge write SetAge;
end;
自定义set方法:
procedure TMyClass2.SetAge(const Value: Integer);
begin
if (Value>=0) and (Value<200) then
FAge := Value;
end;
procedure TMyClass2.SetName(const Value: string);
begin
if Value<>'' THEN
FName:= Value;
end;
设置属性的直
myClass2.Age := 99; //访问属性
4.类与事件
关于类与事件的定义,我将通过一个例子来给予说明。
事件的定义:
//定义事件
TMyEvent = procedure of object;
TMyClass = class
private
FAge:Integer;
FOnHundred:TMyEvent;
procedure SetAge(const Value:Integer);
published
procedure SetOnHundred1; //定义事件1
procedure SetOnHundred2; //定义事件2
constructor create; //Form初始化时执行
property Age:Integer read FAge write SetAge;
property OnHundred: TMyEvent read FOnHundred write FOnHundred; //定义事件属性(通过属性的形式来设置事件)
end;
在Form一开始创建的时候就必须先定义一个事件。
constructor TMyClass.create;
begin
FOnHundred:= SetOnHundred1;
end;
事件的调用
myclass.OnHundred := myclass.SetOnHundred2; //事件的指定(类似于属性)
事件类型是一个指针,指向一个过程(不带返回值的方法),事件在定义时指定了参数的类型和个数,调用过程的参数必须与其保持一致。
5. 字段
type
TAncestor = class
Value : Integer;
end;
TDescendant = class(TAncestor)
Value : string;
end;
var
MyObject : TAncestor;
begin
MyObject := TDescendant.Create;
TDescendant(MyObject).Value := 'hello world';
end;