Передача обработчика события в функцию
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, но как там путь прописать?)
Ps: Если не сложно к стате можно пример как на SpeedButton картинку загрузить, создавая его динамически(Как я понимаю там надо создать TBitmap, но как туда загрузить картинку. Через LoadFromFile, но как там путь прописать?)
Это из разряда - открыл все буквы, не смог угадать слово. Я напоминаю - использование поиска по форуму является ОБЯЗАТЕЛЬНЫМ. Примеров КАК загрузить картинку в куда либо - более чем достаточно. Если вам просто надо загрузить ее с диска - достаточно использовать такой код:
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;
}
}
под свой код доработаете.
Содержание ошибки:
[C++ Error] ControlCard.h(324): E2034 Cannot convert 'void (_fastcall ControlCardClass::*)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'
Не как не могу разобраться, может надо как то использовать TNotifyEvent, но как не пойму.
Во первых вы не верно передаете указатель на фукцию, на это и ругается компилятор.
Во вторых - зачем вам вообще передавать указатель на функцию-член класса в функцию-член класса?
Используйте:
Но вот как раз в этой загрузке не работает,вот примерно что нужно:
{
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 функцию по созданию чем писать гигантский код по создаю каждой кнопки, который в принципе одинаков отличается тока кнопкой и функцией и панелью на которой она расположена.
Попрошу если можно конечно показать как правильно передать указатель на функцию?
Выдаётся ошибка невозможно открыть файл.
По человечески почему нельзя указывать в String имя файла и путь.
Я повторю вам еще раз - потому что вместо того, что бы подумать и полуркать форум, вы сломя голову размещаете сообщения.
Если вы уж так по индусски делаете, то экранируйте обратные слеши и будет вам счастье.
К стате функцию мне надо передать, так как мне надо создать 6-7 кнопок с разными функциями и считаю что лучше сделать 1 функцию по созданию чем писать гигантский код по создаю каждой кнопки, который в принципе одинаков отличается тока кнопкой и функцией и панелью на которой она расположена.
Попрошу если можно конечно показать как правильно передать указатель на функцию?
Можно конечно.
В вашем случае объявление функции должно быть примерно таким
<...>
}
Соотвественно вызов функции:
Использование квалификатора имени класса необходимо только в случае статических функций.
Про слеши сам догадался, правда не стоило это того, несколько часов потратил а толку то.
Постараюсь бессмысленных сообщений не писать впредь.
Да и огромная просьба, в последний раз, дайте кто нибудь ссылку на то как сохранить объект в файле!!! )))
А я в последний раз предупреждаю - поиск, например тут. На форуме тоже и о ней вспоминали и собственное писали.
Вот описание функции:
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->onClick=OnCard;
}
Почему вот так работает
А вот так не работает (не находит картинку)
:confused:
PS: Создал маленькую программку по открытию картинки, там всё работает отлично, но в моей этой проге не работает, не как не пойму почему? :(
Path = ExtractFilePath(Application->ExeName);
Интересно правда а почему [COLOR="Red"]GetCurrentDir()[/COLOR] не работал?
И что бы не попадать в подобные глупые ситуации в программе необходимо вместо GetCurrentDir() строить путь к папкам на основе:
1. Пути к папке откуда запущена программа
2. Использования так называемых переменных окружения
3. Создания своих переменных окружения (сохраняя их в реестре либо в файле настроек)
Возник вопрос по поводу передачи указателя на функцию.
Если функция которую мы передаём не является членом класса функции вкоторую мы её передаём?
Как тогда передать её?