|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Описание классов в Delphi
Здравствуйте уважаемые форумчане столкнулся с проблемой. Учусь в ВУзе. Дали вот такое задание:
Задача «Организация основной памяти» * информационные объекты: страницы оперативной памяти (свойства – НомерСтраницы, Состояние) * страницы объединяются в рамках объекта Сегмент (свойство – РазмерСегмента) * сегменты объединяются в рамках объекта-контейнера ОсновнаяПамять (свойство – тип ОС). Я описал классы, вот что получилось: Код:
класс TMemory type TMemory = class(TObject) private // поля FNumber: integer; // приватное поле FPriznak: Boolean; // приватное поле public // Конструктор Constructor Create (const Number: integer; Priznak: boolean); // методы чтения и записи свойств function GetNumber: integer; // получаем номер procedure SetNumber (const Value: integer); // задаём номер function GetPriznak: boolean; // получаем состояние procedure SetPriznak (const Value: boolean); // задаём состояние end; Код:
класс TElement type TElement = class(TObject) private // поля FMemory: TMemory; // приватное поле FNext: TElement; // приватное поле, указатель на следующий элемент public // конструкторы и деструкторы constructor Create (const Memory: TMemory); destructor Destroy; override; // методы чтения и записи свойств function GetNext: TElement; // получаем следующий элемент стека procedure SetNext (const Value: TElement); // задаём следующий элемент стека function GetMemory: TMemory; // возвращаем значение поля FMemory end; Код:
класс TSegment type TSegment = class(TObject) private // поля FFirst: byte; // приватное поле, вершинный элемент FNum: integer; // приватное поле, номер сегмента public // конструкторы и деструкторы constructor Create (const Num: integer); destructor Destroy; override; // методы чтения и записи свойств function GetFirst; TSegment; // получаем головной элемент function GetNum: integer; // получаем номер сегмента procedure SetNum (const Value: integer); // задаем номер сегмента // методы procedure AddMemory (const Memory: TMemory); // добавляем элемент в стек function DelFirst: TElement; // удаляем вершинный элемент procedure Clear; // очищяем стек end; Код:
класс TSomeMemory type TSomeMemory = class(TObject) Private // поля FSome: array of TMemory (динамический массив экземпляров класса TMemory) FCount: real (приватное поле, количество сегментов) // конструкторы и деструкторы Constructor Create (initianCount) Destructor Destroy; override // методы получения и установки значений свойств Function GetMemory (index: integer): TMemory (возвращаем объект класса TMemory) Function GetCount: integer (получаем количество сегментов) // методы Function SegmentNO (No: integer):TSegment Function AddSL (No: integer): integer (добавляем в массив сегмент) Function DeleteSL (No: integeer): integer (удаляем из массива сегмент) Procedure SaveFile (const FileName: string) (сохраняем список в файле) Procedure LoadFile (const FileName: string) (загружаем список из файла) function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string WinVers = 'Software\Microsoft\Windows\CurrentVersion' (читаем всё из реестра) 2.Класс TSegment: поле FFirst имеет неправильный тип 3.Класс TSomeMemory: массив имеет неправильный тип первые 2 вродебы исправил, а с массивом проблемы. Подскажите пожалуйста. Спасибо. Последний раз редактировалось Deman1986, 03.11.2013 в 18:51. |
#2
|
|||
|
|||
Я бы вообще не массив использовал, а TObjectList. А тип у него д.б. TSegment.
|
#3
|
|||
|
|||
Спасибо за ответ. Подскажите пожалуйста как описать правильно TObjectList. Просто я запутался уже, кучу литературы перечитал, а толку нет.
Последний раз редактировалось Deman1986, 03.11.2013 в 19:16. |
#4
|
|||
|
|||
Цитата:
Ну, посмотри в справке в каком он юните описан, я не помню на вскидку, сам каждый раз смотрю Использовать как и любой другой список (TList и т.д.) за исключением того, что если TObjectList является "владельцем" объектов в списке, то он сам вызывает деструктор при удалении объекта из списка. В остальном - все тоже самое, что и с любым списком. У тебя и так работа со списком сегментов "спрятана" внутри классов, соотв. тебе надо будет переписать только саму работу с массива на список. Да, и еще. По мне, так у тебя как минимум один лишний класс. Я бы сделал так: Код:
type TMemBlock = class // тут содержимое блока - занят или нет, базовый адрес и т.д. end; TSegemnt = class private FBlocks : TObjectList; // Ну и другие аттрибуты public property Blocks[Index : Integer] : TMemBlock read GetBlock; // Для прямого обращения к блоку по индексу ... end TRAM = class private FSegments : TObjectList; ... end; Собственно, дальше, в зависимости от задачи, делаем методы инициализации. Последний раз редактировалось lmikle, 03.11.2013 в 20:22. |
#5
|
|||
|
|||
Спасибо большое за помощь, я с вами согласен, что лишний класс. Просто я еще обучаюсь Дельфи, раньше програмировал на Паскале.
|
#6
|
|||
|
|||
Вот получилось как то так))
Код:
класс TSomeMemory type TSomeMemory = class(TObjectList) Private // поля function GetItems (Index: integer): TSegment; procedure SetItems(Index: Integer; const Value: TSegment); public property Items[Index: Integer]: TSegment read GetItems write SetItems; default; //чтение элементов списка будет происходить через метод GetItems, //а запись - через SetItems // методы function WinInfo(Root_Key: HKEY; Key_Open, Key_Read: string): string WinVers = 'Software\Microsoft\Windows\CurrentVersion' // читаем всё из реестра |