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)
|
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(
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user