powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики: передача процедуры в качестве параметра
25 сообщений из 108, страница 4 из 5
Дженерики: передача процедуры в качестве параметра
    #39729862
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЕсли метод не public или published то по умолчанию их в RTTI нет, вроде бы..

Я про это читал, но думал, что это только старой self.GetProcAddress касается.

Ок, ладно, но почему условие срабатывает, если имя метода не находит?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729888
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Ок, ладно, но почему условие срабатывает, если имя метода не находит?
Скорее всего. косяк отладчика.
Сделай вывод в лог, наверняка там будет все правильно.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729891
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нифигасебе косяк... это довольно серьёзно
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729897
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, я перенес нужные методы в public.
Теперь нужный метод найден, но...

exceptionProject raised exception class EInvalidCast with message 'Invalid class typecast'
на вот этой строке
Код: pascal
1.
rmethod.Invoke(Self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text), TValue.From<string>(AMessage.From.ID.ToString)));
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729899
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наглядное пособие переинженеринга -- как вот эта простая конструкция:
Код: pascal
1.
bot.Callback(params);


превратилась вот в этого монстра:
Код: pascal
1.
rmethod.Invoke(Self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text), TValue.From<string>(AMessage.From.ID.ToString)));
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729903
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, сперва нужно сделать, чтобы "заработало" пусть даже и в виде монстра, а потом уже и причесать можно.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729917
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Ок, я перенес нужные методы в public.
Теперь нужный метод найден, но...

exceptionProject raised exception class EInvalidCast with message 'Invalid class typecast'
на вот этой строке
Код: pascal
1.
rmethod.Invoke(Self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text), TValue.From<string>(AMessage.From.ID.ToString)));


У вас в вашем методе, оба параметра типа string ?
Передавайте те значения параметров и того типа, что в методе
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729921
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

видимо, я что-то пропустил -- чем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729923
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiчем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а?
Поддерживаю.
Первое слово всегда команда, остальное, если есть, параметры.
В обработчик команды передаются только параметры.

К чему эти огороды?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729936
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteУ вас в вашем методе, оба параметра типа string ?

блиииииииииииииин

Код: pascal
1.
PcmdStart(const sCmd: string; User: ItgUser);
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729940
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переделал на
From: ItgUser

Код: pascal
1.
2.
3.
    if Assigned(rmethod) then
      rmethod.Invoke(rmethod.CodeAddress, TArray<TValue>.Create(TValue.From<string>(AMessage.Text),
                                              TValue.From<ItgUser>(AMessage.From)));



всё равно Invalid class typecast
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729942
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanJaDiчем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а?
Поддерживаю.
Первое слово всегда команда, остальное, если есть, параметры.
В обработчик команды передаются только параметры.

К чему эти огороды?

1. Первым словом может быть не /команда, а просто текст какой-нибудь. И тоже нужно обработать.
2. Если всё же /команда, то нужно понять, что именно за команда и вызвать соответствующую процедуру, передав ей ВЕСЬ текст, например, "/Показать 15973".

Вроде бы я никуда не отклонялся. Пытаюсь сделать универсальную масштабируемую модель.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729946
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11И тоже нужно обработать.
Боты без команд не работают. По меньшей мере я не сталкивался.

Ну или пример "какого-нибудь" текста? Из жизни, по возможности.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729952
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, работают ещё как


Что такое "команда боту"? Это то, что ты САМ, как программист, запрограммируешь в бота, т.е. любое сочетание любых символов. Это же просто текст. Просто есть какие-то общепринятые нормы и понятия.

Бот ведь работает не на их стороне, т.е. не на стороне Вайбера или Телеграма, а на твоей. Сервер тебе просто пересылает то, что напечатал/выбрал пользователь.

Никто не запрещает сделать так, что команды будут начинаться не чертой /, а * звёздочкой, например. Или вообще без таковых. Например, боты с ИИ: ты ему пишешь текст, а он отвечает, разобрав текст предварительно. Например, пишешь "какая сейчас погода в Харькове", а бот лезет в сеть, получает данные и отвечает "такая-то погода". И нет никаких команд, разве не так?

ну как-то так
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729955
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanНу или пример "какого-нибудь" текста? Из жизни, по возможности.

Есть идея запилить приём текстовых объявлений на какой-нибудь портал: автомобильный или по недвижимости типа вашего Авито или нашего OLX, хотя это одно и то же (владелец из Южной Африки - Насперс).

Распарсил текст, разбил на части: тип, цена, район, площади, коробка передач, размер трусов, фокусное расстояние объектива и т.д.
И не надо никаких команд.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729961
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Например, пишешь "какая сейчас погода в Харькове", а бот лезет в сеть, получает данные и отвечает "такая-то погода". И нет никаких команд, разве не так?
Тогда и не нужно никакого списка с командами и методами?

Изначально-то тема касалась именно списка команд. А тут уже и ИИ вылез и скоро тело прикрутим. Женское. :)
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729962
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X111. Первым словом может быть не /команда, а просто текст какой-нибудь. И тоже нужно обработать.
2. Если всё же /команда, то нужно понять, что именно за команда и вызвать соответствующую процедуру, передав ей ВЕСЬ текст, например, "/Показать 15973".

Вроде бы я никуда не отклонялся. Пытаюсь сделать универсальную масштабируемую модель.

Было еще в самом начале 21717308

Менеджер определяет, что за команда и отправляет ее нужному боту:
Код: pascal
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.
procedure TBotsManager.ProcessCommand(const ACommandLine: string);
var
  commandName: string;
  commandParams: string;
  foundedWorker: TBotWorker;
  s: string;
  res: string;
begin
  s := Trim(ACommandLine);
  if s.IndexOf(' ') >= 0 then
  begin
    commandName := AnsiLowerCase(trim(s.Substring(0, s.IndexOf(' '))));
    commandParams := trim(s.Substring(commandName.Length + 1));
  end
  else
  begin
    commandName := AnsiLowerCase(s);
    commandParams := '';
  end;

  if Self.CommandsList.TryGetValue(commandName, foundedWorker) then
  begin
    res := '';
    foundedWorker(commandParams, res);
    ShowMessage(res);
  end
  else
  begin
    ShowMessage('unknown command: ' + commandName);
  end;
end;
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729968
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanТогда и не нужно никакого списка с командами и методами?

это уже сам программист решает, мне - нужно
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729970
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiБыло еще в самом начале 21717308

Менеджер определяет, что за команда и отправляет ее нужному боту:

да не проблема....
проблема в том, когда пользователь скажет, что "я хочу, чтобы бот выполняет вот это запрограммированное действие на три похожие команды" и что, мне каждый раз добавлять и перекомпилировать?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729975
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11переделал на
From: ItgUser

Код: pascal
1.
2.
3.
    if Assigned(rmethod) then
      rmethod.Invoke(rmethod.CodeAddress, TArray<TValue>.Create(TValue.From<string>(AMessage.Text),
                                              TValue.From<ItgUser>(AMessage.From)));



всё равно Invalid class typecast

Код: pascal
1.
rmethod.Invoke(rmethod.CodeAddress


Вы читали хелп? Что идет первым параметром?
Если у вас метод класса, то надо передать Указатель на экземпляр класса в контексте которого будет вызываться метод
Если у вас классовый метод, то надо передать сам класс
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729982
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11и что, мне каждый раз добавлять и перекомпилировать?
Есть иные способы? Разве что на сервер отправлять, вот и весь бот.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729983
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, т.е. просто self вписать?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729984
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, спасибо, теперь дошло

Код: pascal
1.
2.
3.
    if Assigned(rmethod) then
      rmethod.Invoke(self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text),
                                              TValue.From<ItgUser>(AMessage.From)));
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729985
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

да, я же уже запилил.
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729990
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, на предыдущих страницах я показывал скрины. Идея в том, что у дерева есть корневые узлы - это действия, к которым привязаны методы (процедуры), т.е. то, что умеет бот. Дочерние узлы - это команды. Команды пользователь может редактировать (добавлять, удалять, переименовывать, отключать, включать)



т.е. можно сделать так, что если первое или единственное слово, полученное ботом, будет не "/старт", а "старт", то его тоже можно обработать, так же, как и "/start". Для этого пользователь просто добавляет узел см текстом "старт" в качестве дочернего к корневому "СТАРТ".
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 4 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики: передача процедуры в качестве параметра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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