powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики: передача процедуры в качестве параметра
8 сообщений из 108, страница 5 из 5
Дженерики: передача процедуры в качестве параметра
    #39729992
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11JaDiБыло еще в самом начале 21717308

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

да не проблема....
проблема в том, когда пользователь скажет, что "я хочу, чтобы бот выполняет вот это запрограммированное действие на три похожие команды" и что, мне каждый раз добавлять и перекомпилировать?
Нет, достаточно договориться о протоколе. Например, что каждая команда должна начинаться со спецсимвола типа \. Или что несколько команд можно задать в виде скобок. Или в видео start -end. Короче, вариантов масса. И всё это реализуется как раз в одном месте -- в менеджере, который должен распарсить сообщение пользователя и дальше передать в обработку (одному, нескольким ботам или сразу пачкой команд).

Эти правила будут действовать для всех (боты будут видеть эти команды как отдельные -- без пользовательских сессий будет проблемно объединить их в одну пачку... короче, тут много вариантов в зависимости от требований).


Или если речь про конкретного бота -- то пускай он для себя и парсит в той нотации, что ему удобнее (собственно, так боты в том же телеграмме и других чатах так и работают) -- у всех свои правила для обработки.

Пример: "бот1 скачай лалала преобразуй в какака сожми отправь ссылку на лулулу"
Команда: "бот1"
Параметры: "скачай лалала.... на лулулу".

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

ну я вроде бы так и делаю
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39729998
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiПример: "бот1 скачай лалала преобразуй в какака сожми отправь ссылку на лулулу"
Команда: "бот1"
Параметры: "скачай лалала.... на лулулу".

да, я так примерно и делаю
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39730249
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно, баг в Invoke происходит из за Pointer

Код: pascal
1.
  MyWide = type PWideChar;



Не сможет вызвать не один тип PInteger, Pointer и прочие.

Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, rtti;

type
  MyWide = type PWideChar;

  TMyClass = class
  public
    procedure badCall(const p: MyWide);
  end;

procedure TMyClass.badCall(const p: MyWide);
begin
  Writeln(PWideChar(p));
end;

var
  context: TRttiContext;
  myclass: TMyClass;
  badCall: TRttiMethod;

begin
  try
    myclass := TMyClass.Create;

    badCall := context.GetType(myclass.ClassInfo).GetMethod('badCall');
    badCall.Invoke(myclass, [PWideChar('Hello World')]);

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Хочу напомнить, что всё же можно напороться на этот баг, примеру с вызовом функции TStyleManager.SetStyle
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39730429
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так типы то якобы разные...
Вот так работает...
Не надо совмещать похожие но не одинаковые типы...
Код: pascal
1.
TRttiContext.Create.GetType(ClassType).GetMethod('badCall').Invoke(Self, [TValue.From<MyWide>(MyWide(PWideChar('Hello World')))])
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39730519
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо, да, я читал твою тему :)
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39883647
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, оно работает :)
как-то так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// прилетело сообщение
  if DicCmds.ContainsKey(sInCmd) and Assigned(AMessage.From) then
  begin
    BotProcName := DicCmds[sInCmd];// получаем имя процедуры (метода: PcmdHelp или PcmdStart, иди др.)

    rtype   := ctx.GetType(self.ClassType);
    rmethod := rtype.GetMethod(BotProcName);// метод должен быть в public

    if Assigned(rmethod) then
      rmethod.Invoke(self, TArray<TValue>.Create(TValue.From<string>(AMessage.Text),
                                                 TValue.From<ItgUser>(AMessage.From)))
    else
      logE(constError + '. ' + constBotProcNameError + ' ' + BotProcName);

  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TfmMainTelegramBot.PcmdHelp(const sCmd: string; User: ItgUser);
begin
  SendMsgByBot(User.id, GetLocalizeStr('constStartHelp1', User.LanguageCode), nil, TtgParseMode.Markdown);
end;

procedure TfmMainTelegramBot.PcmdStart(const sCmd: string; User: ItgUser);
Var
 s: string;
begin
  s := GetLocalizeStr('constStartCmd1', User.LanguageCode);
  SendMsgByBot(User.ID, s, nil, TtgParseMode.Markdown);
  SendReplyKeyboardMarkup(User);
end;





Но это всё работает в модуле главной формы и получается так, что интерфейс виснет, если много команд сразу...
теперь следующий этап - это нужно перенести в отдельный поток...
вопрос в том, будет ли rmethod.Invoke работать не в модуле формы, а в отдельном потоке? Или это не важно, был бы класс и public-методы?
...
Рейтинг: 0 / 0
Дженерики: передача процедуры в качестве параметра
    #39883740
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11, Invoke будет работать в потоке.
...
Рейтинг: 0 / 0
8 сообщений из 108, страница 5 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дженерики: передача процедуры в качестве параметра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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