Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.26;
Скачать: CL | DM;

Вниз

Как организовать именованные массивы в Delphi?   Найти похожие ветки 

 
>|<   (2011-03-16 11:47) [0]

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

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?
Рабочие примеры приветствуются.)


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

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


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

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


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

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 13:04) [4]

с использованием 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;


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


 
DiamondShark ©   (2011-03-16 13:44) [5]


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

Секретная.


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

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


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


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

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


 
RWolf ©   (2011-03-16 14:03) [7]


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

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


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


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

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


 
RWolf ©   (2011-03-16 14:25) [9]

http://fundementals.sourceforge.net/


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


> http://fundementals.sourceforge.net/

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


 
Jeer ©   (2011-03-16 17:45) [11]

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



Страницы: 1 вся ветка

Текущий архив: 2011.06.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
2-1300378553
Алексей Гость
2011-03-17 19:15
2011.06.26
Не могу разобраться с DLL


15-1299923817
Polevi
2011-03-12 12:56
2011.06.26
Solution explorer


3-1261465889
Lowlander
2009-12-22 10:11
2011.06.26
Перенос связанных таблиц Paradox на другой комп.


15-1298966436
Rouse_
2011-03-01 11:00
2011.06.26
Нужна небольшая помощь в тестировании


2-1300883913
Sewerneik
2011-03-23 15:38
2011.06.26
Поиск в БД в формате dbf через Table