16,748
社区成员
发帖
与我相关
我的任务
分享
function TStrings.IndexOf(const S: string): Integer;
begin
for Result := 0 to GetCount - 1 do
if CompareStrings(Get(Result), S) = 0 then Exit;
Result := -1;
end;
IA = interface
['{1B989234-AA9B-4EB3-B8D0-82596979EC7C}']
procedure Say;
end;
TTestObject = class(TInterfacedObject, IA)
public
procedure Say;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TestObject: TTestObject;
A: IA;
begin
TestObject := TTestObject.Create;
//A := TestObject as IA;
//A<>nil then
// A.Say;
if Supports(TestObject, IA, A) then
A.Say;
end;
这样的代码会导致TestObjec被自动 释放。 假如TestObject 是在其它地方创建的,就会导致出现问题。
下面代码是我改造后的代码
IA = interface
['{1B989234-AA9B-4EB3-B8D0-82596979EC7C}']
procedure Say;
end;
TTestObject = class(TInterfacedObject, IA)
private
FAIntf: IA; //主要是为了增加计数
public
constructor Create;
destructor Destroy; override;
procedure Say;
procedure FreeEx; //新加的释放方法
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TestObject: TTestObject;
A: IA;
begin
TestObject := TTestObject.Create;
A := TestObject as IA;
A.Say;
TestObject.FreeEx;
end;
constructor TTestObject.Create;
begin
inherited Create;
FAIntf := Self; //增加一行代码
end;
destructor TTestObject.Destroy;
begin
ShowMessage('TTestobject.Destroy');
inherited;
end;
procedure TTestObject.FreeEx;
begin
FAIntf := nil;
end;
procedure TTestObject.Say;
begin
ShowMessage('test');
end;
这样就避免从TComponent继承了。
var
I,J:Integer;
begin
I := I xor J;
J := I xor J;
I := I xor J;
end;