![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Свойства с индексами [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);