
27.04.2011, 09:36
|
Начинающий
|
|
Регистрация: 09.11.2009
Сообщения: 145
Репутация: 238
|
|
Код:
unit MyArray;
interface
uses
Classes;
type
TArray = class
private
Names: TStrings;
FItems: array of Variant;
function GetValue(Index: Variant): Variant;
procedure SetValue(Index: Variant; const Value: Variant);
public
constructor Create;
destructor Destroy;
function Count: Integer;
procedure Add(Name: string; Value: Variant);
procedure Insert(Name: string; Value: Variant; Index: Integer);
property Items[Index: Variant]: Variant read GetValue write SetValue; default;
end;
implementation
uses Variants, Dialogs;
{ TArray }
procedure TArray.Add(Name: string; Value: Variant);
begin
Names.Add(Name);
SetLength(FItems, Length(FItems) + 1);
FItems[High(FItems)] := Value;
end;
constructor TArray.Create;
begin
Names := TStringList.Create;
end;
destructor TArray.Destroy;
begin
Names.Free;
end;
function TArray.GetValue(Index: Variant): Variant;
var
I: Integer;
W: Word;
begin
W := VarType(Index) and varTypeMask;
case W of
varInteger, varSmallint, varShortInt, varByte:
begin
I := Index;
Result := FItems[i];
end;
varUString, varString:
Result := FItems[Names.IndexOf(Index)];
else
MessageDlg('Неверный индекс', mtError, [mbOk], 0);
end;
end;
procedure TArray.Insert(Name: string; Value: Variant; Index: Integer);
var
I: Integer;
begin
Names.Insert(Index, Name);
SetLength(FItems, Length(FItems) + 1);
for I := High(FItems) downto Index do
FItems[i] := FItems[I - 1];
FItems[Index] := Value;
end;
function TArray.Count: Integer;
begin
Result := Names.Count;
end;
procedure TArray.SetValue(Index: Variant; const Value: Variant);
var
I: Integer;
begin
case VarType(Index) and varTypeMask of
varInteger, varSmallint, varShortInt, varByte:
begin
I := Index;
FItems[i] := Value;
end;
varUString, varString:
FItems[Names.IndexOf(Index)] := Value;
else
MessageDlg('Неверный индекс', mtError, [mbOk], 0);
end;
end;
end.
Код:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
MyArray in 'MyArray.pas';
var
A: TArray;
I: Integer;
begin
A := TArray.Create;
A.Add('Name1', 10);
A.Add('Name2', 'String');
A.Insert('Name3', 0.56, 1);
for I := 0 to A.Count - 1 do
Writeln(A[i]);
Writeln(A[0]);
Writeln(A['Name3']);
A['Name3'] := 'NewValue';
Writeln(A['Name3']);
A.Free;
Readln;
end.
|