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

rareMax

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

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

  • Посещение

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

    35

Весь контент rareMax

  1. http://docwiki.embarcadero.com/RADStudio/Seattle/en/Using_the_Parallel_Programming_Library
  2. Уверен что в этом участке кода ошибка вылетает?
  3. program Project12; {$APPTYPE CONSOLE} {$R *.res} uses System.TimeSpan, System.SysUtils; begin Writeln(TTimeSpan.Create(0, 2, 30, 0, 0).TotalMinutes.ToString); Readln; end.
  4. Сейчас попробую на интерфейсы перевести. Если не получится - буду вашим способом пользоваться(хотя для конечного пользователя гемор лишний будет). Спасибо за совет.
  5. Добрый день. Хочу узнать как правильно возвращать объекты в функции, что бы не было утечки памяти. Данная проблема на данный момент воспроизводится в проекте TelegaPI. Ниже упрощенный код с проекта для запросов на сервер: function TTelegramBot.API<T>(const Method: String; Parameters: TDictionary<String, TValue>): T; var lHttp: THTTPClient; lHttpResponse: IHTTPResponse; lApiResponse: TtgApiResponse<T>; lURL_TELEG: String; begin lHttp := THTTPClient.Create; try lURL_TELEG := 'https://api.telegram.org/bot' + FToken + '/' + Method; // Преобразовуем параметры в строку, если нужно if Assigned(Parameters) then lHttpResponse := lHttp.Post(lURL_TELEG, ParamsToFormData(Parameters)) else lHttpResponse := lHttp.Get(lURL_TELEG); lApiResponse := TtgApiResponse<T>.FromJSON(lHttpResponse.ContentAsString); Result := lApiResponse.ResultObject; finally FreeAndNil(lHttp); { Ниже утечка памяти. Если расскоментировать - тогда не будет возращаться результат функций } // if Assigned(lApiResponse) then // lApiResponse.Free; end; end; В таком виде не освобождается lApiResponse - в результате утечка памяти. Если раскоментировать 2 последние строки - тогда в результате функции будет пустой объект. Прошу опытных людей в этом плане рассказать что мне нужно подправить. Спасибо.
  6. В качестве <T> может быть как класс так и простые типы. То есть сделать что то типа Type TtgApiResponse<T:Class>=Class ... немогу. Поэтому прошу показать как можно воспользоваться Assign"ами
  7. Есть код: lApiResponse := TtgApiResponse<T>.Create(Param); try Result := lApiResponse.ResultObject; finally lApiResponse.Free; end; В таком виде в Result просто передается указатель на lApiResponse.ResultObject. А вот как можно скопировать lApiResponse.ResultObject в Result ?
  8. https://www.embarcadero.com/ru/free-tools/ccompiler По ссылке бесплатный компилятор для С++. Функциональность нет ограничена. Компилятор только для Вин32. В общем кто работает с С++ - ознакомьтесь
  9. как будет достаточно времени - попробую от себя сделать описание
  10. Не знаю - поидее можно вручную в своствах проекта указать генерацию заголовочников для плюсов, но сам не полюзуюсь - так что хз скорее это альтернативная замена родных библиотек+некотороые дополнительные классы. Я же вас не заставляю ее использовать. плюсы минусы каждый определяет каждый для себя после работы с ней.
  11. В общем рабочее время подходит к концу - поэтому держи: 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;
  12. Spring4D это библиотека с открытым исходным кодом для Embarcadero Delphi 2010 and higher. It consists of a number of different modules that contain a base class library (common types, interface based collection types, reflection extensions) and a dependency injection framework. It uses the Apache License 2.0. Присоединяйтесь в Spring4D Google Group. Installation Запустите Build.exe, выберите нужные опции и установите Текущая версия 1.2 Известные ошибки Иногда могут показываться ошибки компилятора на мобильных платформах (iOS ARM и Android). Автор: Stefan Glienke Скачать: git clone https://bitbucket.org/sglienke/spring4d.git zip https://bitbucket.org/sglienke/spring4d/downloads
  13. rareMax

    CurrentTime

    procedure TForm4.Button1Click(Sender: TObject); Var LMediaTime: TTimeSpan; begin // Заполняем TTimeSpan LMediaTime := TTimeSpan.Create(MediaPlayer1.CurrentTime); // Выводим инфу в заголовок формы Caption := string.Join(':', [LMediaTime.Minutes, LMediaTime.Seconds, LMediaTime.Milliseconds]); end; procedure TForm4.FormCreate(Sender: TObject); begin // Загружаем медиафайл MediaPlayer1.FileName := 'C:\Users\Public\Music\Sample Music\Maid with the Flaxen Hair.mp3'; // Воспроизводим его MediaPlayer1.Play; end;
  14. Задам вопрос чуть с другой стороны - с андроида тоже пишет за устаревший браузер?
  15. Если Вам только под десктопы надо - то сабж решается через реестр винды.
  16. rareMax

    CurrentTime

    TTimeSpan - попробуй его
  17. Ухх... я вообще надеялся посмотреть на tfgrichedit - но, видимо, не в этом году
  18. Можете еще попробовать связаться с тем пользователем и дать ему попробовать запустить софт, собранный в дебаг-режиме. Возможно более конкретная ошибка вылезет
  19. Можете скинуть линк на софт? Данная ошибка только у одного пользователя появляется?
  20. Извиняюсь за надоедливость - но может есть какая то информация о выходе нового FGX?
  21. В начале пару новостей: Репозиторий клонируется также на ГитХаб. Можно устанавливать с помощью 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
×
×
  • Создать...