Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как по имени или указателю вызвать метод экземпляра класса ? / 7 сообщений из 7, страница 1 из 1
10.06.2020, 00:26
    #39967656
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как по имени или указателю вызвать метод экземпляра класса ?
Добрый день.

Вопрос возможно глупый, но все же. Создается экземпляр класса для работы с COM-портом (используется CPort). Для его события OnRxChar создается обработчик события, как процедура, относящаяся к пользовательскому классу, пользовательский класс также создается по одному на каждый открываемый COM-порт. Это нужно, что бы данные, приходящие от заранее не известного числа портов обрабатывались независимо.

Но как послать данные в нужный порт? При создании экземпляра CPort (TComPort) ему назначается индивидуальное Name, да и указатель, мы же получаем, как результат в конце концов. Подскажите, как можно выполнить, например, метод WriteStr() для нужного экземпляра TComPort ?
...
Рейтинг: 0 / 0
10.06.2020, 02:44
    #39967663
misha mike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как по имени или указателю вызвать метод экземпляра класса ?
Это нужно, что бы данные, приходящие от заранее не известного числа портов обрабатывались независимо.
Достаточно одного обработчика в одном классе. А разделять источники события по параметру Sender. Через него передается ссылка на экземпляр класса, который в данный момент вызвал обработчик.

Но как послать данные в нужный порт?
Если посылка данных является ответом на входящий блок данных, то через тот же Sender.
...
Рейтинг: 0 / 0
10.06.2020, 07:35
    #39967680
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как по имени или указателю вызвать метод экземпляра класса ?
AleksVoronezh
пользовательский класс также создается по одному на каждый открываемый COM-порт. Это нужно, что бы данные, приходящие от заранее не известного числа портов обрабатывались независимо.



Храните ссылку на нужный порт в пользовательском классе
...
Рейтинг: 0 / 0
10.06.2020, 08:34
    #39967690
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как по имени или указателю вызвать метод экземпляра класса ?
AleksVoronezh
Но как послать данные в нужный порт?

Можно создать список портов с их экземплярами TComPort; "com1" - TComPort1, "com2" - TComPort2.
...
Рейтинг: 0 / 0
10.06.2020, 09:29
    #39967699
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как по имени или указателю вызвать метод экземпляра класса ?
Спасибо всем ответившим. На всякий случай, я с самого начала веду массив записей, в элементы которого помещаю имя создаваемого порта и его указатель. Проблема именно в том, что бы обратится к методу нужного экземпляра класса, обслуживающего тот или иной порт. Число портов во врямя работы меняться не будет. Некоторое число портов будет задаваться только во время старта программы.

Посылка данных может никак не зависить от ответа. Ответа может вообще не быть, если это включение лампочки например.

Вот поэтому и хоелось бы сделать полностью независимыми прием данных (это работает, данные далее попадают в Pascal Script, и обрабатываются от каждого порта своей функцией) и оправку данных в нужный "канал" по необходимости.
...
Рейтинг: 0 / 0
10.06.2020, 10:32
    #39967732
AleksVoronezh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как по имени или указателю вызвать метод экземпляра класса ?
Вот для теста сделал - кое как работает.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
For NN:=0 To RS232_Servers_Counter-1 Do
     Begin
       If  RS232_Servers_List[NN].RS232_Server_Name=RS232_Server_Name Then Exit;
     End;


   My_RS232Server:=TComPort.Create(Nil);
   My_RS232Server.Name:=RS232_Server_Name;
   My_RS232Server.BaudRate:=br9600;
   My_RS232Server.Port:='COM9';

   My_RS232_Read_Event:=TMy_RS232_Server.Create; // Создаем экземпляр класса с процедурой, преобразующей получаемые по 
   RS232 данные в строку
   My_RS232Server.OnRxChar:=My_RS232_Read_Event.Data_Read; // Назначаем индивидуальный обработчик событию получения 
   данных по TCP для созданного сервера
   My_RS232_Read_Event.Function_Name_To_Get_RS232_Data:=Function_Name_To_Get_RS232_Data; // Указываем имя функции внутри 
   скрипта, в которую будем возвращать строку полученных данных
   My_RS232Server.Open;

   RS232_Servers_List[RS232_Servers_Counter].RS232_Server_Name:=RS232_Server_Name;
   RS232_Servers_List[RS232_Servers_Counter].RS232_Server_Pointer:=My_RS232Server;
   RS232_Servers_Counter:=RS232_Servers_Counter+1;




Здесь проверка отправки, поиск в цикле нужного экземпляра опускаю.

Код: pascal
1.
2.
3.
       PP:= RS232_Servers_List[0].RS232_Server_Pointer;
       Sender:=PP;
       (Sender As TComPort).WriteStr('ererer');



Все эти экземпляры - TComPort и мой класс по умолчанию наверняка работает в одном потоке?
...
Рейтинг: 0 / 0
10.06.2020, 16:34
    #39967936
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как по имени или указателю вызвать метод экземпляра класса ?
AleksVoronezh
Проблема именно в том, что бы обратится к методу нужного экземпляра класса, обслуживающего тот или иной порт.

Перебрать список в поиске нужно порта, тут его экземпляр
AleksVoronezh
Код: pascal
1.
RS232_Servers_List[RS232_Servers_Counter].RS232_Server_Pointer:=My_RS232Server;


Хотя, я бы взял TList или TObjectList.

AleksVoronezh
мой класс по умолчанию наверняка работает в одном потоке?

На сколько помню, читает и ожидает в отдельном потоке, остальное - в основном.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как по имени или указателю вызвать метод экземпляра класса ? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]