Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Именованный массив


Автор: MadCoder 24.3.2008, 09:23
Приветствую!

Понадобилось создать нечто вроде именованного массива. Резонный вопрос: что это такое?

Вот пример, как сейчас выглядит код:
Код

var
SomeArray: Array of String;
...
begin
SetLength(SomeArray, 10);
SomeArray[9]:='Бронная, 12';

Хочу сделать, чтобы запрос к данным массива шел не через счетчик (1.2.3 и т.д.), а через заданную текстовую переменную:
Код

SomeArray[Centr]:='Бронная, 12';
SomeArray[South]:='Новый Арбат, 15';

Причем эти самые текстовые переменные можно было создавать в рантайме...
 smile 

Автор: Alix 24.3.2008, 11:32
стандартные
TBucketList
TObjectBucketList
возможно будет полезен THashedStringList

Автор: dma 24.3.2008, 12:08
Ассоциативные массивы =)

Автор: MadCoder 24.3.2008, 12:28
Цитата(Alix @ 24.3.2008,  11:32)
стандартные
TBucketList
TObjectBucketList
возможно будет полезен THashedStringList

Я немного сократил свой код smile. Мне нужно именно массив, я в него свои типы (record) складываю.

Код

type Sometype=RECORD
lala: String;
la2: String;
end;

var
A: Array of Sometype;

begin
A['config.bat'].lala:='111';
end;


что-то вроде этого smile.

Добавлено через 33 секунды
Цитата(dma @ 24.3.2008,  12:08)
Ассоциативные массивы =)

Спасибо, попробую разобраться smile 

Автор: Alix 24.3.2008, 12:40
Цитата(MadCoder @  24.3.2008,  12:28 Найти цитируемый пост)
Я немного сократил свой код smile. Мне нужно именно массив, я в него свои типы (record) складываю.

это никак не ограничивает тебя в использовании данных классов, в конце концов, можно описать обертку над ними для большего удобства.
А написать самому подобное можно так:
Код
type
  TYourRecord = record
    lalala  : string;
    tratata : byte;
  end;

  TAssociativeArray = class
  private
    ...
    procedure SetValue(const Name : string; Value : TYourRecord);
    function GetValue(const Name: string): TYourRecord;
  public
    property Items[const Name : string] : TYourRecord read GetValue write SetValue; default;
  end;

implementation

{ TAssociativeArray }

function TAssociativeArray.GetValue(const Name: string): TYourRecord;
begin
  //...
end;

procedure TAssociativeArray.SetValue(const Name: string;
  Value: TYourRecord);
begin
  //...
end;
Т.е. у тебя получается у класса св-во items с индексом - строкой. А т.к. это св-во имеет модификатор default, то обращаться к нему можно не как myArray.items['trali-vali'], а myArray['trali-vali'], т.е. внешне от массива и не отличить. Дело только во внутренней реализации хранения значений и сеттера/геттера этих самых значений.

Автор: pseud 24.3.2008, 13:04
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TSomeRecord = class(TComponent)
  public
    lala: string;
    lala2: string;
    name: string;
  end;


type
  TSomeArray = class(TComponent)
  private
    F: array of TSomeRecord;
  public
    function RecordByName(const ARecordName: string): TSomeRecord;
    constructor Create(AOwner: TComponent); override;
  end;


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    FArray: TSomeArray;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TSomeArray }

constructor TSomeArray.Create(AOwner: TComponent);
begin
  inherited;
  SetLength(F, 2);

  F[0] := TSomeRecord.Create(Self);
  F[0].name := 'record0';

  F[1] := TSomeRecord.Create(Self);
  F[1].name := 'record1';
end;


function TSomeArray.RecordByName(const ARecordName: string): TSomeRecord;
var
  i: Integer;
  rec: TSomeRecord;
begin
  for i := Low(F) to High(F) do
  begin
    rec := F[i];
    if AnsiCompareText(rec.name, ARecordName) = 0 then
    begin
      Result := rec;
      Exit;
    end;
  end;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  FArray := TSomeArray.Create(Self);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FArray.RecordByName('record1').lala := '111';
  ShowMessage(FArray.RecordByName('record1').lala);
end;

end.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)