Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Свойства с индексами   Найти похожие ветки 

 
mRodion ©   (2004-10-06 17:04) [0]

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


 type
 TMyListItem = record
   Field1:boolean;
   Field2:byte;
   Field3:char;
 end;
 TMyClass = class
 private
   FMyList:TList
   function GetItem:TMyListItem;
   procedure SetItem (Item:TMyListItem);
 public
   procedure Add (Item:TMyListItem);
   procedure Delete (Index:integer);
   property Items[Index:integer]:TMyListItem read GetItem write SetItem;
 end;

function TMyClass.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;

procedure TMyClass.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 говорит, что левой части не может быть ничего присвоено.
Читать значение полей можно без проблем.
Что можно сделать, чтобы разрешить данное присваивание?


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

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


 
mRodion ©   (2004-10-06 17:16) [2]

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


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


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

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


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

mRodion ©   (06.10.04 17:04)

http://delphimaster.net/view/1-1097066708/
Skier ©   (06.10.04 16:48) [2]


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

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

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

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


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

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


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

2Автор.

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

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


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

2Автор

Это что?

exception.CreateRes (@RS_IndexIsOutOfBounds);

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


 
mRodion ©   (2004-10-08 14:20) [9]

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

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

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


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

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


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

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

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


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


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

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


 
Erik1 ©   (2004-10-11 14:38) [12]

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
3-1096281014
Леонид
2004-09-27 14:30
2004.10.24
Не удается проапдейтить запись БД-access


4-1095424108
SashkoSoft
2004-09-17 16:28
2004.10.24
Как достучаться до dll ?


14-1096895691
Zacho
2004-10-04 17:14
2004.10.24
Дефрагментация в XP


1-1097133765
lightix
2004-10-07 11:22
2004.10.24
Создать приложение подобное "Панели MS Office"


3-1096016649
slaviq
2004-09-24 13:04
2004.10.24
Несколько Datbase Name в TDatabase