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

View File

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