![]() |
|
#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; 00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110 |
#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
|
|||
|
|||
![]() спасибо, попробую разобраться =)
|