Форум: "Начинающим";
Текущий архив: 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