diff --git a/wst/trunk/base_service_intf.pas b/wst/trunk/base_service_intf.pas index b7479c9e3..6a5cbda68 100644 --- a/wst/trunk/base_service_intf.pas +++ b/wst/trunk/base_service_intf.pas @@ -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( diff --git a/wst/trunk/ws_helper/generator.pas b/wst/trunk/ws_helper/generator.pas index 4f61eab44..af5e431c1 100644 --- a/wst/trunk/ws_helper/generator.pas +++ b/wst/trunk/ws_helper/generator.pas @@ -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;