Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.11.2013, 17:59
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Описание классов в 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' (читаем всё из реестра)
Преподаватель прокоментировал следующие ошибки: 1.Класс TMemory: название класса не соответствует его назначению
2.Класс TSegment: поле FFirst имеет неправильный тип
3.Класс TSomeMemory: массив имеет неправильный тип
первые 2 вродебы исправил, а с массивом проблемы. Подскажите пожалуйста. Спасибо.

Последний раз редактировалось Deman1986, 03.11.2013 в 18:51.
Ответить с цитированием
  #2  
Старый 03.11.2013, 19:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Я бы вообще не массив использовал, а TObjectList. А тип у него д.б. TSegment.
Ответить с цитированием
  #3  
Старый 03.11.2013, 19:09
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо за ответ. Подскажите пожалуйста как описать правильно TObjectList. Просто я запутался уже, кучу литературы перечитал, а толку нет.

Последний раз редактировалось Deman1986, 03.11.2013 в 19:16.
Ответить с цитированием
  #4  
Старый 03.11.2013, 20:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Deman1986
Спасибо за ответ. Подскажите пожалуйста как описать правильно TObjectList. Просто я запутался уже, кучу литературы перечитал, а толку нет.

Ну, посмотри в справке в каком он юните описан, я не помню на вскидку, сам каждый раз смотрю

Использовать как и любой другой список (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  
Старый 03.11.2013, 22:01
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое за помощь, я с вами согласен, что лишний класс. Просто я еще обучаюсь Дельфи, раньше програмировал на Паскале.
Ответить с цитированием
  #6  
Старый 03.11.2013, 23:10
Deman1986 Deman1986 вне форума
Прохожий
 
Регистрация: 03.11.2013
Сообщения: 32
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вот получилось как то так))
Код:
класс 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' // читаем всё из реестра
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter