Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача обработчика события в функцию

36K
28 марта 2010 года
Overmax2
63 / / 11.02.2010
Сдрасти всем, помогите разобраться :

Код:
class ControlCardClass{
 private:
 ........................................................................
 void addSpeedBtn(TsPanel *Panel, void (__fastcall ControlCardClass::*OnCard)(TObject*),String FileName,String Name,int x,int y);
 ........................................................................
 public:
 ........................................................................
 void __fastcall ControlCardX(TObject *Sender);
 ........................................................................
}

//Вызов функции :
addSpeedBtn(Panel,&ControlCardClass::ControlCardX,"","AnlsX",10,1);

void ControlCardClass::addSpeedBtn(TsPanel *Panel,void (__fastcall ControlCardClass::*OnCard)(TObject*),String FileName,String Name,int x,int y)
{
 TsSpeedButton *Button=new TsSpeedButton(Panel);
 Button->Name=Name;
 Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
 Button->Glyph->Assign(Bitmap);
 Button->Parent=Panel;
 Button->Glyph->Assign(Bitmap);
 Button->Left=x;
 Button->Top=y;
 Button->onClick=OnCard; // Здесь выводится ошибка
}


Содержание ошибки:
[C++ Error] ControlCard.h(324): E2034 Cannot convert 'void (_fastcall ControlCardClass::*)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'

Не как не могу разобраться, может надо как то использовать TNotifyEvent, но как не пойму.

Ps: Если не сложно к стате можно пример как на SpeedButton картинку загрузить, создавая его динамически(Как я понимаю там надо создать TBitmap, но как туда загрузить картинку. Через LoadFromFile, но как там путь прописать?)
1
28 марта 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Overmax2

Ps: Если не сложно к стате можно пример как на SpeedButton картинку загрузить, создавая его динамически(Как я понимаю там надо создать TBitmap, но как туда загрузить картинку. Через LoadFromFile, но как там путь прописать?)


Это из разряда - открыл все буквы, не смог угадать слово. Я напоминаю - использование поиска по форуму является ОБЯЗАТЕЛЬНЫМ. Примеров КАК загрузить картинку в куда либо - более чем достаточно. Если вам просто надо загрузить ее с диска - достаточно использовать такой код:

Код:
#include <ExtDlgs.hpp>
void __fastcall TfmMain::sbTestClick(TObject *Sender)
{
TSpeedButton *tmp = static_cast<TSpeedButton*>(Sender);
TOpenPictureDialog* op = new TOpenPictureDialog(this);
try{
  try{
   if(!op->Execute()){return;}
   tmp->Glyph->LoadFromFile(op->FileName);
  }
  catch(...){
   ShowMessage("Upppsss! excuse me");
  }
 }
 __finally{
  delete op;
 }
}

под свой код доработаете.

Цитата: Overmax2

 
Код:
Button->&#111;&#110;Click=OnCard; // Здесь выводится ошибка


Содержание ошибки:
[C++ Error] ControlCard.h(324): E2034 Cannot convert 'void (_fastcall ControlCardClass::*)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'

Не как не могу разобраться, может надо как то использовать TNotifyEvent, но как не пойму.


Во первых вы не верно передаете указатель на фукцию, на это и ругается компилятор.
Во вторых - зачем вам вообще передавать указатель на функцию-член класса в функцию-член класса?
Используйте:

 
Код:
Button->&#111;&#110;Click= &OnCard;
1
28 марта 2010 года
kot_
7.3K / / 20.01.2000
точнее:
 
Код:
Button->&#111;&#110;Click= &ControlCardX;
36K
28 марта 2010 года
Overmax2
63 / / 11.02.2010
kot_ спасибо конечно,но я не задаю на форуме вопросов заранее не поискав.
Но вот как раз в этой загрузке не работает,вот примерно что нужно:

Код:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
TSpeedButton *tmp = static_cast<TSpeedButton*>(Sender);
try{
  try{
   tmp->Glyph->LoadFromFile("C:\Program Files\Borland\CBuilder6\Projects\Diplom Visual\Sys\Dossier.bmp");
  }
  catch(...){
   ShowMessage("Upppsss! excuse me");
  }
 }
 __finally{
  delete op;
 }
}

Выдаётся ошибка невозможно открыть файл.
По человечески почему нельзя указывать в String имя файла и путь.

К стате функцию мне надо передать, так как мне надо создать 6-7 кнопок с разными функциями и считаю что лучше сделать 1 функцию по созданию чем писать гигантский код по создаю каждой кнопки, который в принципе одинаков отличается тока кнопкой и функцией и панелью на которой она расположена.

Попрошу если можно конечно показать как правильно передать указатель на функцию?
1
29 марта 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Overmax2

Выдаётся ошибка невозможно открыть файл.
По человечески почему нельзя указывать в String имя файла и путь.


Я повторю вам еще раз - потому что вместо того, что бы подумать и полуркать форум, вы сломя голову размещаете сообщения.
Если вы уж так по индусски делаете, то экранируйте обратные слеши и будет вам счастье.

Цитата: Overmax2

К стате функцию мне надо передать, так как мне надо создать 6-7 кнопок с разными функциями и считаю что лучше сделать 1 функцию по созданию чем писать гигантский код по создаю каждой кнопки, который в принципе одинаков отличается тока кнопкой и функцией и панелью на которой она расположена.

Попрошу если можно конечно показать как правильно передать указатель на функцию?


Можно конечно.
В вашем случае объявление функции должно быть примерно таким

 
Код:
void ControlCardClass::addSpeedBtn(TsPanel *Panel,void __fastcall (__closure *OnCard)(TObject*),String FileName,String Name,int x,int y){
<...>
}

Соотвественно вызов функции:
 
Код:
addSpeedBtn(Panel,&ControlCardX,"","AnlsX",10,1);

Использование квалификатора имени класса необходимо только в случае статических функций.
1
29 марта 2010 года
kot_
7.3K / / 20.01.2000
и кстати, если вы убираете выделение памяти под объект, не забывайте убирать и удаление памяти (это я о своем коде).
36K
29 марта 2010 года
Overmax2
63 / / 11.02.2010
Огромное спасибо !!!

Про слеши сам догадался, правда не стоило это того, несколько часов потратил а толку то.
Постараюсь бессмысленных сообщений не писать впредь.
Да и огромная просьба, в последний раз, дайте кто нибудь ссылку на то как сохранить объект в файле!!! )))
1
29 марта 2010 года
kot_
7.3K / / 20.01.2000
В последний раз - это типа угроза штоли? :) Типа в последний раз спрашиваю?
А я в последний раз предупреждаю - поиск, например тут. На форуме тоже и о ней вспоминали и собственное писали.
36K
29 марта 2010 года
Overmax2
63 / / 11.02.2010
Нет не угроза, просто просьба, а то спать не могу :D
36K
30 марта 2010 года
Overmax2
63 / / 11.02.2010
Народ интересный вопрос:
Вот описание функции:
 
Код:
void ControlCardClass::addSpeedBtn(TsPanel *Panel,void __fastcall ( __closure *OnCard)(TObject*),String FileName,String Name,int x,int y){
 TsSpeedButton *Button=new TsSpeedButton(Panel);
 Button->Name=Name;
 try{Button->Glyph->LoadFromFile(FileName);}
     catch(...){ShowMessage("Невозможно загрузить файл: \n"+FileName);}
 Button->Parent=Panel;
 Button->Left=x;
 Button->Top=y;
 Button->&#111;&#110;Click=OnCard;
}


Почему вот так работает
 
Код:
addSpeedBtn(Panel2,&ControlCardShareP,"C:\\Program Files\\Borland\\CBuilder6\\Projects\\Diplom Visual\\Sys\\p.bmp","AnlsShareP",10,1);


А вот так не работает (не находит картинку)
 
Код:
addSpeedBtn(Panel2,&ControlCardShareP,GetCurrentDir()+"\\Sys\\p.bmp","AnlsShareP",10,1);


:confused:

PS: Создал маленькую программку по открытию картинки, там всё работает отлично, но в моей этой проге не работает, не как не пойму почему? :(
36K
30 марта 2010 года
Overmax2
63 / / 11.02.2010
Всё проблему решил, кому интересно то вот этим:
 
Код:
AnsiString Path;
 Path = ExtractFilePath(Application->ExeName);


Интересно правда а почему [COLOR="Red"]GetCurrentDir()[/COLOR] не работал?
1
30 марта 2010 года
kot_
7.3K / / 20.01.2000
Для этих случаев програмизду и нужОн отладчик. В частности, что бы посмотреть - а что возвращает [COLOR="Red"]GetCurrentDir()[/COLOR]? И не мешает помнить - эта функция возвращает текущую [COLOR="Red"]выбранную[/COLOR] директорию.
И что бы не попадать в подобные глупые ситуации в программе необходимо вместо GetCurrentDir() строить путь к папкам на основе:
1. Пути к папке откуда запущена программа
2. Использования так называемых переменных окружения
3. Создания своих переменных окружения (сохраняя их в реестре либо в файле настроек)
36K
19 апреля 2010 года
Overmax2
63 / / 11.02.2010
Извиняюсь народ.
Возник вопрос по поводу передачи указателя на функцию.

Если функция которую мы передаём не является членом класса функции вкоторую мы её передаём?
Как тогда передать её?
1
20 апреля 2010 года
kot_
7.3K / / 20.01.2000
Если вы хотите использовать указатель как обработчик события и функция вообще не является членом никакого класса - то вероятно никак. Хотя надо пробовать. Это связано с типом обработчиков событий.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог