TObjectCollectionRemotable now inherits from TBaseArrayRemotable instead of TAbstractComplexRemotable, that make more sense.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@863 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2009-06-26 12:32:45 +00:00
parent 0fc47f2004
commit 28da302bc6
2 changed files with 73 additions and 74 deletions

View File

@ -842,55 +842,6 @@ type
property OwnObject : Boolean read FOwnObject write FOwnObject; property OwnObject : Boolean read FOwnObject write FOwnObject;
end; end;
{ TObjectCollectionRemotable
An implementation for array handling. The array items are "owned" by
this class instance, so one has not to free them.
}
TObjectCollectionRemotable = class(TAbstractComplexRemotable)
private
FList : TObjectList;
FOptions : TInstanceOptions;
protected
function GetItem(AIndex : PtrInt) : TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
class function GetItemName():string;virtual;
class function GetStyle():TArrayStyle;virtual;
function GetLength : PtrInt;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
class function GetItemClass():TBaseRemotableClass;virtual;abstract;
class function GetItemTypeInfo():PTypeInfo;{$IFDEF USE_INLINE}inline;{$ENDIF}
constructor Create();override;
destructor Destroy();override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function Add(): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function AddAt(const APosition : PtrInt): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function Extract(const AIndex : PtrInt): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Delete(const AIndex : PtrInt);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Exchange(const Index1,Index2 : PtrInt);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Clear();{$IFDEF USE_INLINE}inline;{$ENDIF}
function IndexOf(AObject : TBaseRemotable) : PtrInt;{$IFDEF USE_INLINE}inline;{$ENDIF}
property Item[AIndex:PtrInt] : TBaseRemotable read GetItem;default;
property Length : PtrInt read GetLength;
property Options : TInstanceOptions read FOptions write FOptions;
end;
TBaseArrayRemotableClass = class of TBaseArrayRemotable;
{ TBaseArrayRemotable } { TBaseArrayRemotable }
TBaseArrayRemotable = class(TAbstractComplexRemotable) TBaseArrayRemotable = class(TAbstractComplexRemotable)
@ -910,6 +861,8 @@ type
property Options : TInstanceOptions read FOptions write FOptions; property Options : TInstanceOptions read FOptions write FOptions;
end; end;
TBaseArrayRemotableClass = class of TBaseArrayRemotable;
{ TBaseObjectArrayRemotable { TBaseObjectArrayRemotable
An implementation for array handling. The array items are "owned" by An implementation for array handling. The array items are "owned" by
this class instance, so one has not to free them. this class instance, so one has not to free them.
@ -948,6 +901,49 @@ type
TBaseObjectArrayRemotableClass = class of TBaseObjectArrayRemotable; TBaseObjectArrayRemotableClass = class of TBaseObjectArrayRemotable;
{ TObjectCollectionRemotable
An implementation for array handling. The array items are "owned" by
this class instance, so one has not to free them.
}
TObjectCollectionRemotable = class(TBaseArrayRemotable)
private
FList : TObjectList;
protected
function GetItem(AIndex : PtrInt) : TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function GetLength : PtrInt; override;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
class function GetItemClass():TBaseRemotableClass;virtual;abstract;
class function GetItemTypeInfo():PTypeInfo;override;
constructor Create();override;
destructor Destroy();override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function Add(): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function AddAt(const APosition : PtrInt): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function Extract(const AIndex : PtrInt): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Delete(const AIndex : PtrInt);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Exchange(const Index1,Index2 : PtrInt);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Clear();{$IFDEF USE_INLINE}inline;{$ENDIF}
function IndexOf(AObject : TBaseRemotable) : PtrInt;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure SetLength(Const ANewSize : Integer);override;
property Item[AIndex:PtrInt] : TBaseRemotable read GetItem;default;
end;
{ TBaseSimpleTypeArrayRemotable } { TBaseSimpleTypeArrayRemotable }
TBaseSimpleTypeArrayRemotable = class(TBaseArrayRemotable) TBaseSimpleTypeArrayRemotable = class(TBaseArrayRemotable)
@ -2611,7 +2607,7 @@ begin
Exit; Exit;
if ( ANewSize < 0 ) then if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt('Invalid array length : %d',[ANewSize]); raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
if ( oldLen > ANewSize ) then begin if ( oldLen > ANewSize ) then begin
for i := ANewSize to Pred(oldLen) do for i := ANewSize to Pred(oldLen) do
@ -3500,29 +3496,6 @@ begin
Result := FList.Count; Result := FList.Count;
end; end;
class function TObjectCollectionRemotable.GetItemName() : string;
var
tri : TTypeRegistryItem;
begin
tri := GetTypeRegistry().Find(PTypeInfo(Self.ClassInfo),False);
if Assigned(tri) then
Result := Trim(tri.GetExternalPropertyName(sARRAY_ITEM));
if ( System.Length(Result) = 0 ) then
Result := sARRAY_ITEM;
end;
class function TObjectCollectionRemotable.GetStyle() : TArrayStyle;
var
tri : TTypeRegistryItem;
begin
tri := GetTypeRegistry().Find(PTypeInfo(Self.ClassInfo),False);
if Assigned(tri) and AnsiSameText(sEmbedded,Trim(tri.GetExternalPropertyName(sARRAY_STYLE))) then begin
Result := asEmbeded;
end else begin
Result := asScoped;
end;
end;
class procedure TObjectCollectionRemotable.Save( class procedure TObjectCollectionRemotable.Save(
AObject : TBaseRemotable; AObject : TBaseRemotable;
AStore : IFormatterBase; AStore : IFormatterBase;
@ -3627,7 +3600,7 @@ end;
destructor TObjectCollectionRemotable.Destroy(); destructor TObjectCollectionRemotable.Destroy();
begin begin
FList.Free(); FreeAndNil(FList);
inherited Destroy(); inherited Destroy();
end; end;
@ -3698,6 +3671,30 @@ begin
Result := res; Result := res;
end; end;
procedure TObjectCollectionRemotable.SetLength(const ANewSize: Integer);
var
i,oldLen : Integer;
begin
if ( FList = nil ) then
Exit;
oldLen := FList.Count;
if ( oldLen = ANewSize ) then
Exit;
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidCollectionLength,[ANewSize]);
if ( oldLen > ANewSize ) then begin
for i := ANewSize to Pred(oldLen) do
FList.Delete(FList.Count - 1);
end else begin
if ( FList.Capacity < ANewSize ) then
FList.Capacity := ANewSize;
for i := oldLen to Pred(ANewSize) do
Add();
end;
end;
function TObjectCollectionRemotable.Add() : TBaseRemotable; function TObjectCollectionRemotable.Add() : TBaseRemotable;
begin begin
Result := GetItemClass().Create(); Result := GetItemClass().Create();

View File

@ -17,6 +17,8 @@ unit wst_consts;
interface interface
resourcestring resourcestring
SERR_InvalidArrayLength = 'Invalid array length : %d.';
SERR_InvalidCollectionLength = 'Invalid collection length : %d.';
SERR_InvalidHourOffetValue = '"%d" is not a valid hour offset value.'; SERR_InvalidHourOffetValue = '"%d" is not a valid hour offset value.';
SERR_InvalidMinuteOffetValue = '"%d" is not a valid minute offset value.'; SERR_InvalidMinuteOffetValue = '"%d" is not a valid minute offset value.';
SERR_InvalidParameter = 'Invalid parameter : "%s".'; SERR_InvalidParameter = 'Invalid parameter : "%s".';