Вопрос № 171393: Здравствуйте. Имею опыт программирования на Delphi, однако по необходимости пришлось перейти на язык Си. Выбрал компилятор C++ Builder 6 как наиболее похожий на Delphi. Мне показалось, что должна соблюдаться и аналогия кода. Но вот на днях столкнулся...
Вопрос № 171393:
Здравствуйте. Имею опыт программирования на Delphi, однако по необходимости пришлось перейти на язык Си. Выбрал компилятор C++ Builder 6 как наиболее похожий на Delphi. Мне показалось, что должна соблюдаться и аналогия кода. Но вот на днях столкнулся с задачей, решения которой не могу просто найти. Имеется: форма, на ней компонент TeeChart. В исходном состоянии в этом компоненте при удержании правой кнопки мыши происходит "скроллинг" содержимого (графика). Мне нужна была другая функциональность
левого щелчка мыши, поэтому я в обработчик OnClickSeries внес свой код. После этого я обнаружил, что при щелчке правой кнопки перестал работать дефолтовый "скроллинг" графика. Проблема возникла при попытке разделения кода для левой и правой кнопок. Я по фактическому параметру функции Button определяю тип кнопки, но вот вопрос: как мне вызвать прежний обработчик события? Попытка вызова метода TForm1::outGraphClickSeries приводит к рекурсии. Компонент TeeChart объя
влен
Код:
class TForm1 : public TForm { __published: // IDE-managed Components TChart *outGraph;
В Delphi до метода предка можно было добраться одной инструкцией inheited. Как поступить в данном случае на C++ Buider?
Попытка вызова типа TForm1::outGraphClickSeries(Sender, Series, ValueIndex, Button, Shift, X, Y); вызывает мой новый метод рекурсивно вплоть до переполнения стека
попытка вызова TForm::outGraphClickSeries(Sender, Series, ValueIndex, Button, Shift, X, Y); обречена на провал, ибо у класса TForm НЕТ такого метода.
Это тоже естественно, поскольку этот метод появился когда Вы добавили обработчик в классе TForm1. Зато у TChart есть свой обработчик OnClickSeries(). Я не специалист по Borland C++ Builder, но первое, что приходит на ум:
Код:
void __fastcall TForm1::outGraphClickSeries(TCustomChart
*Sender, TChartSeries *Series, int ValueIndex, TMouseButton Button, TShiftState Shift, int X, int Y) { outGraph->OnClickSeries(Sender, Series,ValueIndex,Button,Shift,X,Y); }
И если Вы посмотрите файл .dfm Вашей формы, то найдете там строку:
Код:
OnClickSeries = outGraphClickSeries
Это был первый способ.
Второй это создать свой компонент, класс-наследник от TChart и там перегрузить метод OnClickSeries(). Тогда Вы получите полный доступ ко всем public и protected элементам класса. И можно будет вызывать напрямую методы базового класса как: TChart::OnClickSeries(...); И потом уже разместить свой компонент на форме.
Ответ отправил: Micren, Бакалавр
Ответ отправлен: 17.08.2009, 03:51
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 253283
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.