Честно говоря, предыдущий проект немного халтура, поскольку весь код, касающийся родного MDI, я выкинул. Но ничего. Сейчас мы добавим такую полезную функцию, как просмотр стандартных файлов изображений и текстовых файлов.
Добавьте к форме MDIChild компонент TImage с вкладки Additional и компонент TMemo
с 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 скрывается один компонент и показывается другой.
Вот вроде и все. В качестве приза привожу скриншот программы с открытыми окнами: