-
Постов
776 -
Зарегистрирован
-
Посещение
-
Победитель дней
27
Активность репутации
-
#WAMACO отреагировална rareMax в Telega π - Библиотека для работы с Telegram Bot API в Delphi
В начале пару новостей:
Репозиторий клонируется также на ГитХаб. Можно устанавливать с помощью Delphinus'a Бот калькулятор для Telegram.
А сейчас мы напишем своего бота, который сможет решать арифметические выражения(и не только).
Что для этого нужно:
Telega π - Библиотека для работы с Telegram Bot API в Delphi TeeBI После установки библиотек свыше - создаем новое консольное приложение. Далее создаем новый модуль(unit) и называем его, например, Telegram.Plugin.Calculator
В этом модуле мы будем писать логику калькулятора, а точнее взаимодействие команд от пользователя и модуля выражений BI.Expression(TeeBI).
Для наглядности, сразу код модуля:
unit Telegram.Plugin.Calculator; interface uses TelegAPI.Bot, TelegAPI.Types, TelegAPI.Utils, TelegAPI.Module; Type TTgCalculatorBot = Class(TTgModule) private FIsCommandWait: Boolean; protected procedure OnUpdate(Sender: TObject; Const Update: TtgUpdate); override; End; implementation uses BI.Expression, System.SysUtils; { TTgWelcomeBot } procedure TTgCalculatorBot.OnUpdate(Sender: TObject; const Update: TtgUpdate); var Cmd: TCommandHelper; Procedure Calculation; var TextExpr: String; Begin FIsCommandWait := False; if Cmd.ParamCount = 0 then TextExpr := Update.Message.Text else TextExpr := Cmd.ParamsToString; try (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, TExpression.FromString(TextExpr).Value); except on E: Exception do (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, 'упс, ошибочка вышла: ' + E.ClassName + ' ' + E.Message); end; End; begin Cmd := TCommandHelper.Create(Update.Message.Text); try if Cmd.Command = '/calc' then Begin if Cmd.ParamCount = 0 then Begin FIsCommandWait := true; (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID, 'ожидаю выражение:'); End else Begin Calculation; End; End else if FIsCommandWait then Begin Calculation; End; finally Cmd.Free; end; end; end. Первое на что обращаем внимание - наш класс TTgCalculatorBot будет наследоваться от TTgModule, в котором заложен базовый функционал для расширения функционала бота(на данный момент только получение обновлений от сервера).
В метод OnUpdate будут поставляться обновления, которые приходят от сервера, в нем мы и будем работать.
Насчет поля FIsCommandWait. Уж так сложилось - что, как правило, пользователь сразу отправляет боту команду - а потом параметры. Поэтому, если придет поддерживаемая модулем команда - мы устанавливаем это поле в True. Если это поле - правда - значит нужно обработать текст.
Теперь вернемся к нашему консольному приложению:
program CalculatorBot; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils, Telegram.Plugin.Calculator in 'Telegram.Plugin.Calculator.pas'; Const C_PAUSE_UPDATE = 1000; { 1sec. } Var TelegramBot: TTelegramBot; TelegramCalc: TTgCalculatorBot; Procedure InitRecesive; var Offset: Integer; Updates: TArray<TtgUpdate>; Update: TtgUpdate; Begin Offset := 0; while True do begin Sleep(C_PAUSE_UPDATE); // Update pause Updates := TelegramBot.getUpdates(Offset); // Get updates if Length(Updates) = 0 then Continue; Offset := Updates[High(Updates)].ID + 1; end; End; begin WriteLn('Telegram Calculator Sample'); { Here you Api key } TelegramBot := TTelegramBot.Create({$I ..\telegaToken.inc} ); TelegramCalc := TTgCalculatorBot.Create(TelegramBot); try WriteLn('Bot token: ', TelegramBot.getMe.ID <> -1); InitRecesive; except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; TelegramBot.Free; TelegramCalc.Free; end. TelegramCalc := TTgCalculatorBot.Create(TelegramBot); - во время создания модуля - происходит подписка на сообщения от сервера. Никаких данных программисту передавать не нужно.
Далее, что бы консоль сразу же не закрылась - нужно зациклить прием данных от сервера. Пример - в процедуре InitRecesive.
Что получаем в итоге:
Так же можете сами протестировать бота(если он конечно будет запущен): @test_delphi_api_bot
Готовый пример: https://bitbucket.org/uasoft/telegapi/src//examples/PluginCalculator/?at=master
-
#WAMACO получил реакцию от zairkz в iOS фоновом режиме
если не верите, запустите яндекс.навигатор и потом сверните, через некоторое время откройте, геопозиция будет та на которой закрыли.
такова архитектура ios, это не android, где все можно, тут спроектировано умело все!
-
#WAMACO отреагировална master webs в Вызов приложения из нофитикейшена
в корне не правильный подход если нет статистики по устройствам пользователей можно потерять очень большую часть аудитории для владельцев сервиса и потерять много клиентов за того что нет возможности собрать проект на ios хотя по факту он будет сделан
да и по оборудованию не так дорого выходит я когда начинал сидел на хакинтоше с виндой на виртуалке и с iphone 4s
и могу навести простой пример делал приложения для 4х московских интернет магазинов по их статистике с яндекс метрики заходы на сайты были 60 % ios, 30% браузер и только 10% android все 4 сайта сидят в топ 10 яндекса и гугла
-
#WAMACO отреагировална master webs в Вызов приложения из нофитикейшена
дело в том что изначально ibeacon был разработан для ios android запустил в след свои аналоги https://ru.wikipedia.org/wiki/IBeacon и сделал совместимость с ibeacon может быть от сюда и ноги растут а так да для ведра как вариант только сервис который будет в фоне мониторить маячки ито на хабре есть статья где был мониторинг по месту нахождения устройства и времени события
P.S. к месту магазина можно привязать есть же определения по wifi/сотовой сети gps
определили место дали уведомление и человек сам запустит приложение как вариант
https://www.ibeaconrussia.ru/blog/ibeacon-na-android/
был не прав в сервисе приложение не нуждается все должно делать само ведро на уровне операционки
-
#WAMACO отреагировална krapotkin в Как управлять ProgressBar с помощью Timer-а ?
Я уже 25 лет пишу программы по ТЗ. Давайте обратимся к ТЗ...
Интервал срабатывания таймера задан в чем? - в миллисекундах. Ставим галочку пункт 1.
По тикам таймера... Приведенный код - обработчик "тиков" таймера. Галочка пункт 2
Сдвигать progressBar. Тут двояко можно толковать. Можно реально сдвигать прогресс-бар, можно двигать текущее значение в нем. Первый вариант слишком экзотичен, поэтому думаем про второй
Value := Value + 1;
Галочка три.
Задание выполнено точно в соответствии с ТЗ, в сроки, определенные договором.
Подпись. печать.
-
#WAMACO отреагировална krapotkin в [Заметка] [Google Play] Ответы на два самых частых вопроса
У большинства авторов просто не хватает источников и знаний в смежных областях, особенно в Android и IOS. Кроме того, каждые 6 месяцев то Delphi обновится, то Google и IOS консоли ) Не угнаться.
Здесь все задают одни и те же вопросы до момента, когда выходит очередная Sarina и пишет, как надо было. Понимание не появляется, но копи-пейст работает )
-
#WAMACO отреагировална RoschinSpb в Смена цвета label в runtime
Ключевым здесь является TStyledSetting.FontColor
NadG.StyledSettings := NadG.StyledSettings - [TStyledSetting.FontColor];
Работает и с BeginUpdate и без оного и c любым положением "Paren :="
См. также Почему не изменяется Font.Style и Font.Size.
-
#WAMACO получил реакцию от zairkz в Акция: Berlin 10.1 C++ Builder Starter БЕСПЛАТНО
Так это только на C++ Builder! На Delphi такого нет!
-
#WAMACO отреагировална Равиль Зарипов (ZuBy) в Динамическая подгрузка картинок в ListView
потрыньдеть можно хоть тут, но она не рассчитана на загрузку из БД.
Неправильная организация архитектуры ведет к таким последствиям как у вас.
уже писал об этом тут
P.S. уважаемые модераторы, перенесите сообщения в другую тему
-
#WAMACO отреагировална Евгений Корепов в Отладка Android приложения (и не только)
Если не получается сразу определить источник ошибок, я публикую для бетатестеров новую версию приложения, где FAppStage прописана более подробно - начало конец вызова каждой подозрительной функции или кода.
-
#WAMACO отреагировална RoschinSpb в Новый MAC OS новый XCode. Перестала запускаться программа
Капитан Очевидность шепчет: "Обновите операционку на айфоне".
Официальный список поддерживаемых версий: http://docwiki.embarcadero.com/RADStudio/Berlin/en/Supported_Target_Platforms
К сожалению у Mac совершенно другая политика в отношении сторонних программистов чем у Win. Фруктовая компания не поощряет иные средства разработки кроме своего, по этому на такие мелочи как поддержка совместимости не заморачивается. Тут как с XP сидеть 15 лет на старой версии не получится.
P. S. на всякий случай напоминаю, что это мнение не официальное, все названия вымышлены, и совпадения с реальностью совершенно случайны
-
#WAMACO получил реакцию от Kitty в Вызов приложения из нофитикейшена
конечно разные!
запилите на сервере посылку push и тогда он будет приходить даже при не запущенном приложении!
и что вы все про android, даже если сделать через сервис, то ваше решение не покатит на ios и вам придется переписывать приложение!
делайте лучше сразу посылку push независимо от приложения!
-
#WAMACO отреагировална Равиль Зарипов (ZuBy) в Диалоговое окно на Андроид.
Обновленная версия
Более реалистичные диалоги для андроид 5.0 и выше
MyDialogs_ZuBy.zip
-
#WAMACO отреагировална krapotkin в После обновления на Андроид 6.01
на всех андроид устройствах нет смысла пользоваться прямым указанием папки
доступные программе папки перечислены в class TPath из System.IOUtils.pas
пример
uses System.IOUtils; fname := TPath.combine(TPath.GetDocumentsPath, 'myfile.txt');
-
#WAMACO отреагировална Andrey Efimov в [Статья] Публикация приложения в Google Play
Ссылка: http://delphifmandroid.blogspot.ru/2016/06/google-play-google-play.html
Автор: Андрей Ефимов
Описание: Публикация приложения в Google Play
-
#WAMACO отреагировална Andrey Efimov в Какие статьи вы хотели бы видеть в блогах?
Написал статейку по вашей теме [Google Play] Публикация приложения в Google Play
-
#WAMACO отреагировална AngryOwl в кнопка поверх ListView
И [brunnengi] и [ZuBy] оба правы.
В первом случае у TLayout нужно выключить свойсвто HitTest, чтобы сам TLayout не "перекрывал" клики мышь (или тапы) (TLayout позволит "выравнивать" несколько "кнопок" относительно друг друга проще)
Во втором случае - все проще (любой лишний компонент на форме, не важно - в составе чего он, - это дополнительная память, а главное - расходы на отрисовку. Порой нам кажется, что вроде на форме и "нет ничего", а если копнуть поглубже - там окажется море того, чего мы не видим, а отрисовывать то их прийдется!). Простой TImage, на мой взгляд, лучше.
Но, как мне кажется, в данном случае вовсе не обязательно обрабатывать выравнивание в событии OnResize.
Достаточно в DesignTime разместить TImage (все) где нужно и установить его (их) свойство Anchors = [akRight, akBottom] (для Вашего случая)
-
#WAMACO отреагировална HyperZen в Возвращаясь к вопросу о подсчете высоты текста TListView
Ярослав! Все работает как надо, но при некоторых размерах шрифта (я подозреваю те размеры, про которые мы писали выше) все-таки вычисления некорректны - это касается платформы Windows.
На конкретном устройстве - все работает корректно с любым размером шрифтов!
-
#WAMACO отреагировална Pax Beach в Одновременное обращение к БД Sqlite из программы и из сервиса
Я нашел решение, к сожалению, пока только для работы с UniDAC:
Обновил UniDAC компоненты для Berlin до последней версии (6.3.12).
Компоненты TUniConnection и TUniQuery отлично работают с SQLite в Android Service. FireDAC в Android Service пока запустить не удалось, но у меня такой задачи нет.
В Deployment host приложения добавляю файл базы данных, Remote Path задаю ".\assets\internal\". И спокойно из сервиса получаю к нему доступ. Мой сервис локальный в одном потоке с приложением. Если делать Intent Service или Remote — наверное, придется помещать файл в другой, доступный каталог, или общаться через намерения (Intents).
Надеюсь мой код будет полезен для вас.
procedure TDM.conSQLiteBeforeConnect(Sender: TObject); begin {$IF DEFINED(iOS) or DEFINED(ANDROID)} conSQLite.Database := TPath.Combine(TPath.GetDocumentsPath, 'mybase.sqlite'); {$ENDIF} end; procedure TDM.conSQLiteError(Sender: TObject; E: EDAError; var Fail: Boolean); begin Log('--- DB error: %s:', [E.Message]); Fail := False; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin Log('+ START with Intent: ' + JStringToString(Intent.getAction.toString), []); if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin try conSQLite.Disconnect; Log('- DB disconnected', []); except on E: Exception do Log('- can not to disconnect DB', [E.Message]); end; Log('... service to be stoped', []); JavaService.stopSelf; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service end else begin Log('... service started', []); try conSQLite.Connect; Log('+ DB connected', []); UniQuery.SQL.Text := 'select count(*) as ALLREC from orders'; UniQuery.Open; if UniQuery.RecordCount > 0 then begin UniQuery.First; Log('... record count: %s', [UniQuery.FieldByName('ALLREC').AsString]); end; UniQuery.Close; except on E: Exception do Log('- can not to connect DB: %s', [E.Message]); end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops end; end; -
#WAMACO получил реакцию от walexw в Разместить в Play Market
http://developer.alexanderklimov.ru/android/publish.php
https://support.google.com/googleplay/android-developer/answer/113469?hl=ru
-
#WAMACO получил реакцию от Kitty в Разместить в Play Market
http://developer.alexanderklimov.ru/android/publish.php
https://support.google.com/googleplay/android-developer/answer/113469?hl=ru
-
#WAMACO отреагировална Евгений Корепов в Проблемы с отрисовкой
В приведенном коде процедура FormCreate:
procedure TFormMain.FormCreate(Sender: TObject); begin Timer.Interval:=10; Хотя такой короткий не нужен для большинства случаев.
-
#WAMACO отреагировална Pax Beach в Berlin жутко тормозит
Win 10 x64, 12 GB.
Проекты вынес на SSD.
При работе с проектами, выключаю антивирус, отключаю синхронизацию облака.
Берлин компилит проекты под Android быстрее Сиэтла. Под Windows и так моментально.
Никаких тормозов в работе часами не увидел.
-
#WAMACO получил реакцию от bigjorj в Правильная ли практика применения!
я вообще отказался от grid и перешел на ListView даже для десктопа (особенно приятен в berlin), все быстро, память не кушает
-
#WAMACO получил реакцию от Andrey Efimov в Правильная ли практика применения!
я вообще отказался от grid и перешел на ListView даже для десктопа (особенно приятен в berlin), все быстро, память не кушает