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

Ответ :

Пример сырой, но работающий. Тонкости отмечены в комментариях, 
Надеюсь вы сами добавите необходимое. 


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)); 
}; 
//--------------------------------------------------------------------------- 

--------------------------------------------------------------------------------
	

Электронные Книги по компьютерным программам
На правах рекламы:
Логин
Пароль
Запомнить меня