Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Обработка событий динамически созданного элемента


Автор: camtasia 25.5.2010, 10:27
Здравствуйте!!!
Динамически создаю вкладку tabControl, на неё помещаю динамически созданный компонент webBrowser: 
Код

 int i_key;
 i_key = time(NULL);
 String^ S = i_key.ToString();
 S = S->Substring(5);
 TabPage^ i_tabPage;
 i_tabPage = gcnew TabPage;
 i_tabPage->Name = "tabPage" + S;
 i_tabPage->Text = "tabPage" + S;
 tabControl1->TabPages->Add(i_tabPage);
 WebBrowser^ i_webBrowser;
 i_webBrowser = gcnew WebBrowser;
 i_webBrowser->Name = "webBrowser" + S;
 i_tabPage->Controls->Add(i_webBrowser);
 i_webBrowser->Dock = DockStyle::Fill;
 i_webBrowser->Navigate("www.yandex.ru");

как мне создать обработчик событие для компонента webBrowser (допустим DocumentCompleted)?

я так понимаю нужно написать функция, что-то на подобии этого
Код

 void f_DocCompletedWB(System::Object^  sender);
{
        // код обработчика
}


но что в реализации писать не пойму  smile , как обратиться к компоненту?

при работе с webbrowser созданным в конструкторе использую следующий код: 
Код

private: System::Void webBrowser1_DocumentCompleted(System::Object^  sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs^  e) 
 {
     this->Text = webBrowser1->DocumentTitle + " - Браузер";
     toolStripTextBox1->Text = webBrowser1->Url->ToString();
     tabPage2->Text = webBrowser1->DocumentTitle;
     String^ SF = "http://" + webBrowser1->Url->Host->ToString() + "/favicon.ico";
     IntPtr SF1 = Marshal::StringToHGlobalAnsi(SF);
     LPCSTR SourceFile = (LPCSTR)SF1.ToPointer();
     LPCSTR DestFile = "c:\\favicon.ico";
     URLDownloadToFileA(NULL, SourceFile, DestFile, 0, NULL);
     imageList2->Images->Clear();
     imageList2->Images->Add(Image::FromFile("c:\\favicon.ico"));
     tabPage2->ImageIndex = 0;
 {

Пожалуйста помогите перенести этот код в обработчик динамически созданного элемента. Буду очень благодарен.

Автор: xvr 25.5.2010, 10:52
Цитата(camtasia @  25.5.2010,  10:27 Найти цитируемый пост)
как обратиться к компоненту
Параметр sender это и есть твой компонент. Либо явно сохранять указатель на созданный компонент где то в классе.


Автор: camtasia 25.5.2010, 17:07
Реализацию я кое-как написал
Код

void f_DocCompletedWB(System::Object^  sender)
{
    this->Text = ((WebBrowser^)sender)->DocumentTitle + " - Браузер";
    toolStripTextBox1->Text = ((WebBrowser^)sender)->Url->ToString();
    tabPage2->Text = ((WebBrowser^)sender)->DocumentTitle;
    String^ SF = "http://" + ((WebBrowser^)sender)->Url->Host->ToString() + "/favicon.ico";
    IntPtr SF1 = Marshal::StringToHGlobalAnsi(SF);
    LPCSTR SourceFile = (LPCSTR)SF1.ToPointer();
    LPCSTR DestFile = "c:\\favicon.ico";
    URLDownloadToFileA(NULL, SourceFile, DestFile, 0, NULL);
    imageList2->Images->Clear();
    imageList2->Images->Add(Image::FromFile("c:\\favicon.ico"));

    tabPage2->ImageIndex = 0;
}

но как теперь мне прикрутить его к компоненту?
Код

 WebBrowser^ i_webBrowser;
 i_webBrowser = gcnew WebBrowser;
 i_webBrowser->Name = "webBrowser" + S;
 i_tabPage->Controls->Add(i_webBrowser);
 i_webBrowser->Dock = DockStyle::Fill;
 i_webBrowser->Navigate("www.yandex.ru");
 i_webBrowser->DocumentCompleted = f_DocCompletedWB(?????); // что здесь то писать не пойму

Автор: xvr 25.5.2010, 17:13
Цитата(camtasia @  25.5.2010,  17:07 Найти цитируемый пост)

но как теперь мне прикрутить его к компоненту?
Ну как то так
Код

     i_webBrowser->DocumentCompleted += gcnew System::EventHandler(this, &Form1::f_DocCompletedWB);


Автор: camtasia 25.5.2010, 17:32
Выскакивает ошибка 
Код

error C3352: void Браузер::Form1::f_DocCompletedWB(System::Object ^): указанная функция не соответствует типу делегата 
"void (System::Object ^,System::EventArgs ^)"

Что делать?

Автор: camtasia 25.5.2010, 18:57
Все работает!!!!  smile Спасибо большое!
только пришлось немного изменить:
Код

i_webBrowser->DocumentCompleted += gcnew System::Windows::Forms::WebBrowserDocumentCompletedEventHandler(this, &Form1::f_DocCompletedWB);

и так:
Код

void f_DocCompletedWB(System::Object^  sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs^  e)


еще один вопрос (немного не в тему):
я хочу поместить все функции в отдельный файл FuncBrowser.cpp, добавляю его в проект, вставляю в него обработчики, создаю и добавляю в проект файл FuncBrowser.h, добавляю в него 
Код

void f_DocCompletedWB(System::Object^  sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs^  e);

в файле Form1.h пишу
Код

#include "FuncBrowser.h"


но высыпает целая куча ошибок, что я делаю не привильно?

Автор: xvr 25.5.2010, 20:31
Цитата(camtasia @  25.5.2010,  18:57 Найти цитируемый пост)
но высыпает целая куча ошибок, что я делаю не привильно? 
Без кода сказать трудно. Скорее всего неправильно объявили метод в классе


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)