Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.034 c
1-1096810509
TeNY
2004-10-03 17:35
2004.10.24
Как можно определить момент выхода курсора мыши из компонента


3-1096257220
NoG
2004-09-27 07:53
2004.10.24
Вопрос по MicroKernel DateBase (*.cmw)


1-1097147570
Yuri Btr
2004-10-07 15:12
2004.10.24
Вопрос по быстрому преобразованию Фурье


1-1097215738
Девушка
2004-10-08 10:08
2004.10.24
Abstact error


4-1095781410
Th
2004-09-21 19:43
2004.10.24
Проблема с вызовом CreateProcess из сервиса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский