-
Постов
553 -
Зарегистрирован
-
Посещение
-
Победитель дней
35
Активность репутации
-
rareMax получил реакцию от Hevard в Предупреждение MessageDlg
FMX.Dialogs procedure ShowMsgYesNo; begin { Show a multiple-button alert that triggers different code blocks according to your input } TDialogService.MessageDialog('Choose a button:', System.UITypes.TMsgDlgType.mtInformation, [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], System.UITypes.TMsgDlgBtn.mbYes, 0, // Use an anonymous method to make sure the acknowledgment appears as expected. procedure(const AResult: TModalResult) begin case AResult of { Detect which button was pushed and show a different message } mrYES: ShowMessage('You chose Yes'); mrNo: ShowMessage('You chose No'); end; end); end;
-
rareMax отреагировална ENERGY в [Отклонение] TFloatAnimation и TFrame
Столкнулся с такой же проблемой, если любой компонент (в моем случае TImage ) лежит на фрейме не работает TFloatAnimation вообще.
Решение:
При создании фрейма нужно указывать Self формы, а не nil.
: MyFrame := TMyFrame.Create(Self);
-
rareMax отреагировална RoschinSpb в Загрузка иконок в TimageList из файла
Загрузка картинки будет выглядеть примерно так.
procedure TForm11.Button2Click(Sender: TObject); const SourceName = 'Картинка'; procedure LoadPicture(const Source: TCustomSourceItem; const Scale: Single; const FileName: string); var BitmapItem: TCustomBitmapItem; TmpBitmap: TBitmap; begin BitmapItem := Source.MultiResBitmap.ItemByScale(Scale, True, True); if BitmapItem = nil then begin BitmapItem := Source.MultiResBitmap.Add; BitmapItem.Scale := Scale; end; BitmapItem.FileName := FileName; TmpBitmap := BitmapItem.CreateBitmap; try if TmpBitmap <> nil then BitmapItem.Bitmap.Assign(TmpBitmap); finally TmpBitmap.Free; end; end; var NewSource: TCustomSourceItem; NewDestination: TCustomDestinationItem; NewLayer: TLayer; begin if ImageList1.Source.IndexOf(SourceName) = -1 then begin NewSource := ImageList1.Source.Add; NewSource.Name := SourceName; NewSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia; NewSource.MultiResBitmap.SizeKind := TSizeKind.Custom; NewSource.MultiResBitmap.Width := 16; NewSource.MultiResBitmap.Height := 16; LoadPicture(NewSource, 1, 'D:\Мои веселые картинки\Icons\16x16\alarm16.bmp'); LoadPicture(NewSource, 1.5, 'D:\Мои веселые картинки\Icons\24x24\alarm24.bmp'); NewDestination := ImageList1.Destination.Add; NewLayer := NewDestination.Layers.Add; NewLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, NewSource.MultiResBitmap.Width, NewSource.MultiResBitmap.Height); NewLayer.Name := SourceName; ControlAction1.ImageIndex := NewDestination.Index; end; end; Здесь как видно грузится деве картинки 16х16 и 24х24, при этом используются масштабы 1 и 1,5. После загрузки меняется свойство ImageIndex у действия ControlAction1. Загруженная картинка должна автоматом появится на всех кнопках, которые используют ControlAction1.
-
rareMax получил реакцию от Валерий Ильин в Предупреждение MessageDlg
FMX.Dialogs procedure ShowMsgYesNo; begin { Show a multiple-button alert that triggers different code blocks according to your input } TDialogService.MessageDialog('Choose a button:', System.UITypes.TMsgDlgType.mtInformation, [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], System.UITypes.TMsgDlgBtn.mbYes, 0, // Use an anonymous method to make sure the acknowledgment appears as expected. procedure(const AResult: TModalResult) begin case AResult of { Detect which button was pushed and show a different message } mrYES: ShowMessage('You chose Yes'); mrNo: ShowMessage('You chose No'); end; end); end;
-
rareMax получил реакцию от MrAnderson в [TScrollBox] Возврат toolbar'a при лёгкой прокрутке вверх
Source code e APK Link: Codice sorgente Delphi XE7
Link: Demo APK (da installare sul vostro dispositivo Android) -
rareMax получил реакцию от x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Боту могут много человек одновременно писать. Для этого от сервера возвращается не один объект Update, а массив таких объектов.
Событие OnUpdates - возвращает скоп таких обновлений. Событие OnUpdate - перебирает массив и вызывается для каждого элемента(массива)
Для чего: OnUpdate - тебе не придется запускать цикл, ты работаешь напрямую с объектом. OnUpdates - был случай, когда необходимо было этот массив событий отправить в TParallel.For. Раз понадобился мне - возможно и вам понадобится.
-
rareMax получил реакцию от Barbanel в Telega π - Библиотека для работы с Telegram Bot API в Delphi
https://www.native-english.ru/grammar/english-nouns-plural
https://core.telegram.org/bots/api#getting-updates
-
rareMax получил реакцию от Anatoliy в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Мне очень неудобно, что я не обновил статью. На самом деле с этой библиотекой произошло очень много изменений с проектом:
- переехал на битБакет: https://bitbucket.org/RareGods/cloudapi/src/master/
- теперь там не только работа с телеграмом, но и другие сервисы
- после выхода Delphi CE позволил себе вырезать работу с сетевыми библиотеками, отличными от System.Net.
- пофиксил больше багов чем добавил.
На вскидку это все. На вопросы оперативно отвечаем в телеграм-чате : @CloudAPI.
-
rareMax получил реакцию от AngryOwl в 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
-
rareMax получил реакцию от МихаилЪ чайковЪ в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Автор: Максим Сысоев
Репозиторий: Github
Связь со мной: Telegram
Telega π - Библиотека для работы с Telegram Bot API в Delphi
Библиотека для работы с Telegram Bot API
Зависимости
RAD Studio CE CloudAPI Примеры
Получение Username бота
program Project5; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils; var Telegram: TTelegramBot; begin Telegram := TTelegramBot.Create({$I TokenTelegramBot.inc}); try { TODO -oUser -cConsole Main : Insert code here } Writeln(Telegram.getMe.Username); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; Telegram.Free; end. Пример автоответчика
Напишите ему "привет"
Код: https://gist.github.com/ms301/c7281f443f481115b7643116535e697d
-
rareMax получил реакцию от Superator в Через NetHTTPClient передать фотографию на сервер
В общем рабочее время подходит к концу - поэтому держи:
Function SampleSendFile(Const Url, FileName: String): Boolean; var lHttp: THTTPClient; lSendData: TMultipartFormData; lResponse: IHTTPResponse; Begin lHttp := THTTPClient.Create; lSendData := TMultipartFormData.Create; try lSendData.AddFile('FileField', FileName); lResponse := lHttp.Post(Url, lSendData); Result := lResponse.StatusCode = 200; finally lSendData.Free; lHttp.Free; end; End;
-
rareMax получил реакцию от Евгений Корепов в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Мне очень неудобно, что я не обновил статью. На самом деле с этой библиотекой произошло очень много изменений с проектом:
- переехал на битБакет: https://bitbucket.org/RareGods/cloudapi/src/master/
- теперь там не только работа с телеграмом, но и другие сервисы
- после выхода Delphi CE позволил себе вырезать работу с сетевыми библиотеками, отличными от System.Net.
- пофиксил больше багов чем добавил.
На вскидку это все. На вопросы оперативно отвечаем в телеграм-чате : @CloudAPI.
-
rareMax получил реакцию от Евгений Корепов в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Автор: Максим Сысоев
Репозиторий: Github
Связь со мной: Telegram
Telega π - Библиотека для работы с Telegram Bot API в Delphi
Библиотека для работы с Telegram Bot API
Зависимости
RAD Studio CE CloudAPI Примеры
Получение Username бота
program Project5; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils; var Telegram: TTelegramBot; begin Telegram := TTelegramBot.Create({$I TokenTelegramBot.inc}); try { TODO -oUser -cConsole Main : Insert code here } Writeln(Telegram.getMe.Username); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; Telegram.Free; end. Пример автоответчика
Напишите ему "привет"
Код: https://gist.github.com/ms301/c7281f443f481115b7643116535e697d
-
rareMax получил реакцию от x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Пропущен тип Telegapi.types или типа того.
Вроде писал, что оперативная поддержка в телеграм-чате осуществляется. А на сайте я не постоянно нахожусь.
Да
Ты прав, в ближайшее время напишу.
Максим Сысоев?:
Все еще бета версия. Не стоит меня винить, если в продакшене пойдет что-либо не так библиотекой!
⚙️GIT: https://bitbucket.org/RareGods/cloudapi/branch/develop
?ZIP: https://bitbucket.org/RareGods/cloudapi/get/develop.zip
?Установка: https://bitbucket.org/RareGods/cloudapi/wiki/Установка
?Баг-репорт: https://bitbucket.org/RareGods/cloudapi/issues/new. Регистрация необязательна.
?Delphi Community Edition: https://www.embarcadero.com/ru/products/delphi/starter (Win32/Win64/iOS/Mac/Android) FREE
-
rareMax получил реакцию от x11 в 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
-
rareMax получил реакцию от x11 в Telega π - Библиотека для работы с Telegram Bot API в Delphi
Автор: Максим Сысоев
Репозиторий: Github
Связь со мной: Telegram
Telega π - Библиотека для работы с Telegram Bot API в Delphi
Библиотека для работы с Telegram Bot API
Зависимости
RAD Studio CE CloudAPI Примеры
Получение Username бота
program Project5; {$APPTYPE CONSOLE} {$R *.res} uses TelegaPi.Bot, TelegaPi.Types, System.SysUtils; var Telegram: TTelegramBot; begin Telegram := TTelegramBot.Create({$I TokenTelegramBot.inc}); try { TODO -oUser -cConsole Main : Insert code here } Writeln(Telegram.getMe.Username); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; Telegram.Free; end. Пример автоответчика
Напишите ему "привет"
Код: https://gist.github.com/ms301/c7281f443f481115b7643116535e697d
-
rareMax получил реакцию от Евгений Корепов в [Android] как вы решаете проблему с таймаутом?
System.Net.HttpClient.THttpClient попробуй
-
rareMax получил реакцию от Yarpda в [Android] как вы решаете проблему с таймаутом?
System.Net.HttpClient.THttpClient попробуй
-
rareMax получил реакцию от Superator в Как сделать плиточное меню в приложении?
ModernListView
GridLayout(в названии мог ошибиться)
Либо на скроллБокс кидаешь нужные тебе компоненты.
-
rareMax отреагировална dnekrasov в Изменить цвет пикспля на bitmape image
var bmd: TBitmapData; bmp: TBitmap; c, c1: TAlphaColor; x, y: Integer; ... bmp.Map(TMapAccess.ReadWrite, bmd); try c1 := bmd.GetPixel(x, y); bmd.SetPixel(x, y, c); finally bmp.Unmap(bmd); end;
-
rareMax отреагировална AliZairov в Native Android VideoView
Привет. Поддерживает прямая и m3u видео ссылку.
-
rareMax отреагировална AliZairov в Native Android VideoView
Здравствуйте. К сожалению, есть некоторые ошибки.
1) К сожалению, компонент Align и Anchor не реагирует.
2) Распространяйте объекты в Layouta и это не работает должным образом.
3) Если размер видео небольшой, он остается черным, как на картинке.
if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, FScreenService) then FScale := FScreenService.GetScreenScale else FScale := 1; procedure Load; begin {$IFDEF ANDROID} CallInUIThreadAndWaitFinishing( procedure begin { VideoView } FJVideoParams := TJViewGroup_LayoutParams.JavaClass.init(Round(Width * FScale), Round(Height * FScale)); FJVideoView := TJVideoView.JavaClass.init(TAndroidHelper.Context); FJVideoView.setLayoutParams(FJVideoParams); FJVideoView.setBackgroundColor(TJColor.JavaClass.BLACK); if Visible = True then begin Visible := False; FJVideoView.setVisibility(TJView.JavaClass.VISIBLE); end else begin FJVideoView.setVisibility(TJView.JavaClass.INVISIBLE); end; { Control } FJNativeLayout := TJNativeLayout.JavaClass.Init(TAndroidHelper.Activity, MainActivity.getWindow.getDecorView.getWindowToken); FJNativeLayout.setControl(FJVideoView); FJNativeLayout.setPosition(Round(Position.X * FScale), Round(Position.Y * FScale)); FJNativeLayout.setSize(Round(Width * FScale), Round(Height * FScale)); end); {$ENDIF} end; // http://techslides.com/demos/sample-videos/small.3gp 4) Trackbar не меняет позицию.
procedure TMain.TrackBar1Change(Sender: TObject); begin Label1.Text := MSToTime(TrackBar1.Value); //V.setPosition(TrackBar1.Value); // Когда вы его активируете, это создает проблемы. end; -
rareMax отреагировална Barbanel в Идентификация устройства
Всем доброго времени!
Как и обещал, выкладываю либы для работы с KeyChain.
Либы были взяты у братьев-китайцев, ни слова про покупку сказано не было (хотя чтобы выкачать их пришлось заплатить какому-то облачному сервису).
Использовать просто, за все отвечают три функции:
function StoreItemToKeychain(const AServiceName, AKey, AValue: string; const bOverride: Boolean=True): Boolean; function GetItemValueFromKeychain(const AServiceName, AKey: string): string; function DeleteItemFromKeychain(const AServiceName, AKey: string): Boolean; Ну и традиционно нужно подключить саму библиотеку, все находится в аттаче.
Enjoy! ?
iOS_KeyChain.zip
-
-
rareMax получил реакцию от dnekrasov в Проблемы с размерами компонентов.
Помимо свойства Align используйте TLayout для группировки компонентов. Приложите простую демку - и возможно вам покажут как сделать пропорциональное изменение дизайна.
Еще обратите внимание на компонент TScaledLayout - он изменяет размеры всех дочерних контролов пропорционально изменению своих размеров