Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
X-Cite
Если метод не public или published то по умолчанию их в RTTI нет, вроде бы..


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

Ок, ладно, но почему условие срабатывает, если имя метода не находит?
8 ноя 18, 11:59    [21727965]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
Cobalt747
Member

Откуда:
Сообщений: 2037
X11
Ок, ладно, но почему условие срабатывает, если имя метода не находит?

Скорее всего. косяк отладчика.
Сделай вывод в лог, наверняка там будет все правильно.
8 ноя 18, 13:22    [21728063]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
нифигасебе косяк... это довольно серьёзноКартинка с другого сайта.
8 ноя 18, 13:30    [21728073]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
Ок, я перенес нужные методы в public.
Теперь нужный метод найден, но...

exception
Project raised exception class EInvalidCast with message 'Invalid class typecast'

на вот этой строке
rmethod.Invoke(Self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text), TValue.From<string>(AMessage.From.ID.ToString)));
8 ноя 18, 13:34    [21728085]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3845
Наглядное пособие переинженеринга -- как вот эта простая конструкция:
bot.Callback(params);

превратилась вот в этого монстра:
rmethod.Invoke(Self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text), TValue.From<string>(AMessage.From.ID.ToString)));
8 ноя 18, 13:38    [21728091]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
JaDi, сперва нужно сделать, чтобы "заработало" пусть даже и в виде монстра, а потом уже и причесать можно.
8 ноя 18, 13:46    [21728099]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1161
X11
Ок, я перенес нужные методы в public.
Теперь нужный метод найден, но...

exception
Project raised exception class EInvalidCast with message 'Invalid class typecast'

на вот этой строке
rmethod.Invoke(Self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text), TValue.From<string>(AMessage.From.ID.ToString)));

У вас в вашем методе, оба параметра типа string ?
Передавайте те значения параметров и того типа, что в методе
8 ноя 18, 14:03    [21728128]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3845
X11,

видимо, я что-то пропустил -- чем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а?
8 ноя 18, 14:08    [21728135]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24486
JaDi
чем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а?

Поддерживаю.
Первое слово всегда команда, остальное, если есть, параметры.
В обработчик команды передаются только параметры.

К чему эти огороды?
8 ноя 18, 14:11    [21728142]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
X-Cite
У вас в вашем методе, оба параметра типа string ?


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

PcmdStart(const sCmd: string; User: ItgUser);
8 ноя 18, 14:26    [21728168]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
переделал на
From: ItgUser

    if Assigned(rmethod) then
      rmethod.Invoke(rmethod.CodeAddress, TArray<TValue>.Create(TValue.From<string>(AMessage.Text),
                                              TValue.From<ItgUser>(AMessage.From)));


всё равно Invalid class typecast
8 ноя 18, 14:31    [21728181]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
wadman
JaDi
чем не устроила универсальная модель, когда на вход обработчику подаются параметры в универсальном виде типа строки/списка/json'а?

Поддерживаю.
Первое слово всегда команда, остальное, если есть, параметры.
В обработчик команды передаются только параметры.

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


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

Вроде бы я никуда не отклонялся. Пытаюсь сделать универсальную масштабируемую модель.
8 ноя 18, 14:35    [21728187]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24486
X11
И тоже нужно обработать.

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

Ну или пример "какого-нибудь" текста? Из жизни, по возможности.
8 ноя 18, 14:37    [21728192]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
wadman, работают ещё как Картинка с другого сайта.

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

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

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

ну как-то так
8 ноя 18, 14:47    [21728216]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
wadman
Ну или пример "какого-нибудь" текста? Из жизни, по возможности.


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

Распарсил текст, разбил на части: тип, цена, район, площади, коробка передач, размер трусов, фокусное расстояние объектива и т.д.
И не надо никаких команд.
8 ноя 18, 14:50    [21728222]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
wadman
Member

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

Тогда и не нужно никакого списка с командами и методами?

Изначально-то тема касалась именно списка команд. А тут уже и ИИ вылез и скоро тело прикрутим. Женское. :)
8 ноя 18, 14:54    [21728236]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
JaDi
Member

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

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


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

Менеджер определяет, что за команда и отправляет ее нужному боту:
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;
8 ноя 18, 14:55    [21728239]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
wadman
Тогда и не нужно никакого списка с командами и методами?


это уже сам программист решает, мне - нужно
8 ноя 18, 15:01    [21728251]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
JaDi
Было еще в самом начале 21717308

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


да не проблема....
проблема в том, когда пользователь скажет, что "я хочу, чтобы бот выполняет вот это запрограммированное действие на три похожие команды" и что, мне каждый раз добавлять и перекомпилировать?
8 ноя 18, 15:03    [21728256]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1161
X11
переделал на
From: ItgUser

    if Assigned(rmethod) then
      rmethod.Invoke(rmethod.CodeAddress, TArray<TValue>.Create(TValue.From<string>(AMessage.Text),
                                              TValue.From<ItgUser>(AMessage.From)));


всё равно Invalid class typecast


rmethod.Invoke(rmethod.CodeAddress

Вы читали хелп? Что идет первым параметром?
Если у вас метод класса, то надо передать Указатель на экземпляр класса в контексте которого будет вызываться метод
Если у вас классовый метод, то надо передать сам класс
8 ноя 18, 15:06    [21728264]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24486
X11
и что, мне каждый раз добавлять и перекомпилировать?

Есть иные способы? Разве что на сервер отправлять, вот и весь бот.
8 ноя 18, 15:11    [21728280]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
X-Cite, т.е. просто self вписать?
8 ноя 18, 15:15    [21728285]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
X-Cite, спасибо, теперь дошло

    if Assigned(rmethod) then
      rmethod.Invoke(self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text),
                                              TValue.From<ItgUser>(AMessage.From)));
8 ноя 18, 15:16    [21728289]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
wadman,

да, я же уже запилил.
8 ноя 18, 15:17    [21728290]     Ответить | Цитировать Сообщить модератору
 Re: Дженерики: передача процедуры в качестве параметра  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12480
wadman, на предыдущих страницах я показывал скрины. Идея в том, что у дерева есть корневые узлы - это действия, к которым привязаны методы (процедуры), т.е. то, что умеет бот. Дочерние узлы - это команды. Команды пользователь может редактировать (добавлять, удалять, переименовывать, отключать, включать)

Картинка с другого сайта.

т.е. можно сделать так, что если первое или единственное слово, полученное ботом, будет не "/старт", а "старт", то его тоже можно обработать, так же, как и "/start". Для этого пользователь просто добавляет узел см текстом "старт" в качестве дочернего к корневому "СТАРТ".
8 ноя 18, 15:24    [21728302]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
Все форумы / Delphi Ответить