You've already forked lazarus-ccr
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:
@ -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(
|
||||
|
@ -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();
|
||||
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,16 +2407,13 @@ 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();');
|
||||
Indent(); WriteLn('inherited FreeObjectProperties();');
|
||||
DecIndent();
|
||||
WriteLn('end;');
|
||||
end;
|
||||
|
Reference in New Issue
Block a user