Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.12.2011, 14:12
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию Создание класса

Добрый день, уважаемые участники.

В уже готовом небольшом проекте создается вот такой класс:
PHP код:
TMasField = class
  
mas: array[1..81..8of byte;
  
FieldOwner: array[1..81..8of byte;
  
CritMass: array[1..81..8of byte;
  
Explosion: array[1..81..8of boolean;
end
c экземпляром класса, допустим, Field.
Понятное дело, что это выглядит порнографией.
Хотелось бы узнать, как надо объявлять класс, чтобы к нему можно было обращаться не так:
Field.Exlposion[1,1] := ....
а так:
Field[1,1].Explosion := ....

Тем более, что это как-то реализовано во всяких TList и прочих =)

Последний раз редактировалось nixel, 12.12.2011 в 14:17.
Ответить с цитированием
  #2  
Старый 12.12.2011, 14:44
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

http://www.delphisources.ru/pages/fa...fault.php.html
только так вроде

а зачем вобще оно??
Ответить с цитированием
  #3  
Старый 12.12.2011, 14:54
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от Pyro
http://www.delphisources.ru/pages/fa...fault.php.html
только так вроде

а зачем вобще оно??
ммм... это немного не то.
В примере указан способ замены имен самих свойств на индексы.
А мне нужно что-то вроде, эээ... назовем это массивом, у каждого элемента которого есть перечисленные свойства (и, возможно в будущем, методы).
Ответить с цитированием
  #4  
Старый 12.12.2011, 15:47
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну так и объяви массив записей
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 12.12.2011, 17:02
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

там ещё пример, чтобы объект работал как массив
PHP код:
myRect := TRectangle.Create;
ShowMessage(...myRect[2]...); 
Ответить с цитированием
  #6  
Старый 12.12.2011, 17:42
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от NumLock
ну так и объяви массив записей
если в будущем мне понадобиться на этот "массив" писать свои методы, как быть? =)

Pyro,
там элементом массива является свойство. А мне свойства-то как раз нужны.

В целом, на данный момент вариант NumLock как раз решает эту задачу. Просто реально беспокоит, как потом выкручиваться при необходимости добавлять свои методы в класс =(

Последний раз редактировалось nixel, 12.12.2011 в 17:58.
Ответить с цитированием
  #7  
Старый 12.12.2011, 18:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,093
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В общем, обычно такая задача решается с помощью 2х классов.
Первый клас - описание Item'а, без всяких массивов и т.п.
Второй класс - описание списка/массива, где свойство итемов объявлено свойством по умаолчанию.

Не уверен, что там можно ввести 2 индекса, но это уже можно просто проверить. Ну и таки да, стоит просто посмотреть в исходники библиотеки, что бы увидеть как это делается для того-же TStringList.
Ответить с цитированием
  #8  
Старый 12.12.2011, 18:49
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от lmikle
Ну и таки да, стоит просто посмотреть в исходники библиотеки, что бы увидеть как это делается для того-же TStringList.
Смотрел, если честно, мало что понял =(

Цитата:
В общем, обычно такая задача решается с помощью 2х классов.
lmikle, можете привести пример? Для облегчения восприятия, так сказать.

Последний раз редактировалось nixel, 12.12.2011 в 18:57.
Ответить с цитированием
  #9  
Старый 12.12.2011, 18:58
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

так чтоли?
PHP код:
type
  Tmyone 
= class
    
//всё что нужно
  
end;
  
Tmymany TList<Tmyone>;
var
  
someTmymany;
begin
  some 
:= Tmymany.Create;
  
some.add(Tmyone.create({...}));
  
some.items[0].dojob 
у меня этой версии делфи нет есличо (а эти уголки - generics)

Последний раз редактировалось Pyro, 12.12.2011 в 19:03.
Ответить с цитированием
  #10  
Старый 12.12.2011, 19:11
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
По умолчанию

А что мешает сделать так:

Код:
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  
Старый 12.12.2011, 19:50
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

~TB~,
о, спасибо! это как раз то, что надо)
как же я сам до такого не додумался)

спасибо всем за обсуждение!

UPD.
Немного проглядел. К ячейке тогда надо будет обращаться как, например, Field.Field[1,1].Explosion
А переделать так, чтобы можно было обращаться напрямую через Field[1,1].Explosion возможно? Т.е. не объявлять внутри класса массив, а сделать что-то с самим классом.

Последний раз редактировалось nixel, 12.12.2011 в 20:28.
Ответить с цитированием
  #12  
Старый 12.12.2011, 21:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,093
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

я же говорю - проверь возможность указания default с 2мя индексами.
Если напрямую не может, то можнт получиться сделать вложенную структуру дефолтных пропертей, тогда обращение будет типа Field[i][J].Explosion. Хотя не уверен, что такое даст Дельфя с собой сделать
Ответить с цитированием
  #13  
Старый 13.12.2011, 09:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну раз пошла такая пьянка, то вот на посошок:
Код:
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;
Вложения
Тип файла: rar TArrayClass.rar (2.1 Кбайт, 1 просмотров)
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 13.12.2011 в 10:05.
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
nixel (04.01.2012)
  #14  
Старый 13.12.2011, 13:33
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

спасибо, попробую разобраться =)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:36.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025