Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.26;
Скачать: [xml.tar.bz2];

Вниз

Как организовать именованные массивы в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
15-1299749393
Юрий
2011-03-10 12:29
2011.06.26
С днем рождения ! 6 марта 2011 воскресенье


2-1300915523
fynjy93
2011-03-24 00:25
2011.06.26
проблема с дбчекбокс


13-1126768691
MeF Dei Corvi
2005-09-15 11:18
2011.06.26
C# 3 или Linq


15-1300117961
Сергей К.
2011-03-14 18:52
2011.06.26
Bob Marley - no woman, no cry


15-1299249466
OW
2011-03-04 17:37
2011.06.26
Спрошу, а вдруг..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский