Глава 26. Многодокументный интерфейс___________________________755

Функция initMainwindow () начинается с конструирования обрамляющего окна как экземпляра-TMDiFrame. Конструктор класса TMDiFrame отличается от других конструкторов главного окна, не поддерживающих MDI, одной интересной деталью. Другие конструкторы обрамляющих окон принимают в качестве аргумента указатель на клиентское окно. Это позволяет в простых случаях обойтись без клиентского окна путем передачи в качестве параметра нулевого указателя. Однако правила работы с многодокументным интерфейсом требуют обязательного присутствия клиентского окна. Это достигается тем, что конструктор класса TMDiFrame принимает не указатель, а ссылку на объект TMDiciient. Функция initMainwindow () в качестве клиентского окна создает новый объект simpleMDiciient и передает его как параметр конструктору TMDiFrame.

Замечание

Вас не беспокоит динамическое выделение памяти при создании объекта

SimpleMDiciient В КОНСТруКТОре TMDiFrame функции InitMainwindow()? В

самом деле, ведь этот объект не удаляется явно внутри simpleMDi. Классы OWL часто принимают в своих конструкторах указатели на'другие объекты. В таких случаях действует соглашение, что эти классы являются собственниками, а потому и отвечают за удаление такого рода объектов. Класс TMDiFrame представляет собой особый случай в том смысле, что он принимает ссылку на объект TMDiciient, но право собственности на этот объект все равно остается за ним. Класс TMDiFrame не создает копии объекта TMDiciient. Поэтому если попробовать создать TMDiFrame, используя временный объект TMDiciient, то результат будет некорректен, так как временный объект вскоре выйдет из области видимости и будет автоматически удален.

Оставшиеся строки initMainwindow о просто выполняют действия, характерные для большинства приложений, основанных на классах библиотеки OWL.

Основы обработки команд MDI

В следующем фрагменте программы из листинга 26.1 содержится объявление таблицы обработчиков команд меню:

DEFINE_RESPONSE_TABLE1(SimpleMDiciient, TMDIClient) EV_COMMAMD(CM_MDIFILENEW, CmFileNew), EV_COMMAND(CM_FILECLOSE, CmFileClose), EV_COMMAND_ENABLE(CM_FILECLOSE, CeFileClose),

END_RES PONSE_TABLE ;

i

В этой таблице устанавливается реакция приложения на команды меню Файл, Создать (File, New) и Файл, Закрыть (File, Close). Обработкой этих команд занимаются функции-члены CmFileNew о и CmFileClose () класса simpleMDiciient. Последней в таблице задается функция CeFileClose () для разрешения выполнения команды Файл, Закрыть (File, Close).