Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 25

Событие от объекта в классе

15.02.2014, 18:56. Показов 1014. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Сейчас коротко попробую обрисовать проблему.
У меня есть компонент для работы с com портами, невидимый, кидается на форму, также позволяет обрабатывать события.
Компонент нормальный, сейчас я пытаюсь расширить его функциональность и улучшить интерес, вписав потом во фреймворк наш.
Я создал отдельный юнит, в нем класс, в этом классе создается также автоматом экземпляр компонента. Все в принципе работает.
Теперь в программе я просто создаю объект этого класса и общаюсь с ним.
Значит когда этот компонент что то получил, то я просто к нему с помощью функции обращаюсь и забираю данные. Это не очень удобно. У компонента есть события при получении сообщения с порта.
Вопрос, могу ли я сделать так, чтобы созданный объект сам следил за получением через событие компонента и давал мне знатью когда что то пришло. Что то типа слот сигнальной системы qt.
Зарание спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2014, 18:56
Ответы с готовыми решениями:

Класс: Как обработать событие последнего объекта в форме, не создавая в классе объекта промежуточное событие?
Итак! Проблема состоит в следующем! Имеется класс в который входит объект второго класса. В последнем классе имеется событие. Как правильно...

Вызвать событие в другом классе
Добрый день. Есть класс MainWindow, в нём есть функция AddPreloadedCharts(). Есть статический класс DataManager, в котором хранятся...

Сделать событие изменения переменной в классе
в классе есть переменные в области паблик. Надо сделать так что при изменении переменной ,выполнялось какое то событие. Ну...

8
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
15.02.2014, 19:52
Так вызывай обработчик по нужному событию (если он назначен), как это делает большинство компонентов.
0
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 25
15.02.2014, 20:03  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Так вызывай обработчик по нужному событию (если он назначен), как это делает большинство компонентов.
Не мог бы ты привести привести пример такого вызова на примере компонента TTimer, у него одно событие, он допустим находится в моем классе, как мне сделать:

1. активировать этот обработчик, что бы он например делал showmessage каждую минуту, в принципе что бы он отсчитывал время и что то делал по событию
2. как мне описать то, что он будет делать по событию, какие функции

Delphi
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
unit SerialNGUnit;
 
interface
 
uses SerialNG;
 
type
  TSerialNGClass = class(TObject)
  private
  PORT: TSerialPortNG;
 
  public
    procedure Sender(StrSend:string);
    procedure SetBasisSettings(CommPort:string; BaudRate,DataBits,ParityType,StopBits,FlowControl:integer);
    procedure Aktiv();
    procedure Deaktiv();
    function  GetBasisSettings(): string;
    function  Receiver(): string;
 
    destructor Destroy(); override;
    constructor Create();
end;
 
implementation
 
uses
  System.SysUtils;
PORT: TSerialPortNG и есть экземпляр компонента, который я добавил в свой класс,

Вот так выглядит один из обработчиков компонента, когда он на форму положен
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.SerialPortNGRxClusterEvent(Sender: TObject);
begin
  if TSerialPortNG(Sender).NextClusterSize >= 0 then // Data available?
    begin
      if TSerialPortNG(Sender).NextClusterCCError = 0 then // Error during receiveing?
        Terminal.Lines.Add(FormatDateTime('"Rec  '+TSerialPortNG(Sender).CommPort+'" dd.mm.yy hh:mm:ss" :"', Now))
      else
        Terminal.Lines.Add(FormatDateTime('"RecX '+TSerialPortNG(Sender).CommPort+'" dd.mm.yy hh:mm:ss" :"', Now));
      // Read the data and patch them into the editfield
      AddMultiString(TSerialPortNG(Sender).ReadNextClusterAsString,Terminal.Lines);
    end;
end;
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
15.02.2014, 20:23
Цитата Сообщение от mell90 Посмотреть сообщение
1. активировать этот обработчик, что бы он например делал showmessage каждую минуту, в принципе что бы он отсчитывал время и что то делал по событию
Обработчик активирует событие, по возникновению которого он выполняется.
Цитата Сообщение от mell90 Посмотреть сообщение
2. как мне описать то, что он будет делать по событию, какие функции
Так в теле обработчика и описывай.

А лучше открой исходник того же TTimer и сам все увидишь.
0
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 25
15.02.2014, 20:36  [ТС]
сделал вот так, компилируется, но ничего не происходит

Delphi
1
2
3
4
5
procedure PORTRxClusterEvent(Sender: TObject);
procedure TSerialNGClass.PORTRxClusterEvent(Sender: TObject);
begin
       ShowMessage('Hello World');
end;
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
15.02.2014, 21:17
Цитата Сообщение от mell90 Посмотреть сообщение
сделал вот так, компилируется, но ничего не происходит
Потому что эта процедура никак не связана с какими либо событиями. С чего она вдруг должна вызываться?
0
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 25
15.02.2014, 21:18  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Потому что эта процедура никак не связана с какими либо событиями. С чего она вдруг должна вызываться?
как связать ее с событием?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
15.02.2014, 21:25
Вот пример обработки событий появления курсора над кнопкой и ухода с нее:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  TButton = class(StdCtrls.TButton)
  private
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
  end;
...
 
{ TButton }
 
procedure TButton.CMMouseEnter(var Msg: TMessage);
begin
  Caption := 'In';
end;
 
procedure TButton.CMMouseLeave(var Msg: TMessage);
begin
  Caption := 'Out';
end;
1
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 25
15.02.2014, 21:31  [ТС]
Спасибо, буду разбираться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2014, 21:31
Помогаю со студенческими работами здесь

Как создать в своем классе событие ?
Познакомился с Qt , там написано как можно связать событие с обработчиком события , как связать обработчик события с нескольким событиями ,...

Не работает событие, прописанное в классе модуля
Добрый день, форумчане! Прошу помощи с VBA WORDa: В документе есть таблицы, их может быть очень много. В ячейках таблицы есть...

Как создать событие в своём классе
Есть класс Class1 Есть его экземпляр var A:Class1 = new Class1(); Как сделать чтобы у переменной A было событие onMessage, чтобы я...

Как в классе-перехватчике переопределить событие с аргументами?
Как пример заблокируем выпадание стандартного контекстного меню TEdit. В файле формы реализация события выглядит так: void...

Проверка подписки на событие, инициализированное в другом классе
Суть в заголовке, нужны советы как проверить кто подписан на событие. Event инициализирован в другом классе. Создал метод проверки,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru