Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Свойства с индексами [D5, Win2k]


mRodion ©   (2004-10-06 17:04:00) 

Здравствуйте!
Вопрос мой про свойства. Хочу в своем классе(объекте) на основе TList создать свой собственный список так, чтобы программа использующая мой класс не имела никаких операций с указателями.
Делаю это так:


  type
 TMyListItem = record
   Field1:boolean;
   Field2:byte;
   Field3:char;
  end;
 TMyClass = class
  private
   FMyList:TList
    functionGetItem:TMyListItem;
    procedureSetItem (Item:TMyListItem);
  public
    procedureAdd (Item:TMyListItem);
    procedureDelete (Index:integer);
    propertyItems[Index:integer]:TMyListItem readGetItem writeSetItem;
  end;

functionTMyClass.GetItem (Index:integer):TMyListItem;
begin
  if(Index <0) or(Index >= FMyList.Count) then begin
   exception.CreateRes (@RS_IndexIsOutOfBounds);
   exit;
  end;
 result := PTMyListItem (FMyList.Items[index])^;
end;

procedureTMyClass.SetItem (Index:integer;Item:TListItem);
begin
  if(Index <0) or(Index >= FMyList.Count) then begin
   exception.CreateRes (@RS_IndexIsOutOfBounds);
   exit;
  end;
 PTMyListItem (FMyList.Items[index])^ := Item;
end;

var
 MyClass:TMyClass;


Надеюсь понятно.
Мой вопрос заключается вот в чем:
Почему у меня не получается сделать следующее присваивание:
MyClass.Items[Index].Field1 := true;
?
Delphi говорит, что левой части не может быть ничего присвоено.
Читать значение полей можно без проблем.
Что можно сделать, чтобы разрешить данное присваивание?


Erik1   (2004-10-11 14:38:00) [1]

Вобщето можно еще использовать неидексированое свойство, тогда все будет работать. А индекс можно задавать отдельно.


Amoeba   (2004-10-11 13:19:00) [2]


> А если я TMyListItem сделаю классом, будет ли работать следующая
> конструкция для записи элемента списка в файл?
> var
>  MyItem: TMyListItem
>  BlockWrite ( FileForSave, MyItem, sizeof (MyItem));

Запишется только 4 байта, т.к. в этом случае MyItem это указатель. Так что нужным образом конструкция работвть не будет.


Defunct   (2004-10-08 18:59:00) [3]

> быстрее сохранять (или загружать) списки на диск
> чем способ поэлементного пробега по списку с сохранением (или загрузкой) элементов?

Этим же способом но только сохранять и восстанавливать из TMemoryStream, а его (TMemoryStream) уже полностью сохранять в файл на диске.


mRodion   (2004-10-08 14:20:00) [4]

Спасибо всем за ответы. Все понял.

2Суслик: raise действительно забыл приписать. Exit уберу
По поводу ссылок я знаю, но огромное количество крышечек и собачек в программе ухудшает ее читаемость. Да и надежность в некотором смысле падает. Одно дело, когда я сам бросаю exception "Index is out of bounds", а другое дело, когда система ругается "Access violation" при обращении к несуществующему элементу. Но все равно огромное спасибо. Наступает ясность в голове.

А если я TMyListItem сделаю классом, будет ли работать следующая конструкция для записи элемента списка в файл?
var
 MyItem: TMyListItem
 BlockWrite ( FileForSave, MyItem, sizeof (MyItem));


Когда TMyListItem - record, такая штука работает.

А может быть кто-нибудь может поделиться способом, позволяющим быстрее сохранять (или загружать) списки на диск, чем способ поэлементного пробега по списку с сохранением (или загрузкой) элементов?


Суслик   (2004-10-06 17:37:00) [5]

2Автор

Это что?

exception.CreateRes (@RS_IndexIsOutOfBounds);

Если ты таким образом хотел возбудить исключение, то у тебя ничего не выйдет. Нужно еще слово raise. И exit убери.


Суслик   (2004-10-06 17:25:00) [6]

2Автор.

Ты например знаешь, что программа использующая твой класс уже имеет дело с указателями? В отличие от с++ в дельфи объект и ссылка на объект есть одно и тоже. Поэтому твое желание оградить пользователя от указателей мне кажется странным.

Совет остается тот же - не юзать записи, а юзать классы.


Плохиш   (2004-10-06 17:24:00) [7]

Сделай TMyListItem классом.


Суслик   (2004-10-06 17:22:00) [8]

не очень вижу чем ответ skier может помочь...

Автор впороса ясно сказал  

"создать свой собственный список так, чтобы программа использующая мой класс не имела никаких операций с указателями."


Суслик   (2004-10-06 17:18:00) [9]


> Что можно сделать, чтобы разрешить данное присваивание?

сделать TMyListItem классом


Defunct   (2004-10-06 17:18:00) [10]

mRodion ©   (06.10.04 17:04)

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1097066708&n=0
Skier ©   (06.10.04 16:48) [2]


mRodion   (2004-10-06 17:16:00) [11]

То есть нет способа сделать доступным поля каждого элемента массива подобным синтаксисом?


Плохиш   (2004-10-06 17:07:00) [12]

function GetItem(Index: Integer):TMyListItem;
  procedure SetItem (Index: Integer; Item:TMyListItem);


Наверх

Титульная страница Поиск, карта сайта Написать письмо