Сборник часто задаваемых вопросов по программированию в среде Borland C++ Builder

           

Нужно создавать формы...



Вопрос: Нужно создавать формы во время выполнения программы. Количество форм заранее не известно. На каждой форме нужно только рисовать. Цель - получить окошки с рисунками. Как сделать?

Ответ : Пример сырой, но работающий. Тонкости отмечены в комментариях, Надеюсь вы сами добавите необходимое. code: -------------------------------------------------------------------------------- //--- FormList.h -------------------------------------------------------------- #ifndef FormListH #define FormListH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TFormList { private: // User declarations TList *List; //Список форм TForm *AForm; //Временая переменная public: // User declarations __fastcall TFormList(){ List =new TList; OnPaint=FormListPaint;}; Classes::TNotifyEvent OnPaint; void __fastcall Add(TWinControl* Owner) { int id; AForm=new TForm(Owner); List->Add((void *)AForm); //Для простоты пока сделаем идентификатор окна id так id=List->Count; //Здесь возможен конфликт //Надо проверить в списке есть ли уже окно с таким идентификатором // id должен быть уникальным, неповторяющимся AForm->Name="MyForm"+IntToStr(id); AForm->Parent=Owner; AForm->Width=200; AForm->Height=200; AForm->Caption="Picture"+IntToStr(id); //Функция рисования окна AForm->OnPaint=OnPaint; //Функция удаления окна из списка при его закрытии AForm->OnClose=FormListClose; //Положим его сверху AForm->FormStyle=fsStayOnTop; //Сохраним идентификатор AForm->Tag=id; //Отобразим на экран AForm->Show(); }; void __fastcall Clear() { for(int i=List->Count-1; i>=0; --i) { AForm=(TForm *)List->Items[i]; delete AForm; List->Delete(i); } }; __fastcall ~TFormList(void){ Clear(); delete List; }; //Рисование на форме, можете заменить и расписать в другом месте void __fastcall FormListPaint(TObject *Sender) { TForm *F=(TForm *)Sender; TCanvas *Cv=F->Canvas; Cv->TextOut(10,10,"ClassPaint"+IntToStr(F->Tag)); }; //При закрытии окна удаляем его из списка void __fastcall FormListClose(TObject *Sender, TCloseAction &Action) { TForm *F=(TForm *)Sender; for(int i=List->Count-1; i>=0; --i) { AForm=(TForm *)List->Items[i]; if(AForm !=F)continue; List->Delete(i); break; } }; protected: }; #endif //-- Unit1.h ------------------------------------------------------------ #include <vcl.h> #pragma hdrstop #include "FormList.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TFormList *FList; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { FList=new TFormList; } //--------------------------------------------------------------------------- void __fastcall TForm1::AddButton1Click(TObject *Sender) { //Заменяем функцию рисования класса TFormList //перед добавлением окна FList->OnPaint=FormListPaint; FList->Add(NULL); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClearButton2Click(TObject *Sender) { FList->Clear(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { delete FList; } //--------------------------------------------------------------------------- //Рисование на форме, замена функции класса TFormList //Здесь вы рисуете свою картинку в зависимости от значения Tag // формы из списка void __fastcall TForm1::FormListPaint(TObject *Sender) { TForm *F=(TForm *)Sender; TCanvas *Cv=F->Canvas; Cv->TextOut(10,10,"MyPaint"+IntToStr(F->Tag)); }; //--------------------------------------------------------------------------- --------------------------------------------------------------------------------

Содержание раздела