Шаг 6 - Апгрейдим MDI проект [TImage]

Честно говоря, предыдущий проект немного халтура, поскольку весь код, касающийся родного MDI, я выкинул. Но ничего. Сейчас мы добавим такую полезную функцию, как просмотр стандартных файлов изображений и текстовых файлов.

Добавьте к форме MDIChild компонент TImage gif/6_1.gif (170 b) с вкладки Additional и компонент TMemo gif/6_2.gif (127 b) с Standard, так беспощадно выкинутый в предыдущем шаге. Для обоих параметр Align задаем как alClient, а для TImage еще и свойство Stretch, как true. Логику сделаем такую: если формат *.avi, *.mid, *.wav, то открыть в MediaPlayer'е, если *.bmp, *.ico, *.wmf, то в изображении, а если ни то ни се - то в TMemo.

Естественно, для этого надо модифицировать код:

void __fastcall TMainForm::CreateMDIChild(String Name,bool img)
{
	TMDIChild *Child;

	//--- create a new MDI child window ----
	Child = new TMDIChild(Application);
	Child->Caption = Name;
	if (FileExists (Name)) {
		if (img){
			Child->Image1->Picture->LoadFromFile(Name);
			Child->Image1->Visible=true;
			Child->Memo1->Visible=false;
		} else {
			Child->Memo1->Lines->LoadFromFile(Name);
			Child->Memo1->Visible=true;
			Child->Image1->Visible=false;
		};
	};
}

void __fastcall TMainForm::FileOpen1Execute(TObject *Sender)
{
	if (OpenDialog->Execute())
		switch (OpenDialog->FilterIndex)
		{
			case 2: CreateMDIChild(OpenDialog->FileName,true); break;
			case 3:
				MediaPlayer1->FileName=OpenDialog->FileName;
				MediaPlayer1->Open();
				MediaPlayer1->Play();
				break;
			default: CreateMDIChild(OpenDialog->FileName,false);
		}
}

Это в main.cpp, а еще в main.h нужно изменить объявление CreateMDIChild на:

void __fastcall TMainForm::CreateMDIChild(String Name,bool img);

...и поменять реализацию функции:

void __fastcall TMainForm::FileNew1Execute(TObject *Sender)
{
	CreateMDIChild("NONAME" + IntToStr(MDIChildCount + 1),false);
}

Теперь разъяснения и немного теории. MDI окно - чаще всего окно документа в редакторе или вьювере. Кто обратил внимание, такое окно нельзя вытащить за пределы MDI формы и при распахивании оно как бы включает в себя главное меню. В принципе, это основное, что нужно знать. Еще есть некоторые функции WinAPI, которые позволяют всякие фокусы с окном выделывать, но мы еще до них не дошли. Как эпилог теории "MDI - это удобно!".

Для создания такого окна мастер вставил функцию CreateMDIChild(), которую мы и терзаем уже второй раз. В OpenDialog'е по выбранному фильтру (здесь слабый момент) определяется тип файла и, в качестве второго параметра для CreateMDIChild(), передается img=true или false. Внутри это соответственно учитывается, и в зависимости от ситуации, свойством Visible скрывается один компонент и показывается другой.

Вот вроде и все. В качестве приза привожу скриншот программы с открытыми окнами:

gif/6_3.gif (27517 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 29.10.2001 (обновлено 19.09.2001)