Introduce "FreeObjectProperties()" method in TBaseComplexRemotable to allow its derived classes to clear (FreeAndNil) their object(s) and array(s) properties.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@909 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2009-07-16 11:16:39 +00:00
parent dac00e12d2
commit 1dbbf6ce7e
2 changed files with 27 additions and 24 deletions

View File

@ -528,6 +528,7 @@ type
TBaseComplexRemotable = class(TAbstractComplexRemotable) TBaseComplexRemotable = class(TAbstractComplexRemotable)
public public
destructor Destroy();override;
class procedure Save( class procedure Save(
AObject : TBaseRemotable; AObject : TBaseRemotable;
AStore : IFormatterBase; AStore : IFormatterBase;
@ -540,6 +541,8 @@ type
var AName : string; var AName : string;
const ATypeInfo : PTypeInfo const ATypeInfo : PTypeInfo
);override; );override;
// This will free objects and arrays properties and set them to nil.
procedure FreeObjectProperties();virtual;
end; end;
TRemotableRecordEncoderClass = class of TRemotableRecordEncoder; TRemotableRecordEncoderClass = class of TRemotableRecordEncoder;
@ -883,7 +886,7 @@ type
function GetName : string; override; function GetName : string; override;
procedure SetName(const AValue: string); override; procedure SetName(const AValue: string); override;
public public
destructor Destroy(); override; procedure FreeObjectProperties();override;
class procedure Save( class procedure Save(
AObject : TBaseRemotable; AObject : TBaseRemotable;
AStore : IFormatterBase; AStore : IFormatterBase;
@ -2129,6 +2132,12 @@ begin
Result := ( FAttributeFieldList.IndexOf(AField) >= 0 ); Result := ( FAttributeFieldList.IndexOf(AField) >= 0 );
end; end;
destructor TBaseComplexRemotable.Destroy();
begin
FreeObjectProperties();
inherited Destroy();
end;
class procedure TBaseComplexRemotable.Save( class procedure TBaseComplexRemotable.Save(
AObject : TBaseRemotable; AObject : TBaseRemotable;
AStore : IFormatterBase; AStore : IFormatterBase;
@ -2502,6 +2511,11 @@ begin
end; end;
{$ENDIF USE_SERIALIZE} {$ENDIF USE_SERIALIZE}
procedure TBaseComplexRemotable.FreeObjectProperties();
begin
//Derived classes should override this method to free their object(s) and array(s).
end;
{ TBaseObjectArrayRemotable } { TBaseObjectArrayRemotable }
function TBaseObjectArrayRemotable.GetItem(AIndex: Integer): TBaseRemotable; function TBaseObjectArrayRemotable.GetItem(AIndex: Integer): TBaseRemotable;
@ -4802,11 +4816,11 @@ begin
FNameSet := not IsStrEmpty(AValue); FNameSet := not IsStrEmpty(AValue);
end; end;
destructor THeaderBlockProxy.Destroy(); procedure THeaderBlockProxy.FreeObjectProperties();
begin begin
if OwnObject then if OwnObject then
ActualObject.Free(); FreeAndNil(FActualObject);
inherited Destroy(); inherited FreeObjectProperties();
end; end;
class procedure THeaderBlockProxy.Save( class procedure THeaderBlockProxy.Save(

View File

@ -2349,14 +2349,10 @@ var
if ( locArrayPropsNbr > 0 ) or ( locClassPropNbr > 0 ) then begin if ( locArrayPropsNbr > 0 ) or ( locClassPropNbr > 0 ) then begin
IncIndent(); IncIndent();
Indent(); WriteLn('constructor Create();override;'); Indent(); WriteLn('constructor Create();override;');
Indent(); WriteLn('procedure FreeObjectProperties();override;');
DecIndent(); DecIndent();
end; end;
if ( locArrayPropsNbr > 0 ) or ( locClassPropNbr > 0 ) then begin
IncIndent();
Indent(); WriteLn('destructor Destroy();override;');
DecIndent();
end;
// //
Indent(); Indent();
WriteLn('published'); WriteLn('published');
@ -2384,30 +2380,26 @@ var
WriteLn('constructor %s.Create();',[ASymbol.Name]); WriteLn('constructor %s.Create();',[ASymbol.Name]);
WriteLn('begin'); WriteLn('begin');
IncIndent(); IncIndent();
Indent(); Indent(); WriteLn('inherited Create();');
WriteLn('inherited Create();');
for k := 0 to Pred(locPropCount) do begin for k := 0 to Pred(locPropCount) do begin
p := TPasProperty(locPropList[k]); p := TPasProperty(locPropList[k]);
if SymbolTable.IsOfType(p.VarType,TPasClassType) or if SymbolTable.IsOfType(p.VarType,TPasClassType) or
SymbolTable.IsOfType(p.VarType,TPasArrayType) SymbolTable.IsOfType(p.VarType,TPasArrayType)
then begin then begin
Indent();
if AnsiSameText(p.Name,p.VarType.Name) or if AnsiSameText(p.Name,p.VarType.Name) or
( SymbolTable.IsOfType(p.VarType,TPasClassType) and Assigned(FindMember(TPasClassType(ASymbol),p.VarType.Name)) ) ( SymbolTable.IsOfType(p.VarType,TPasClassType) and Assigned(FindMember(TPasClassType(ASymbol),p.VarType.Name)) )
then then
ss := Format('%s.%s',[SymbolTable.CurrentModule.Name,p.VarType.Name]) ss := Format('%s.%s',[SymbolTable.CurrentModule.Name,p.VarType.Name])
else else
ss := p.VarType.Name; ss := p.VarType.Name;
WriteLn('F%s := %s.Create();',[p.Name,ss{p.VarType.Name}]); Indent(); WriteLn('F%s := %s.Create();',[p.Name,ss{p.VarType.Name}]);
end; end;
end; end;
DecIndent(); DecIndent();
WriteLn('end;'); WriteLn('end;');
end;
if ( locArrayPropsNbr > 0 ) or ( locClassPropNbr > 0 ) then begin
NewLine(); NewLine();
WriteLn('destructor %s.Destroy();',[ASymbol.Name]); WriteLn('procedure %s.FreeObjectProperties();',[ASymbol.Name]);
WriteLn('begin'); WriteLn('begin');
IncIndent(); IncIndent();
for k := 0 to Pred(locPropCount) do begin for k := 0 to Pred(locPropCount) do begin
@ -2415,17 +2407,14 @@ var
if SymbolTable.IsOfType(p.VarType,TPasClassType) or if SymbolTable.IsOfType(p.VarType,TPasClassType) or
SymbolTable.IsOfType(p.VarType,TPasArrayType) SymbolTable.IsOfType(p.VarType,TPasArrayType)
then begin then begin
Indent(); Indent(); WriteLn('if Assigned(F%s) then',[p.Name]);
WriteLn('if Assigned(F%s) then',[p.Name]);
IncIndent(); IncIndent();
Indent(); Indent(); WriteLn('FreeAndNil(F%s);',[p.Name]) ;
WriteLn('FreeAndNil(F%s);',[p.Name]) ;
DecIndent(); DecIndent();
end; end;
end; end;
Indent(); Indent(); WriteLn('inherited FreeObjectProperties();');
WriteLn('inherited Destroy();'); DecIndent();
DecIndent();
WriteLn('end;'); WriteLn('end;');
end; end;
end; end;