Урок 17 Программное создание на форме различных визуальных и невизуальных компонентов.(продолжение) No title

April 3, 2006
в колонках играет The Doors-Queen of the highway


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


Теперь напишем две пользовательские функции, при помощи которых будет создаваться TLabel и TImage.

void __fastcall TForm1::NewImage(AnsiString Name,AnsiString FileName, int top, int left)
//
чтобы потом создать картинку, мы должны будем написать NewImage("имя компонента","имя файла с картинкой",отступ сверху,отступ слева);
отступы будут отсчитываться с левого верхнего угла Panel1, там координата будет равна 0,0. Также в эту функцию можно добавить любые нужные вам параметры
{
TImage *IM= new TImage(this);
//создаём новую картинку
IM->Parent=Panel1;//
кидаем её на Panel1
IM->Proportional=true;
//делаем её пропорциональной при любых размерах
IM->Stretch=true;
//включаем растягивание картинки по размерам TImage
IM->Width=100;//
устанавливаем ширину картинки
IM->Height=80;
//устанавливаем высоту картинки
IM->Name=Name;//
присваиваем имя картинки, указанное в нашей функции
IM->Top=top;
//отступ сверху
IM->Left=left;
//отступ слева
IM->Picture->LoadFromFile(FileName);
//загружаем картинку из файла, указанного в нашей функции
IM->OnClick=SuperClick;
//при событии onClick нашей картинки, будет выполняться функция SuperClick;
}


Вроде бы всё подробно расписал, этот код пишем в unit1.cpp.
Далее напишем похожую процедуру для создания TLabel:

void __fastcall TForm1::NewLabel(AnsiString Name,AnsiString text, int top, int left)
//чтобы потом создать картинку, мы должны будем написать NewLabel("Имя компонента","надпись на label",отступ сверху,отступ слева);
{
TLabel *LL= new TLabel(this);
//создаём TLabel
LL->Parent=Panel1;
LL->Name=Name;
LL->Top=top;
LL->Left=left;
LL->Caption=text;//
присваиваем надпись , указанную в нашей функции
LL->OnMouseEnter=SuperClick;
//при наведении курсора на Label выпоняется функция SuperClick
LL->OnMouseLeave=SuperClick;
//при покидании курсора с Label выпоняется функция SuperClick
}


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

Создадим наконец-то эту забавную функцию SuperClick

void __fastcall TForm1::SuperClick(TObject *Sender)
{
TLabel* tmp1=dynamic_cast<TLabel*>(Sender);//
эта функция аналогична той, которую мы использовали в прошлом уроке, только она более предпочительней, ибо не возникает ошибок, если это действие будет выполняться не Labelом, а допусти Buttonом
if(tmp1!=NULL)
//если эту функцию вызвал TLabel, то выполняем следующие действия
{
if(tmp1->Font->Color==clRed){tmp1->Font->Color=clBlack;}//
если цвет Label красный, то делаем его чёрным
else{tmp1->Font->Color=clRed;}//
если цвет не красный , то делаем его красным
}
//////////////////////////////////////
//
Если объект, вызвавший функцию не
label, то выполняется следующий код
TImage* tmp2=dynamic_cast<TImage*>(Sender);
if(tmp2!=NULL)
{
if(tmp2->Width==100){tmp2->Width=400;tmp2->Height=320;}
//если ширина картинки равна 100, то мы увеличиваем картинку
else{tmp2->Width=100;tmp2->Height=80;}
//иначе мы возвращаем ей исходные размеры 100х80
}
//Если объект, вызвавший функцию не image, то более ничего не выполняется
}

Сейчас мы добавим последнюю пользовательскую функцию, которая удаляет все созданные нами компоненты с Panel1
void __fastcall TForm1::Delete(TWinControl *Win)//для удаления всех компонентов c панели потом введёте Delete(Panel1);
{
int x,y;//
создаём две переменные типа int
x=0;y=Win->ControlCount;
//переменной x присваиваем количество контролов(компонентов) в Win
//при помощи этого цикла удаляются все компоненты с Win
while(x<y)
{
delete Win->Controls[0];
//удаляем контрол(компонент)
x++;
}
}


Самое сложное позади.Теперь надо объявить все 4 функции в заголовочном файле unit1.h в секции __published: и подключить заголовочный файл jpeg.hpp, чтобы наша прога могла открывать не только bmp но и jpeg

#include <jpeg.hpp>

__published: // IDE-managed Components
void __fastcall NewImage(AnsiString Name,AnsiString FileName, int top, int left);
void __fastcall NewLabel(AnsiString Name,AnsiString text, int top, int left);
void __fastcall Delete(TWinControl *Win);
void __fastcall SuperClick(TObject *Sender);


вот что должно получиться



Ещё не устали?Теперь в событии кнопки Button1 onClick пишем:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
NewImage("Im1","f:\\test.jpg",30,10);
//создаём картинку с именем Im1, загружаем её из файла f:\test.jpg, ну а следующие две цифры = это отступы сверху и слева соответственно.
NewLabel("L1","superlabel",10,10);
//создаём надпись с именем L1 и текстом superlabel
}

обратите внимание!!! при создании компонентов таким способом, следите чтоб их имена отличались, иначе будет возникать ошибка.

Теперь в событии кнопки Button2 onClick пишем:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Delete(Panel1);
//запускаем функцию удаления всех компонентов с Panel1, если они конечно присутствуют.Также вы можете вставить эту функцию в самое начало обработчика событий onClick у Button1, тогда не будет возникать ошибки, если несколько раз подряд нажать на Button1
}

Всё - свершилось, теперь давите F9 и попробуйте нажать на первую кнопку.Далее понажимайте на появившуюся картинку и понаводите на Label.Круто, правда?Нажмите на вторую кнопку и всё с панели удалиться.
В следующем уроке я расскажу, как управлять любым компонентом на форме, зная его имя.

Если есть вопросы по этому материалу или вопросы в принципе, пишите на мыло, ответы постараюсь выложить в последующих уроках.


Author of article - MA F*CKA CREW 2006
www.builderhelper.3dn.ru
builder.helper@rambler.ru