Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122

Как вызвать событие объекта TListBox, когда его экземпляр является членом моего класса

07.07.2010, 16:11. Показов 1957. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Есть мной писанный класс, который ведет лог. Класс примерно такого вида:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class nLog
{
 private:
    AnsiString USER_NAME; //Имя авторизованного пользователя (для записи в текстовый лог)
    bool EnableTxtLoging; //true - если при инициализации файла не было ошибки
    AnsiString LogFile;//имя файла текущего лога, в который пишется текст
    TListBox *LIST;//сюда копируем ListBox с формы
    FILE* fLog;//файл лога
    SYSTEMTIME sTime;//время для заголовка текстового лога
    AnsiString msg;//сообщение, которое будем записывать в лог
 
    void __fastcall WriteToList(String Message);//записывает сообщение лога в TListBox
    void __fastcall WriteLogTxt();//записывает сообщение лога в текстовый файл
 
 protected:
 public:
    __fastcall nLog(TListBox *LogList, int ID_U, AnsiString USER_N);
    __fastcall ~nLog();
 
    void __fastcall Add(AnsiString Message);//Вызывает функции WriteToList и WriteLogTxt
    void __fastcall Clear();//функция очищает только ListBox
};
Как видно, в конструкторе, я передаю в качестве параметра указатель на объект TListBox и присваиваю этот указатель внутреннему TListBox, с которым уже работаю внутри класса.

Итак, у меня вопрос. Могу ли я как-нибудь в этом моем классе обработать события этого TListBox-a, например OnClick. Т.е. событие происходит на форме, а обрабатываться должно не на форме, а в моем классе. Как это реализовать?

Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.07.2010, 16:11
Ответы с готовыми решениями:

Как создать событие или вызвать метод при нажатии на экземпляр объекта (Button)?
List<Button> but = new List<Button>(); private void button1_Click(object sender, EventArgs e) { Button p...

Как сделать членом класса экземпляр этого же класса
class Operation { public: bool type; //true = operation, false = number char Operator; Operation L_Op; Operation R_Op; ...

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one class two class main... Нужно...

4
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
07.07.2010, 16:50
Цитата Сообщение от davian Посмотреть сообщение
Могу ли я как-нибудь в этом моем классе обработать события этого TListBox-a, например OnClick. Т.е. событие происходит на форме, а обрабатываться должно не на форме, а в моем классе.
Давайте уточним момент. Что вы хотели этим сказать? Что значит "обрабатываться в классе"?
Насколько я понял, вы хотите присвоить объeкту класса TListBox (находящемуся на TForm) событие, которое описано внутри вашего класса?

Тогда это можно сделать так.
Для примера, расположите на форме один TListBox.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//---------------------------------------------------------------------------
class TLog
{
  private:
    TListBox *LogListBox;
    TForm *LogForm;
    int ClicksCount;
  public:
    __fastcall TLog(TListBox *LstBoxSrc, TForm *FormSrc);
    void __fastcall LogListBoxClick(TObject *Sender);
} *Log;
//---------------------------------------------------------------------------
__fastcall TLog::TLog(TListBox *LstBoxSrc, TForm *FormSrc)
{
  LogListBox = LstBoxSrc;
  LogForm = FormSrc;
  LogListBox->Items->Add("Application was started at: " + Time().CurrentTime());
}
//---------------------------------------------------------------------------
void __fastcall TLog::LogListBoxClick(TObject *Sender)
{
  LogListBox->Items->Add("Was Clicked at: " + Time().CurrentTime());
  LogForm->Canvas->TextOut(10,10,"ListBox was Clicked " + IntToStr(ClicksCount++) + " times.");
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  Log = new TLog(ListBox1,this);
  ListBox1->OnClick = Log->LogListBoxClick;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  delete Log;
  Log = NULL;
}
//---------------------------------------------------------------------------
Тем самым, я назначил объекту ListBox1 событие, которое описал внутри класса TLog.
Соответственно, при клике на ListBox1 будет указано время клика (внутри контрола) и общее количество кликов будет указано на форме.
1
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
07.07.2010, 23:34  [ТС]
Вы меня немного не поняли...

Цитата Сообщение от MikeSoft Посмотреть сообщение
C++
1
ListBox1->OnClick = Log->LogListBoxClick;
Таким образом мы обрабатываем OnClick на форме, просто сам обработчик события описываем в другом месте. Мне же нужно не так.

Я хотел бы обработать событие которое возникает для LogListBox (в вашем примере), т.е. оно возникнет для ListBox1, а поскольку в конструкторе класса TLog, вы присвоили указателю LogListBox, указатель ListBox1, то событие, которое возникает для ListBox1, должно возникнуть и для LogListBox, вопрос лишь в том, как его обработать внутри класса TLog. Это вообще возможно?

Я понимаю, что немного запутанно это все. Если не понятен вопрос переспросите, плиз...
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
07.07.2010, 23:47
davian, для этого нужно присвоить два события одному контролу - а это невозможно.
Но возможно вызвать одно действие в другом.

То есть, у вас есть стандартный обработчик OnClick для ListBox:
C++
1
2
3
4
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
  ShowMessage("Clicked");
}
А в обработчике, находящемся внутри класса вы должны его вызвать:
C++
1
2
3
4
5
6
void __fastcall TLog::LogListBoxClick(TObject *Sender)
{
  LogListBox->Items->Add("Was Clicked at: " + Time().CurrentTime());
  LogForm->Canvas->TextOut(10,10,"ListBox was Clicked " + IntToStr(ClicksCount++) + " times.");
  Form1->ListBox1Click(Sender);
}
Тогда произойдут оба события.
Если это не ответ на ваш вопрос - тогда я хочу услышать формулировку задачи. Для чего вы это делаете? Может получится предложить вам другой метод...
0
 Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122
08.07.2010, 09:35  [ТС]
Цитата Сообщение от MikeSoft Посмотреть сообщение
хочу услышать формулировку задачи. Для чего вы это делаете? Может получится предложить вам другой метод...
Делается это для того, чтобы у меня все работало модульно. Я хочу четко разграничить. Если у меня в классе используется ListBox, то все что его касается я хочу обрабатывать в этом классе.

Класс лог я привел для примера. На самом деле у меня другая задача. У меня есть набор классов, которые работают с объектом TImage. Классы типа линейка, улог, площадь, расстояние. Эти объекты надо рисовать на этом TImage. Во всех этих классах нужно обрабатывать события этого самого TImage. Получается большая путанница. Я бы хотел в каждый из классов передавать ссылку на 1 единственный объект TImage, и обрабатывать все эти события в каждом классе соответственно, потому что иначе получается большая путанница в коде...
Что называется нужно, чтобы были мухи отдельно, котлеты отдельно

Добавлено через 13 минут
Ну, в общем, сделал я уже то, что хотел. Примерно так получилось:

C++
1
2
3
4
5
6
7
__fastcall nLog::nLog(TListBox *LogList)
{
    //устанавливаем переданные параметры:
    LIST = LogList;
    LIST->OnClick = CLICK;
...
}
...
C++
1
2
3
4
5
void __fastcall nLog::CLICK(TObject *Sender)
{
    Application->MessageBox(Sender->ClassName().w_str(),L"",0);
 
}
... т.е. я обрабатываю событие внутреннего для класса ListBox, именно в этом классе. Работает... проверял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2010, 09:35
Помогаю со студенческими работами здесь

Как вызвать событие объекта в процедуре?
У меня программа большая, всё не буду описывать, но смысл такой: у меня есть две кнопки Button1, Button2. В методе OnClick второй кнопки...

Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два
Здравствуйте. Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию из другого объекта\класса, в турбо...

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли в...

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли...

Как задать размер массива, который является членом класса, через конструктор?
Почему так? И как же тогда задать размер этого массива? class Test { public: Test(int size) : arrSize(size){}; private: ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Загрузка 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