Скачиваний:
28
Добавлен:
01.05.2014
Размер:
5.26 Кб
Скачать
unit ModelProperties;

interface

uses
SerializableObject,
Classes,
SysUtils;

type
TModelProperty = class(TDMSerializableObject)
public
name: string;
value: string;
constructor Create(const name, value: string); overload;
constructor Create(const istream: TStream); overload;
procedure serializeObject( ostream : TStream ); override;
procedure deserializeObject( istream : TStream ); override;
end;

TModelProperties = class(TDMSerializableObject)
private
properties: array of TModelProperty;
count: integer;
capacity: integer;
procedure checkCapacity(size: integer);
procedure checkIndex(index: integer);
function get_ModelProperty(i: integer): TModelProperty;
procedure set_ModelPropery(i: integer; const Value: TModelProperty);
function get_Size: integer;
public
constructor Create;
property ModelProperty[i: integer] : TModelProperty
read get_ModelProperty
write set_ModelPropery;
property Size: integer read get_Size;
function ByName(const name: string): string;
procedure Clear;
procedure Add(const name, value: string); overload;
procedure Add(modelProperty: TModelProperty); overload;
function toString: string;
function toStrings: TStrings;
{From TDMSerializableObject}
procedure serializeObject( ostream : TStream ); override;
procedure deserializeObject( istream : TStream ); override;
destructor Destroy; override;
end;

implementation

{ TModelProperties }

procedure TModelProperties.Add(const name, value: string);
begin
Add(TModelProperty.Create(name, value));
end;

procedure TModelProperties.Add(modelProperty: TModelProperty);
begin
checkCapacity(count + 1);
properties[count] := modelProperty;
inc(count);
end;

function TModelProperties.ByName(const name: string): string;
var
i: Integer;
begin
for i := 0 to count - 1 do
begin
if properties[i].name = name then
begin
Result := properties[i].value;
Exit;
end;
end;
end;

procedure TModelProperties.checkCapacity(size: integer);
begin
if size > capacity then
begin
if size - capacity < 5 then
capacity := capacity + 5
else
capacity := size;
SetLength(properties, capacity);
end;
end;

procedure TModelProperties.checkIndex(index: integer);
begin
if index > count then
raise Exception.Create('Выход за границы массива свойств');
end;

procedure TModelProperties.Clear;
var
i: Integer;
begin
for i := 0 to count - 1 do FreeandNil(properties[i]);
count := 0;
end;

constructor TModelProperties.Create;
begin
capacity := 5;
count := 0;
SetLength(properties, capacity);
end;

procedure TModelProperties.deserializeObject(istream: TStream);
var
i: Integer;
begin
inherited;
Clear;
deserializeInteger(istream, count);
checkCapacity(count);
for i := 0 to count - 1 do Add(TModelProperty.Create(istream));
end;

destructor TModelProperties.Destroy;
begin
Clear;
end;

function TModelProperties.get_ModelProperty(i: integer): TModelProperty;
begin
checkIndex(i);
Result := properties[i];
end;

function TModelProperties.get_Size: integer;
begin
Result := Count;
end;

procedure TModelProperties.serializeObject(ostream: TStream);
var
i: Integer;
begin
inherited;
serializeInteger(ostream, count);
for i := 0 to count - 1 do properties[i].serializeObject(ostream);
end;

procedure TModelProperties.set_ModelPropery(i: integer; const Value: TModelProperty);
begin
checkIndex(i);
properties[i] := Value;
end;

function TModelProperties.toString: string;
var
i: Integer;
begin
Result := '';
if count > 0 then
begin
for i := 1 to count - 1 do
Result := Result + ModelProperty[i].name + ' = '
+ ModelProperty[i].value + #13;
SetLength(Result, Length(Result) - 1);
end;
end;

function TModelProperties.toStrings: TStrings;
var
i: Integer;
curResult : TStrings;
begin
curResult.Clear;
if count > 0 then
begin
for i := 1 to count - 1 do
curResult.Add(ModelProperty[i].name + ' = '
+ ModelProperty[i].value);
end;
result := curResult;
end;

{ TModelProperty }

constructor TModelProperty.Create(const name, value: string);
begin
Self.name := name;
Self.value := value;
end;

constructor TModelProperty.Create(const istream: TStream);
begin
deserializeObject(istream);
end;

procedure TModelProperty.deserializeObject(istream: TStream);
begin
inherited;
deserializeString(istream, name);
deserializeString(istream, value);
end;

procedure TModelProperty.serializeObject(ostream: TStream);
begin
inherited;
serializeString(ostream, name);
serializeString(ostream, value);
end;

end.
Соседние файлы в папке DMCore