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

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

07.07.2010, 16:11. Показов 1982. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru