Аватар для davian
4 / 4 / 2
Регистрация: 07.07.2009
Сообщений: 122

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

07.07.2010, 16:11. Показов 1927. Ответов 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
3956 / 1811 / 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
3956 / 1811 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru