Консультация № 110195
19.11.2007, 21:37
0.00 руб.
0 2 2
Вопрос по C++ Builder:

TImage *Im[32];
for(i=0;i<32;i++)
{
Im[i]=new TImage(Panel4);
Im[i]->Parent=Panel4;
Im[i]->Top=h;
Im[i]->Left=w;
Im[i]->Picture->LoadFromFile("2.gif");
if (w==468){ w=48; h=h+60; }
else w=w+60;
}

Каким образом отслеживать функцию OnClick для каждой картинки этого массива Im[i]?

Обсуждение

Неизвестный
19.11.2007, 23:08
общий
это ответ
Здравствуйте, RussianGM!
OnClick - это (если проще говорить) указатель на ф-ю (функтор), которая будет вызвана в случае события OnClick.
Этот функтор наследуется в TImage, как и во многих других компонентах C++Builder.
Проще всего (хотя не лучшее) определить эту ф-ю для какого - либо объекта через инспектор объектов.
Например через указатель на объект Form1 (тип объекта не имеет значения) в инспекторе объекта во вкладке events щёлкнем дважды на строке OnClick - получим в редакторе нечто такое (см. приложение).
Далее не забыть удалить ссылку у объекта Form1 на это событие, стерев его в инспекторе объектов и
осталось только в коде присвоить указатель на эту ф-ю картинкам :

TImage *Im[32];
for(i=0;i<32;i++)
{
Im[i]=new TImage(Panel4);
Im[i]->Parent=Panel4;
// добаленный код
Im[i]->OnClick=Form1Click;
//
Im[i]->Top=h;
Im[i]->Left=w;
Im[i]->Picture->LoadFromFile("2.gif");
if (w==468){ w=48; h=h+60; }
else w=w+60;
}


Приложение:
void TForm1::Form1Click (TObject *Sender) {// Далее получаем указатель на картинку, например такTImage *img=dynamic_cast<TImage*>(Sender);if (!img) return;//если к примеру картинки были поименованы - то можно далее сделать такif (img->Name=="Image1") {// какие-то действия}if (img->Name=="Image2") {...}}
Неизвестный
20.11.2007, 00:07
общий
это ответ
Здравствуйте, RussianGM!

Ну для начала опишем обработчик нашего события.. Допустим он будет выдавать значения поля Tag нашего TImage:

void __fastcall itemClick(void* This, TObject *Sender)
{
ShowMessage("Tag = " + IntToStr(((TImage*)Sender)->Tag));
}

Указатель This будет принимать адрес экзепляра класса, вызвавшего событие, указатель Sender будет содержать адрес объекта, в котором было сгенерировано событие (так мы и будет отличать их).
Далее нам потребуется у вновь созданных объектов связать нужное событие и вышенаписанный нами обработчик (например так):
TImage *Im[5];

int Left = 0;
for(int i=0;i<5;i++)
{
Im[i]=new TImage(Form1);
Im[i]->Parent=Form1;

TMethod event; /Описываем метод ...
event.Data = this;
event.Code = itemClick;

Im[i]->OnClick = *(TNotifyEvent*)&event; //присваиваем нашему событию
Im[i]->Left = Left;
Im[i]->Picture->LoadFromFile("2.jpg");
Im[i]->Tag = Left;

Left += 50;

}

----
Это случай, если обработчик события не является методом класса...

2 вариант:
Unit1.h:

class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall itemClick(TObject *Sender); //метод-обработчик события
};
Unit1.cpp:

//Наш обработчик (this уже не присутствует, т.к. он передается неявно):
void __fastcall TForm1::itemClick(TObject *Sender)
{
ShowMessage("Tag = " + IntToStr(((TImage*)Sender)->Tag));
}

Ну и собственно наш код:

TImage *Im[5];

int Left = 0;
for(int i=0;i<5;i++)
{
Im[i]=new TImage(Form1);
Im[i]->Parent=Form1;

Im[i]->OnClick = itemClick;
Im[i]->Left = Left;
Im[i]->Picture->LoadFromFile("2.jpg");
Im[i]->Tag = Left;

Left += 50;

}
}
Форма ответа