![]()  | 
	
 
  | 
| 
		 
			 
			#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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 спасибо, попробую разобраться =) 
		
	
		
		
		
		
		
	
		
		
	
	
	 |