Перейти к содержанию
Fire Monkey от А до Я

#WAMACO

Пользователи
  • Постов

    776
  • Зарегистрирован

  • Посещение

  • Победитель дней

    27

Активность репутации

  1. Like
    #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
  2. Like
    #WAMACO получил реакцию от zairkz в iOS фоновом режиме   
    если не верите, запустите яндекс.навигатор и потом сверните, через некоторое время откройте, геопозиция будет та на которой закрыли.
    такова архитектура ios, это не android, где все можно, тут спроектировано умело все!
  3. Like
    #WAMACO отреагировална master webs в Вызов приложения из нофитикейшена   
    в корне не правильный подход если нет статистики  по устройствам пользователей можно потерять очень большую часть аудитории для владельцев сервиса и потерять много клиентов за того что нет возможности собрать проект на ios хотя по факту он будет сделан
    да и по оборудованию  не так дорого выходит я когда начинал сидел на хакинтоше с виндой на виртуалке и с iphone 4s
    и могу навести простой пример делал приложения для 4х московских интернет магазинов  по их статистике с яндекс метрики заходы на сайты были 60 % ios, 30% браузер  и только 10% android все 4 сайта  сидят в топ 10 яндекса и гугла
  4. Like
    #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/
    был не прав  в сервисе приложение не нуждается все должно делать само ведро на уровне операционки
  5. Like
    #WAMACO отреагировална krapotkin в Как управлять ProgressBar  с помощью Timer-а ?   
    Я уже 25 лет пишу программы по ТЗ. Давайте обратимся к ТЗ...
    Интервал срабатывания таймера задан в чем? - в миллисекундах. Ставим галочку пункт 1.
    По тикам таймера... Приведенный код - обработчик "тиков" таймера. Галочка пункт 2
    Сдвигать progressBar. Тут двояко можно толковать. Можно реально сдвигать прогресс-бар, можно двигать текущее значение в нем. Первый вариант слишком экзотичен, поэтому думаем про второй
    Value := Value + 1; 
    Галочка три.
    Задание выполнено точно в соответствии с ТЗ, в сроки, определенные договором.
    Подпись. печать.
     
  6. Like
    #WAMACO отреагировална krapotkin в [Заметка] [Google Play] Ответы на два самых частых вопроса   
    У большинства авторов просто не хватает источников и знаний в смежных областях, особенно в Android и IOS. Кроме того, каждые 6 месяцев то Delphi обновится, то Google и IOS консоли ) Не угнаться.
    Здесь все задают одни и те же вопросы до момента, когда выходит очередная Sarina и пишет, как надо было. Понимание не появляется, но копи-пейст работает )
  7. Like
    #WAMACO отреагировална RoschinSpb в Смена цвета label в runtime   
    Ключевым здесь является TStyledSetting.FontColor
    NadG.StyledSettings := NadG.StyledSettings - [TStyledSetting.FontColor];
    Работает и с BeginUpdate и без оного и c любым положением "Paren :="
    См. также Почему не изменяется Font.Style и Font.Size.
  8. Like
    #WAMACO получил реакцию от zairkz в Акция: Berlin 10.1 C++ Builder Starter БЕСПЛАТНО   
    Так это только на C++ Builder! На Delphi такого нет!
  9. Like
    #WAMACO отреагировална Равиль Зарипов (ZuBy) в Динамическая подгрузка картинок в ListView   
    потрыньдеть можно хоть тут, но она не рассчитана на загрузку из БД.
    Неправильная организация архитектуры ведет к таким последствиям как у вас.
    уже писал об этом тут
    P.S. уважаемые модераторы, перенесите сообщения в другую тему
  10. Like
    #WAMACO отреагировална Евгений Корепов в Отладка Android приложения (и не только)   
    Если не получается сразу определить источник ошибок, я публикую для бетатестеров  новую версию приложения, где FAppStage прописана более подробно - начало конец вызова каждой подозрительной функции или кода.
  11. Like
    #WAMACO отреагировална RoschinSpb в Новый MAC OS новый XCode. Перестала запускаться программа   
    Капитан Очевидность шепчет: "Обновите операционку на айфоне".
    Официальный список поддерживаемых версий: http://docwiki.embarcadero.com/RADStudio/Berlin/en/Supported_Target_Platforms
    К сожалению у Mac совершенно другая политика в отношении сторонних программистов чем у Win. Фруктовая компания не поощряет иные средства разработки кроме своего, по этому на такие мелочи как поддержка совместимости не заморачивается. Тут как с XP сидеть 15 лет на старой версии не получится.
    P. S. на всякий случай напоминаю, что это мнение не официальное, все названия вымышлены, и совпадения с реальностью совершенно случайны
  12. Like
    #WAMACO получил реакцию от Kitty в Вызов приложения из нофитикейшена   
    конечно разные!
    запилите на сервере посылку push и тогда он будет приходить даже при не запущенном приложении!
    и что вы все про android, даже если сделать через сервис, то ваше решение не покатит на ios и вам придется переписывать приложение!
    делайте лучше сразу посылку push независимо от приложения!
  13. Like
    #WAMACO отреагировална Равиль Зарипов (ZuBy) в Диалоговое окно на Андроид.   
    Обновленная версия 
    Более реалистичные диалоги для андроид 5.0 и выше  
    MyDialogs_ZuBy.zip
  14. Like
    #WAMACO отреагировална krapotkin в После обновления на Андроид 6.01   
    на всех андроид устройствах нет смысла пользоваться прямым указанием папки
    доступные программе папки перечислены в class TPath из System.IOUtils.pas
    пример
    uses System.IOUtils; fname := TPath.combine(TPath.GetDocumentsPath, 'myfile.txt');  
  15. Like
    #WAMACO отреагировална Andrey Efimov в [Статья] Публикация приложения в Google Play   
    Ссылка: http://delphifmandroid.blogspot.ru/2016/06/google-play-google-play.html
    Автор: Андрей Ефимов
    Описание: Публикация приложения в Google Play
  16. Like
    #WAMACO отреагировална Andrey Efimov в Какие статьи вы хотели бы видеть в блогах?   
    Написал статейку по вашей теме [Google Play] Публикация приложения в Google Play
  17. Like
    #WAMACO отреагировална AngryOwl в кнопка поверх ListView   
    И [brunnengi] и [ZuBy] оба правы.
    В первом случае у TLayout нужно выключить свойсвто HitTest, чтобы сам TLayout не "перекрывал" клики мышь (или тапы) (TLayout  позволит "выравнивать" несколько "кнопок" относительно друг друга проще)
    Во втором случае - все проще (любой лишний компонент на форме, не важно - в составе чего он, - это дополнительная память, а главное - расходы на отрисовку. Порой нам кажется, что вроде на форме и "нет ничего", а если копнуть поглубже - там окажется море того, чего мы не видим, а отрисовывать то их прийдется!). Простой TImage, на мой взгляд, лучше.
    Но, как мне кажется, в данном случае вовсе не обязательно обрабатывать выравнивание в событии OnResize.
    Достаточно в DesignTime разместить TImage (все) где нужно и установить его (их) свойство Anchors = [akRight, akBottom] (для Вашего случая)
  18. Like
    #WAMACO отреагировална HyperZen в Возвращаясь к вопросу о подсчете высоты текста TListView   
    Ярослав! Все работает как надо, но при некоторых размерах шрифта (я подозреваю те размеры, про которые мы писали выше) все-таки вычисления некорректны - это касается платформы Windows.
    На конкретном устройстве - все работает корректно с любым размером шрифтов!
  19. Like
    #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;
  20. Like
    #WAMACO получил реакцию от walexw в Разместить в Play Market   
    http://developer.alexanderklimov.ru/android/publish.php
     
    https://support.google.com/googleplay/android-developer/answer/113469?hl=ru
  21. Like
    #WAMACO получил реакцию от Kitty в Разместить в Play Market   
    http://developer.alexanderklimov.ru/android/publish.php
     
    https://support.google.com/googleplay/android-developer/answer/113469?hl=ru
  22. Like
    #WAMACO отреагировална Евгений Корепов в Проблемы с отрисовкой   
    В приведенном коде процедура FormCreate:
    procedure TFormMain.FormCreate(Sender: TObject); begin Timer.Interval:=10; Хотя такой короткий не нужен для большинства случаев.
  23. Like
    #WAMACO отреагировална Pax Beach в Berlin жутко тормозит   
    Win 10 x64, 12 GB.
    Проекты вынес на SSD.
    При работе с проектами, выключаю антивирус, отключаю синхронизацию облака.
    Берлин компилит проекты под Android быстрее Сиэтла. Под Windows и так моментально.
    Никаких тормозов в работе часами не увидел.
     
  24. Like
    #WAMACO получил реакцию от bigjorj в Правильная ли практика применения!   
    я вообще отказался от grid и перешел на ListView даже для десктопа (особенно приятен в berlin), все быстро, память не кушает
  25. Like
    #WAMACO получил реакцию от Andrey Efimov в Правильная ли практика применения!   
    я вообще отказался от grid и перешел на ListView даже для десктопа (особенно приятен в berlin), все быстро, память не кушает
×
×
  • Создать...