Вопрос: Нужно создавать формы во время выполнения программы. Количество форм заранее не известно.
На каждой форме нужно только рисовать.
Цель - получить окошки с рисунками. Как сделать?
Ответ :
Пример сырой, но работающий. Тонкости отмечены в комментариях,
Надеюсь вы сами добавите необходимое.
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));
};
//---------------------------------------------------------------------------
--------------------------------------------------------------------------------
|