![]() |
|
|
#1
|
|||
|
|||
|
Добрый день, уважаемые участники.
В уже готовом небольшом проекте создается вот такой класс: PHP код:
Понятное дело, что это выглядит порнографией. Хотелось бы узнать, как надо объявлять класс, чтобы к нему можно было обращаться не так: Field.Exlposion[1,1] := .... а так: Field[1,1].Explosion := .... Тем более, что это как-то реализовано во всяких TList и прочих =) Последний раз редактировалось nixel, 12.12.2011 в 14:17. |
|
#2
|
|||
|
|||
|
|
|
#3
|
|||
|
|||
|
Цитата:
В примере указан способ замены имен самих свойств на индексы. А мне нужно что-то вроде, эээ... назовем это массивом, у каждого элемента которого есть перечисленные свойства (и, возможно в будущем, методы). |
|
#4
|
||||
|
||||
|
ну так и объяви массив записей
|
|
#5
|
|||
|
|||
|
там ещё пример, чтобы объект работал как массив
PHP код:
|
|
#6
|
|||
|
|||
|
Цитата:
Pyro, там элементом массива является свойство. А мне свойства-то как раз нужны. В целом, на данный момент вариант NumLock как раз решает эту задачу. Просто реально беспокоит, как потом выкручиваться при необходимости добавлять свои методы в класс =( Последний раз редактировалось nixel, 12.12.2011 в 17:58. |
|
#7
|
|||
|
|||
|
В общем, обычно такая задача решается с помощью 2х классов.
Первый клас - описание Item'а, без всяких массивов и т.п. Второй класс - описание списка/массива, где свойство итемов объявлено свойством по умаолчанию. Не уверен, что там можно ввести 2 индекса, но это уже можно просто проверить. Ну и таки да, стоит просто посмотреть в исходники библиотеки, что бы увидеть как это делается для того-же TStringList. |
|
#8
|
|||
|
|||
|
Цитата:
Цитата:
Последний раз редактировалось nixel, 12.12.2011 в 18:57. |
|
#9
|
|||
|
|||
|
так чтоли?
PHP код:
Последний раз редактировалось Pyro, 12.12.2011 в 19:03. |
|
#10
|
||||
|
||||
|
А что мешает сделать так:
Код:
type
TMasItem = class
private
Fmas: byte;
FFieldOwner: byte;
FCritMass: byte;
FExplosion: boolean;
public
property mas: byte read Fmas write Fmas;
property FieldOwner: byte read FFieldOwner write FFieldOwner;
property CritMass: byte read FCritMass write FCritMass;
property Explosion: boolean read FExplosion write FExplosion;
procedure FutureUsedMethodforOneItem;
end;
TMasField = class
public
Field: Array [1 .. 8, 1 .. 8] of TMasItem;
constructor Create;
destructor Destroy; override;
end;
implementation
constructor TMasField.Create;
var
i, j: Integer;
begin
inherited Create;
for i := 1 to 8 do
for j := 1 to 8 do
Field[i, j] := TMasItem.Create;
end;
destructor TMasField.Destroy;
var
i, j: Integer;
begin
for i := 1 to 8 do
for j := 1 to 8 do
FreeAndNil(Field[i, j]);
inherited Destroy;
end;
procedure TMasItem.FutureUsedMethodforOneItem;
begin
Beep;
end; |
|
#11
|
|||
|
|||
|
~TB~,
о, спасибо! это как раз то, что надо) как же я сам до такого не додумался) спасибо всем за обсуждение! UPD. Немного проглядел. К ячейке тогда надо будет обращаться как, например, Field.Field[1,1].Explosion А переделать так, чтобы можно было обращаться напрямую через Field[1,1].Explosion возможно? Т.е. не объявлять внутри класса массив, а сделать что-то с самим классом. Последний раз редактировалось nixel, 12.12.2011 в 20:28. |
|
#12
|
|||
|
|||
|
я же говорю - проверь возможность указания default с 2мя индексами.
Если напрямую не может, то можнт получиться сделать вложенную структуру дефолтных пропертей, тогда обращение будет типа Field[i][J].Explosion. Хотя не уверен, что такое даст Дельфя с собой сделать ![]() |
|
#13
|
||||
|
||||
|
ну раз пошла такая пьянка, то вот на посошок:
Код:
var
ArrayClass: TArrayClass;
x, y: Integer;
begin
ArrayClass:=TArrayClass.Create;
try
for x:=0 to 7 do
for y:=0 to 7 do
begin
ArrayClass[x, y].ByteArray:=x shl 4 + y;
ArrayClass[x, y].CharArray:=Chr(x shl 4 + y);
end;
ArrayClass[7, 0].ByteArray:=ArrayClass[0, 7].ByteArray;
ArrayClass[1, 7].ByteArray:=ArrayClass[7, 1].ByteArray;
ArrayClass[7, 0].CharArray:=ArrayClass[0, 7].CharArray;
ArrayClass[1, 7].CharArray:=ArrayClass[7, 1].CharArray;
finally
ArrayClass.Free;
end;
end;Код:
type
TArrayClass = class
private
x, y: Integer;
FByteArray: array [0..7, 0..7] of Byte;
FCharArray: array [0..7, 0..7] of Char;
function GetItem(x, y: Integer): TArrayClass;
function GetByte: Byte;
procedure SetByte(const Value: Byte);
function GetChar: Char;
procedure SetChar(const Value: Char);
public
property Item[x, y: Integer]: TArrayClass read GetItem; default;
property ByteArray: Byte read GetByte write SetByte;
property CharArray: Char read GetChar write SetChar;
end;
{ TArrayClass }
function TArrayClass.GetItem(x, y: Integer): TArrayClass;
begin
Self.x:=x;
Self.y:=y;
Result:=Self;
end;
function TArrayClass.GetByte: Byte;
begin
Result:=FByteArray[x, y];
end;
function TArrayClass.GetChar: Char;
begin
Result:=FCharArray[x, y];
end;
procedure TArrayClass.SetByte(const Value: Byte);
begin
FByteArray[x, y]:=Value;
end;
procedure TArrayClass.SetChar(const Value: Char);
begin
FCharArray[x, y]:=Value;
end;![]() расширение функционала: Код:
type
TArrayClass = class
...
public
...
procedure ShowMessage;
end;
procedure TArrayClass.ShowMessage;
begin
Dialogs.ShowMessage(IntToStr(x)+', '+IntToStr(y));
end;Код:
ArrayClass[3, 5].ShowMessage; Последний раз редактировалось NumLock, 13.12.2011 в 10:05. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
nixel (04.01.2012)
| ||
|
#14
|
|||
|
|||
|
спасибо, попробую разобраться =)
|