Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как организовать именованные массивы в Delphi?


>|< ©   (2011-03-16 11:47:00) 

Помогите с синтаксисом, плиз!
Есть нерабочая заготовка:

TMethodArray = class
 private
//    FMethods:array of TMethod;
   procedure SetValue(const Name : string; Value : TMethod);
   function GetValue(const Name: string): TMethod;
 public
   property Items[const Name : string] : TMethod read GetValue write SetValue; default;
 end;

implementation

function TMethodArray.GetValue(const Name: string): TMethod;
begin
Result := Items[Name];
end;

procedure TMethodArray.SetValue(const Name: string; Value: TMethod);
begin
 Items[Name]:=Value;
end;


Насколько я понимаю, для хранения элементов Items, нужно создать внутреннее поле типа массив, но тогда нужно будет еще один масив для хранения имен и по соответствующему номеру имени и элемента первого масива выдавать Items[Name]
то есть, если в коде то примерно так:

TMethodArray = class
 private
   FMethods:array of TMethod;
   FNames:array of string[100];
   procedure SetValue(const Name : string; Value : TMethod);
   function GetValue(const Name: string): TMethod;
 public
   function Add(const Name : string; Value : TMethod):integer;
   property Items[const Name : string] : TMethod read GetValue write SetValue; default;
 end;

implementation

{ TMethodArray }

function TMethodArray.Add(const Name: string; Value: TMethod): integer;
begin
 SetLength(FNames, Length(FNames)+1);
 SetLength(FMethods, Length(FMethods)+1);
 FNames[Length(FNames)-1] := Name;
 FMethods[Length(FMethods)-1] := Value;
end;

function TMethodArray.GetValue(const Name: string): TMethod;
var
 I: Integer;
begin
for I := 0 to Length(FNames) - 1 do
  if FNames[i]=Name then
  begin
    Result := FMethods[i];
    Break;
  end;
end;

procedure TMethodArray.SetValue(const Name: string; Value: TMethod);
var
 I: Integer;
begin
for I := 0 to Length(FNames) - 1 do
  if FNames[i]=Name then
  begin
    FMethods[i].Code:=Value.Code;
    FMethods[i].Data:=Value.Data;
    Break;
  end;
end;


Есть ли альтернативный более простой метод организации ассоциативного массива в Delphi?
Рабочие примеры приветствуются.)


Jeer   (2011-03-16 17:45:00) [1]

http://sourceforge.net/projects/fundementals/


>|<   (2011-03-16 17:39:00) [2]


> http://fundementals.sourceforge.net/

We're Sorry but this Project hasn't yet uploaded their personal webpage yet.


RWolf   (2011-03-16 14:25:00) [3]

http://fundementals.sourceforge.net/


>|<   (2011-03-16 14:18:00) [4]


> подключить библиотеку ассоциативных массивов

и как эта библиотека называется? что в uses написать?


RWolf   (2011-03-16 14:03:00) [5]


> Есть ли альтернативный более простой метод организации ассоциативного
> массива в Delphi?

подключить библиотеку ассоциативных массивов и ничего не организовывать, куда уж проще.
сам использую Delphi Fundamentals.


>|<   (2011-03-16 13:51:00) [6]


> что FMethods нигде не инициализируется.

спасибо!
Добавил конструктор и деструктор, в которых создал и освободил FMethods, соответственно.


DiamondShark   (2011-03-16 13:44:00) [7]


>  вываливается ошибка на методе AddObject

Секретная.


> Кто знает, в чем причина ошибки?

В скрытом коде.
Из того кода, что приведён, видно только, что FMethods нигде не инициализируется.


>|<   (2011-03-16 13:04:00) [8]

с использованием TStringList вываливается ошибка на методе AddObject
Вот реализация:

TMethodObject = class
   Code:Pointer;
   Data:Pointer;
   public
     constructor Create(AMethod:TMethod);overload;
 end;

 TMethodArray = class
 private
     FMethods:TStringList;
   function GetValue(const Name: string): TMethod;
 public
   function Add(const Name : string; Value : TMethod):integer;
   property Items[const Name : string] : TMethod read GetValue; default;
 end;

implementation

{ TMethodObject }

constructor TMethodObject.Create(AMethod: TMethod);
begin
 Create;
 Code := AMethod.Code;
 Data := AMethod.Data;
end;

{ TMethodArray }

var MethodObject:TMethodObject;
function TMethodArray.Add(const Name: string; Value: TMethod): integer;
begin
 MethodObject:=TMethodObject.Create(Value);
 FMethods.AddObject(Name, MethodObject);
end;

function TMethodArray.GetValue(const Name: string): TMethod;
var MethodObject:TMethodObject;
begin
 MethodObject :=TMethodObject(FMethods.Objects[FMethods.IndexOfName(Name)]);
 Result.Code := MethodObject.Code;
 Result.Data := MethodObject.Data;
end;


Кто знает, в чем причина ошибки?


>|<   (2011-03-16 12:22:00) [9]

TMethodObject = class
   Code:Pointer;
   Data:Pointer;
   public
     constructor Create(AMethod:TMethod);overload;
 end;

constructor TMethodObject.Create(AMethod: TMethod);
begin
 Create;
 Code := AMethod.Code;
 Data := AMethod.Data;
end;

var MethodObject:TMethodObject;
function TMethodArray.Add(const Name: string; Value: TMethod): integer;
begin
 MethodObject:=TMethodObject.Create(Value);
 FMethods.AddObject(Name, MethodObject);
end;

2Rouse_ ©
Так подойдет?


>|<   (2011-03-16 12:11:00) [10]

А как лучше преобразовать TMethod в TObject?
Создать наследника TObject с полями TMethod?


Rouse_   (2011-03-16 11:48:00) [11]

А, TStringList чем не подходит? Тут тебе и Name и Value и Object до куче в одном элементе.


Наверх

Титульная страница Поиск, карта сайта Написать письмо