Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 5

TStringGrid: OnDrawCell передача метода

25.04.2015, 22:52. Показов 1875. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Столкнулся с проблемой передачи статического метода кастомно созданного класса событию программно созданного StringGrid'а OnDrawCell. Вот собственно код:

C
1
Report :: ReportBoard->OnDrawCell = reinterpret_cast<TDrawCellEvent&>( Report :: OnDrawCell );
Таким образом он проходит без ошибок, но при выполнении возникает ошибка доступа данных.
При прямом присвоении
C
1
Report :: ReportBoard->OnDrawCell = Report :: OnDrawCell;
Возникает ошибка компиляции:
[BCC32 Error] E2034 Cannot convert 'void(TObject *,int,int,TRect &,TGridDrawState)' to 'TDrawCellEvent'
Сам метод записан в классе следующим образом:
C
1
static void __fastcall OnDrawCell( TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State );
TDrawCellEvent имеет следующую спецификацию:
C++
1
typedef void __fastcall (__closure *TDrawCellEvent)(System::TObject* Sender, int ACol, int ARow, const Types::TRect &Rect, TGridDrawState State);
Ранее у меня не возникало подобных проблем в присвоении кнопочных событий (OnClick, OnMouseLeave и так далее).

Добавлено через 16 минут
Проблема исчерпана следующим моментом:
C++
1
2
3
4
TMethod Method;
Method.Data = NULL;
Method.Code = OnDrawCell;
Report :: ReportBoard->OnDrawCell = *(TDrawCellEvent*)&Method;
По-видимому
C++
1
__closure
требует другого обращения с присвоением методов класса. Поправьте, если не так
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.04.2015, 22:52
Ответы с готовыми решениями:

Передача TStringGrid в функцию
Добрый день. Вот, пусть, для примера: void SGtest (TStringGrid *SG) { SG-&gt;FixedRows=2; } Тут всё работает. Но пытаюсь...

Передача объекта типа TStringGrid в функцию в Embarcadero C++
Здравствуйте. Недавно начал изучать embarcadero c++ builder и столкнулся с проблемой: при передаче объекта типа TStringGrid в функцию...

Передача метода в метод, метода как параметр
Здравствуйте друзья. Есть значит некоторый фрейм: public class Window extends JFrame implements ActionListener { ... (1) ......

11
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.04.2015, 23:01
Точно исчерпана? Так-то это перевод статик-метода в не-статик. Что выглядит крайне сомнительно.
0
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 5
25.04.2015, 23:07  [ТС]
Вызывается, но некоторые параметры передаются некорректно, ACol - цифры несметной значимости)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.04.2015, 23:28
А что хотел то? На кой тебе статик метод сдался? Прдон но сама задумка неадкватная.
0
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 5
25.04.2015, 23:37  [ТС]
У меня есть модуль формирования отчетов. Есть класс, где каждый объект - одна запись отчета. Не буду же я тащить за собой этот метод для каждого сформированного отчета. С другой стороны хотелось бы кластеризовать все что его касается в одну общностью обусловленную плеяду
0
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 5
26.04.2015, 01:23  [ТС]
Решил проблему небольшой ассемблерной вставкой=) Теперь все исчерпано^_^
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.04.2015, 01:33
Круто.
Делись, было бы любопытно посмотреть.
0
0 / 0 / 0
Регистрация: 23.04.2015
Сообщений: 5
26.04.2015, 02:08  [ТС]
Нашел ошибку в предыдущем способе)
Не хватило одного аргумента в статическом методе класса - void*, в который явным образом он посылает собственно указатель на объект, вызывающий событие. После его добавления все встало на свои места=)
P.S: Собственно эту особенность я заметил исходя уже из написанного ассемблерного фргамента, я просто смещал аргументы функции на void позицию и получал нужный мне результат, только потом посмотрев стек вызовов я обнаружил этот мне неведомый аргумент)
Все-таки преобразования типов - зло=)
0
26.04.2015, 10:20

Не по теме:

Цитата Сообщение от BRcr Посмотреть сообщение
Делись, было бы любопытно посмотреть.
Ну или тупо по ржать ))

0
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 70
08.01.2026, 13:04
Тема древняя, но у меня таже проблема, может кто подскажет решение?
C++
1
2
3
4
5
6
7
TMethod Method;                                                       
Method.Data = Grid;                                                  
Method.Code = DrawCell;                                            
Grid->OnDrawCell = *(TDrawCellEvent*)&Method;
 
void __fastcall DrawCell(TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State) {
}
Все параметры в норме, кроме ACol, выдает большое значение как будто Хэндл.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
08.01.2026, 15:44
Насколько мне помнится, должен быть ещё один параметр у функции. Как-то вот так:

C++
1
2
void __fastcall DrawCell(TObject *self, TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State) {
}
1
0 / 0 / 0
Регистрация: 18.03.2014
Сообщений: 70
08.01.2026, 15:59
Цитата Сообщение от volvo Посмотреть сообщение
Насколько мне помнится, должен быть ещё один параметр у функции. Как-то вот так:
C++Скопировано
1
2
void __fastcall DrawCell(TObject *self, TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State) {
}
Работает!!! Бился над этим с прошлого года. Спасибо огромноеее!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2026, 15:59
Помогаю со студенческими работами здесь

Передача метода класса в качестве параметра для метода другого класса
Здравствуйте, Передо мной стоит такая задача. Необходимо разработать механизм, который бы мог прервать любую функцию, при этом абсолютна...

Событие OnDrawCell
Доброго времени суток ! Помогите мне вызвать событие OnDrawCell компонента StringGrid. В общем должно выйти так: procedure...

Не вызывается OnDrawCell в StringGrid
Всем Доброго Времени Суток! В начале проекта я написал обработчик события OnDrawCell и он работал. Потом я решил его закомментить, что бы...

Динамическое событие onDrawCell у StringGrid
Я создал динамический StringGrid. Теперь хочу ему сделать событие OnDrawCell. Функцию с нужными параметрами создал, но при компиляции...

Передача значения из метода
Здравствуйте! Подскажите, пожалуйста, как передать значение i значению к: private void Form1_Load(object sender, EventArgs e) {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru