Главная страница
    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.046 c
4-1095397484
drew
2004-09-17 09:04
2004.10.24
И опять com порт


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


14-1097122070
CrazyBoy
2004-10-07 08:07
2004.10.24
ADO c DBF


1-1097351371
Алексей
2004-10-09 23:49
2004.10.24
Узнать какой объект создал событие


1-1097582555
}|{yk
2004-10-12 16:02
2004.10.24
Как правильно отправить сообщение создаваемому в run-time окну?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский