Текущий архив: 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.48 MB
Время: 0.034 c