-
Постов
96 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Активность репутации
-
aleksandrguru отреагировална Rusland в "Общение" сервиса и приложения через intent
Для ищущих ответа:
Есть стандартное demo Object Pascal\Mobile Snippets\AndroidIntents\AndroidIntentsGroup.groupproj, в котором показано как из одного приложения передавать данные другому. С помощью этого примера удалось передавать данные из сервиса в основное приложение.
В юните основного приложения пишем:
uses FMX.Platform, FMX.Platform.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.Os, Androidapi.Helpers, System.Messaging, Androidapi.JNI.GraphicsContentViewText; private { Private declarations } function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); function HandleIntentAction(const Data: JIntent): Boolean; procedure TForm1.FormCreate(Sender: TObject); var AppEventService: IFMXApplicationEventService; begin ... if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, AppEventService) then AppEventService.SetApplicationEventHandler(HandleAppEvent); // Register the type of intent action that we want to be able to receive. // Note: A corresponding <action> tag must also exist in the <intent-filter> section of AndroidManifest.template.xml. MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW); TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedNotification, HandleActivityMessage); end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin if M is TMessageReceivedNotification then HandleIntentAction(TMessageReceivedNotification(M).Value); end; function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var StartupIntent: JIntent; begin Result := False; if AAppEvent = TApplicationEvent.BecameActive then begin StartupIntent := MainActivity.getIntent; if StartupIntent <> nil then HandleIntentAction(StartupIntent); end; end; function TForm1.HandleIntentAction(const Data: JIntent): Boolean; var Extras: JBundle; begin Result := False; if Data <> nil then begin Memo1.ClearContent; // записываем в Memo пришедшее сообщение Extras := Data.getExtras; if Extras <> nil then Memo1.Text := JStringToString(Extras.getString(TJIntent.JavaClass.EXTRA_TEXT)); Invalidate; end; end; в AndroidManifest.template.xml добавляем
<action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="text/pas" /> Отправка сообщения из сервиса делается так:
SendTextViaIntent('Hello from service'); procedure TAndroidServiceDM.SendTextViaIntent(const AText: string); var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setType(StringToJString('text/pas')); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); // добавил такой флаг, без него сервис затыкался Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(AText)); if TJContextWrapper.Wrap(System.JavaContext).getPackageManager.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size > 0 then TJContextWrapper.Wrap(System.JavaContext).startActivity(Intent); // заменил MainActivity на TJContextWrapper.Wrap(System.JavaContext), т.к. это сервис end; Работает исправно, хоть 100%-ую правильность кода не гарантирую Но как передать сообщение из основной программы обратно в сервис я пока не знаю. Также делать хендл внутри сервиса?
Попытался просто добавить FMX.Platform, в результате получаю ошибку в FMX.Platform.Android вываливается ошибка об использовании Activity внутри сервиса. -
aleksandrguru отреагировална Равиль Зарипов (ZuBy) в TMapsEngine
Компонент TMapsEngine
Возможности
Нативный LocationSensor [ANDROID] Геокодинг/Реверс геокодинг через Google API, Yandex API, Here Maps API Построение маршрута через Google Distance API Расчет дистанции по прямой Совместим со стандартным компонентом TLocationSensor
Видео демонстрация
На видео видно как TMapView косячик с миллионом точек, приложение зависло при отрисовке, но с этим ничего не поделать.
Без синхронизации не возможно отрисовать все точки
Исходник
TMapsEngine_source.zip
TMapsEngine_Seattle_10.zip
Скачать APK (долго он там не пролежит, а форум не позволяет загрузить zip размером 7,4 мб )
-
aleksandrguru отреагировална master webs в Запустить приложение из сервиса или показать форму
Notification.SoundName
-
aleksandrguru отреагировална Andrey Efimov в Delphi XE8 автозагрузка приложения в Android
Я, другого способа не знаю, может уже и есть, но мне на глаза не попадался, поэтому написал способ, который точно должен сработать. Про компонент: Ресейвер можно прописывать через манифест, а можно регистрировать во время работы приложения. Отличия в том: что через манифест ресейвер статичен, т.е. он всегда будет существовать и принимать сообщения, даже когда приложение закрыто а регистрация во время работы приложения, позволяет создать временный ресейвер, который будет работать, только если приложение уже запущено По поводу ошибки, точно не подскажу, возможно, это из-за того, что в манифесте указан не существующий java-класс. p.s. В XE7-XE8 задача склеивания с файлом classes.dex значительно упрощена. Полезные статьи: Как добавить jar библиотеку в проект (XE7-XE8) Как подключить и использовать свой JAVA-класс (общая инфа) Как создавать обёртки для JAVA-кода (ручной способ, ещё до появления утилиты) -
aleksandrguru отреагировална Равиль Зарипов (ZuBy) в [TidHTTP] Почему IdHttp1.Get может выдавать 404 ошибку, файл не найден?
function idHttpGet(const aURL: string): string; // uses System.Net.HttpClient, System.Net.HttpClientComponent, System.Net.URLClient; var Resp: TStringStream; Return: IHTTPResponse; begin Result := ''; with TNetHTTPClient.Create(nil) do begin Resp := TStringStream.Create('', TEncoding.ANSI); Return := Get( { TURI.URLEncode } (aURL), Resp); Result := Resp.DataString; Resp.Free; Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(idHttpGet('http://airnav.tj/ru/online/utdd')); end; Держи
-
aleksandrguru отреагировална R.is в [TidHTTP] Почему IdHttp1.Get может выдавать 404 ошибку, файл не найден?
Большое вам спасибо все отлично работает))
-
aleksandrguru получил реакцию от kratos23 в Создание стилей runtime
Короче такая беда , листбокс красивый добавляю свои объекты через стили все там расставляю выравниваю , и тут мне вдруг захотелось поменять какието цвета или сделать сменные шаблоны ,а там графика которую уже не вытащить , или в каждом шаблоне все эти объекты добавлять и настраивать))) да это с ума сойдешь , или создаю лист бокс программно, тогда проблема с расположение элементов как все это программно расставить)) ладно берем битмап эдитор зачем картинок столько?? х15 х20 их что все править нужно?? можно было одну сделать самую большого размера а далее программа сама уменьшала бы и вычисляла положения))) короче хотелось програмно создать красивый листбокс, листбокс сделал только немогу на нем все расставить нормально , непойму как это сделать
-
aleksandrguru отреагировална Равиль Зарипов (ZuBy) в ListView Color Helper
Привет Всем!
Много тем на форуме про раскраску TListView, нашел в интернете решение и доработал его
Вот что получилось
LV_Helper.zip ColorListView.zip
Доступно для Seattle
ListView1.SetColorItemSelected(TAlphaColorRec.Orangered); //выделенный ListView1.SetColorItemFill(TAlphaColorRec.Gray); // обычный цвет Item ListView1.SetColorItemFillAlt(TAlphaColorRec.Lightgrey); // альтернативный цвет Item ListView1.SetColorBackground(TAlphaColorRec.Black); // цвет самого TListView ListView1.SetColorItemSeparator(TAlphaColorRec.Lightgray); // Линия разделения Item'ов ListView1.SetColorText(TAlphaColorRec.Red); // Обычный текст ListView1.SetColorTextSelected(TAlphaColorRec.White); // выделенный текст ListView1.SetColorTextDetail(TAlphaColorRec.Yellow); // текст доп. инфы ListView1.SetColorTextHeader(TAlphaColorRec.Green); // текст заголовка ListView1.SetColorTextHeaderShadow(TAlphaColorRec.Lightgray); // тень текста ListView1.SetColorButtonText(TAlphaColorRec.Orange); // цвет текста кнопки ListView1.SetColorButtonTextPressed(TAlphaColorRec.Orangered); // цвет нажатой кнопки добавлено в Berlin
ListView1.SetColorPullRefresh(TAlphaColorRec.Orange); ListView1.SetColorPullRefreshIndicator(TAlphaColorRec.Orangered); ListView1.SetColorStretchGlow(TAlphaColorRec.Lime); ModernListView.rar
-
aleksandrguru получил реакцию от Streletz в Как сделать виджет
Подскажите как сделать виджет своей программы спасибо
-
aleksandrguru отреагировална Brovin Yaroslav в [XE8] [FGX] Описание версии 0.6.0.46
Ссылка на скачивание (Только для RAD Studio XE8):fgx_0.6.0.46.zip
Инструкция по установке: "Инструкция по установке набора компонентов FGX"
Описание
Эта версия включает в себя следующий набор компонентов:
TfgFlipView (NEW) - слайдер изображений. Поддерживает несколько способов переключения фотографий при помощи эффектов и сдвигов. При первом использовании ОБЯЗАТЕЛЬНО прочитать инструкцию "TfgFlipView - Инструкция загрузки стиля" TfgPositionAnimation (NEW) - анимация свойств типа TPosistion TfgPosition3DAnimation (NEW) - анимация свойств типа TPosition3D TfgBitmapLinkAnimation (NEW) - анимация свойств типа TBitmapLink TfgProgressDialog - Компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения фоновой операции можно оценить. TfgActivityDialog - компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения операции не возможно адекватно оценить. TfgActionSheet - Аналог контекстного меню для мобильных платформ. TfgColorsPanel - Палитра цветов с возможностью выбора цвета. TfgGradientEdit - Компонент выбора градиента. TfgLinkedLabel (UPDATED) - Метка поддерживающая открытие Web ссылки в браузере по умолчанию. TfgApplicationEvents (UPDATED)- компонент с возможностью легко задать обработчики на основные события приложения: Отслеживание смены состояния приложения, простой, обновление и выполнение действий Actions, Изменение ориентации устройства и тд. TfgVirtualKeyboard (UPDATED) - компонент облегчающий работу с виртуальной клавиатурой. Позволяет задать пользовательские кнопки над виртуальной клавиатурой под iOS, а так же отлавливать события по отображению и скрытию клавиатуры. Зарегистрированы все стилевые объекты на вкладке "FGX: Style objects" Новое
TfgFlipView: Добавлен новый компонент для отображения слайдера изображений Поддерживает два принципиально разных способа смены изображений: сдвигом слайдов и смена при помощи широкого набора эффектов Тонкая настройка способов переключения слайдов TfgApplicationEvents: Добавлен перехват дополнительных событий приложения: Оповещение об изменении размера формы (OnFormSizeChanged) Оповещение о необходимости сохранить данные UI формы при изменении состояния приложения. Особенно актуально для мобильных платформ (OnSaveState) Изменение состояния приложения (OnStateChanged) Факт изменения стиля формы (OnStyleChanged) Все формы приложения на старте созданы (OnFormsCreated) Форма приложения разрушается (OnFormReleased) Изменение главной формы (OnMainFormChanged) Изменение заголовка главной формы (OnMainFormCaptionChanged) TfgPositionAnimation: Добавлен новый аниматор, позволяющий легко анимировать позицию 2D контрола Добавлен пример AnimationsDemo.dpr TfgPosition3DAnimation: Добавлен новый аниматор, позволяющий легко анимировать позицию 3D контрола Добавлен пример AnimationsDemo.dpr TfgBitmapLinkAnimation: Добавлен новый аниматор, позволяющий легко анимировать в стилях TBitmapLink. При помощи этого аниматоро легко сделать движущийся фон на базе одной растровой картинки. Добавлен пример AnimationsDemo.dpr TfgLinkedLabel Исправлена ошибка открытия ссылки в стандартном браузере на Андроиде TfgVirtualKeyboard Добавлено новое свойство Visible - видна виртуальная клавиатура или нет Общие улучшения Добавлен шаблонный класс (FGX.Animation.TfgCustomPropertyAnimation) для быстрого и удобного создания своих аниматоров. Общая чистка кода. -
aleksandrguru отреагировална xenon54 в [Android] Отправка сохраненной картинки на сервер
procedure TForm1.Button1Click(Sender: TObject); var http: TIdHTTP; formData: TIdMultipartFormDataStream; begin http := TidHttp.Create(nil); try formData := TIdMultipartFormDataStream.Create; try formData.AddFile('SendFile', 'C:\test.txt', 'text/plain'); formData.AddFormField('action','upload_file'); http.Request.ContentType := 'multipart/form-data'; http.Post('http://test.ru/test.php',formData); finally formData.Free; end; finally http.Free; end; end; PHP:
<? $files_uploaded = 1; foreach ($_FILES as $key => $value) if (move_uploaded_file($_FILES[$key]['tmp_name'], "./uploads/{$files_uploaded}.jpg")) $files_uploaded++; Папка "uploads" должна быть создана заранее или программно.
-
aleksandrguru отреагировална ruslan в Запуск приложения с параметрами.
я бы посоветовал посмотреть как реализована работа с GCM push уведомлениями. декомпильте cloud-messaging.jar, который в {xe7}\lib\android\debug
откройте в андроид студии например. работа с пушами построена, по сути, как это рекомендует делать Google( https://developer.android.com/google/gcm/client.html ).
т.е. есть WakefulBroadcastReceiver( com.embarcadero.gcm.notifications.GCMNotification ), который в манифесте подписывается на intent-filter com.google.android.c2dm.intent.RECEIVE.
когда приходит пуш - ресивер его ловит. если имплементирован т.н. listener( в дельфях по указателю назначен обработчик ), то управление передается ему, т.е. дельфи-приложение(основной активити) принимает intent, который пришел от гугла, и обрабатывает пуш. если лисенер не назначен, то стартует IntentService ( https://developer.android.com/reference/android/app/IntentService.html ), который парсит пришедший интент и вызывает публикацию нотификейшена.
короч, ковыряем исходники и изучаем Android SDK
-
aleksandrguru отреагировална Brovin Yaroslav в Видео проигрыватель VLC для Андроид
Компонент проигрывания всех современных форматов Видео/Аудио/потоков для Андроида.
Автор: Flash AV Software Corp.
Тип лицензии: коммерческая
Ссылка: http://www.flashavconverter.com/content/vlc-player-android-10
Скачать Trial: ZIP
-
aleksandrguru отреагировална xenon54 в [FGX] Предложения о разработке компонентов
10к строк кода приложение для IOS ничего не падает и не виснет
Хотя канеш изрядно пришлось потрахаться с решением вопросов освобождения памяти...
-
aleksandrguru получил реакцию от Satellite в [FGX] Предложения о разработке компонентов
держи тогда
FMX.InterstitialAd.Android.zip
-
aleksandrguru получил реакцию от kidrock1 в [FGX] Предложения о разработке компонентов
Ярослав может запилить типа маркета компонентов, с удовольствием бы покупал за разумную цену, многие замечал делают так удобно отсортировать все по категориям и выставить за денюжку, и всем хорошо, у людей и смысл был бы писать компоненты, и зарабатывать., и Delphi развивалась бы
-
aleksandrguru получил реакцию от Вячеслав в [FGX] Предложения о разработке компонентов
Ярослав может запилить типа маркета компонентов, с удовольствием бы покупал за разумную цену, многие замечал делают так удобно отсортировать все по категориям и выставить за денюжку, и всем хорошо, у людей и смысл был бы писать компоненты, и зарабатывать., и Delphi развивалась бы
-
aleksandrguru отреагировална ruslan в Очередной вопрос про удаление объектов в ARC
ох и сколько же таких "фишечек" я уже видел ...)
мой совет: напишите лучше сразу такую вот штуку для себя:
TObj_helper = class helper for TObject procedure SetRefCount( val: Integer ); end; { TObj_helper } procedure TObj_helper.SetRefCount(val: Integer); begin {$ifdef android} Self.FRefCount:= val; {$endif} end; я гарантирую что Вам это понадобится )
-
aleksandrguru отреагировална xenon54 в Очередной вопрос про удаление объектов в ARC
Сделал еще 1 эксперимент:
procedure TForm1.Button1Click(Sender: TObject); var i, j : Integer; t, t2 : TImage; begin for j := 0 to 200 do begin t := TImage.Create(Form1); t.Parent := form1; t.Width := 50; t.Height := 50; t.Bitmap.LoadFromFile( TPath.Combine(TPath.GetDocumentsPath, '1.jpg') ); t.tag := 11; t := nil; for I := 0 to Form1.ComponentCount-1 do begin if Components[i] is TImage then if Components[i].Tag = 11 then begin t2 := TImage(Components[i]); t2.Parent := nil; t2.Free; t2 := nil; end; end; end; end; Я так понял что я правильно реализовал способ номер 2 из этой темы. При картинке размером в ~200кб приложение крашится после 2-х кликов по кнопке. А вот если Free заменить на DisposeOf, то хоть утыкайся, приложение живет. В этой теме говорится что DisposeOf "форсирует вызов деструктора, но не очищает память выделенную под объект". Что это значит? И почему описанный выше пример не освобождает память?
P.S.: Этот пример для Android, хотя я так понял в этом смысле поведение не отличается для IOS и Android.
-
aleksandrguru отреагировална xenon54 в Очередной вопрос про удаление объектов в ARC
"[Weak] FOwner: TComponent;" такое объявление делает так что RefCount не увеличивается от этой ссылки.
-
aleksandrguru отреагировална Brovin Yaroslav в [XE7] [Отклонение] Не удается запустить приложение на Android 5.0
Hot Fix исправляющий проблему запуска приложений на Android 5.0 (Lollipop)
-
aleksandrguru отреагировална DirtyBorov в [TRESTRequest] Лучшая практика, когда нужно отправить несколько запросов через RESTRequest
По каким то причинам мне не удается прикрепить файл содержащий TWaitControl. Потому просто выложу его код полностью. Благо он совсем короткий.
Модуль универсальный. Его можно использовать не только для REST но и вообще для любых длительных операций которые нужно выполнять в потоках.
Обратите внимание, что в конструктор передается TForm. Это экземпляр ГЛАВНОЙ формы приложения. Это нужно потому что TWaitControl , будет перекрывать главную форму полупрозрачным квадратом, создавая эффект затемнения и заодно делая недоступным разные кнопки на форме. Рекомендую создавать TWaitControl в событии OnCreate главной формы:
TMainForm = class(TForm) private Wait: TWaitControl; end; procedure TMainForm.FormCreate(Sender: TObject); begin Application.OnException := OnException; Wait := TWaitControl.Create(Self); Wait.Title.Text := 'Ждите пожалуйста...'; end; unit Wait.Control; interface uses FMX.Forms, FMX.Objects, FMX.Types, FMX.Effects, FMX.StdCtrls, System.SysUtils, System.Classes, System.UITypes; type TWaitControl = class(TRectangle) private FWindow: TRectangle; FTitle: TLabel; FHadErrors: Boolean; FWaiting: Boolean; procedure DoErrorHandling(E: Exception; AOnError: TProc<TWaitControl, Exception>); procedure DoOnCompleted(AOnComplete: TProc<TWaitControl>); public constructor Create(MainForm: TForm); reintroduce; procedure Run(ATask: TProc<TWaitControl>; AOnComplete: TProc<TWaitControl> = nil; AOnError: TProc<TWaitControl, Exception> = nil); virtual; property Waiting: Boolean read FWaiting; property HadErrors: Boolean read FHadErrors; property Window: TRectangle read FWindow; property Title: TLabel read FTitle; end; implementation { TWaitControl } constructor TWaitControl.Create(MainForm: TForm); begin inherited Create(MainForm); Parent := MainForm; Align := TAlignLayout.Contents; Visible := False; Fill.Color := $4B000000; FWindow := TRectangle.Create(Self); FWindow.Parent := Self; FWindow.Fill.Color := $96000000; FWindow.Align := TAlignLayout.Center; FWindow.Width := 250; FWindow.Height := 65; FTitle := TLabel.Create(FWindow); FTitle.Parent := FWindow; FTitle.Align := TAlignLayout.Client; FTitle.StyledSettings := FTitle.StyledSettings - [TStyledSetting.Size, TStyledSetting.Style]; FTitle.TextSettings.Font.Size := 16; // FTitle.TextSettings.Font.Style := [TFontStyle.fsBold]; with TAniIndicator.Create(FWindow) do begin Parent := FWindow; Style := TAniIndicatorStyle.Circular; Align := TAlignLayout.Left; Margins.Left := 15; Margins.Top := 15; Margins.Right := 15; Margins.Bottom := 15; Width := Height; Enabled := True; end; with TShadowEffect.Create(FWindow) do Parent := FWindow; end; procedure TWaitControl.DoErrorHandling(E: Exception; AOnError: TProc<TWaitControl, Exception>); begin TThread.Synchronize(TThread.CurrentThread, procedure begin FWaiting := False; FHadErrors := True; Visible := False; if Assigned(AOnError) then AOnError(Self, E); end); end; procedure TWaitControl.DoOnCompleted(AOnComplete: TProc<TWaitControl>); begin TThread.Synchronize(nil, procedure begin FWaiting := False; Visible := False; if Assigned(AOnComplete) then AOnComplete(Self); end); end; procedure TWaitControl.Run; begin Visible := True; FWaiting := True; TThread.CreateAnonymousThread( procedure begin try FHadErrors := False; ATask(Self); DoOnCompleted(AOnComplete); except on E:Exception do DoErrorHandling(E, AOnError); end; // DoOnCompleted(AOnComplete); end).Start; end; end. -
aleksandrguru отреагировална DirtyBorov в [TRESTRequest] Лучшая практика, когда нужно отправить несколько запросов через RESTRequest
У вас какая то надуманная проблема. На самом деле "руками" все делается намного проще чем кажется. При этом код будет минимизировать ошибки, потому что он будет типовой, шаблонный. Вот я приведу кусочек код из одной моей программы:
unit Rest.API; interface uses CodeSiteLogging, System.JSON, REST.JsonReflect, Rest.Classes, System.SysUtils, System.Classes, IPPeerClient, REST.Client, REST.Types, Data.Bind.Components, Data.Bind.ObjectScope; type TApiObject = class abstract end; TApiLogin = class(TApiObject) public Login: string; Password: string; end; TRestAPI = class(TDataModule) RESTClient: TRESTClient; RESTRequest: TRESTRequest; RESTResponse: TRESTResponse; private const BaseURL = 'http://bla-bla.com/index.php'; private // Выполняет запрос function Request(ABody: TApiObject): TJSONValue; function SendLogin(ABody: TApiLogin): TJSONValue; function SendRegistry(ABody: TApiUser): TJSONValue; function GetUserInfo(ABody: TApiInfo): TJSONValue; function SetBalance(ABody: TApiBalance): TJSONValue; public function SendRequest(AObject: TApiObject; AOwn: Boolean = true): TJSONValue; end; var RestAPI: TRestAPI; implementation {%CLASSGROUP 'FMX.Controls.TControl'} {$R *.dfm} { TDataHTTP } /// Основная функция отправки json-объекта. она принимает обычный объект и сериализует его в json function TRestAPI.Request(ABody: TApiObject): TJSONValue; var i: integer; begin RESTRequest.ClearBody; RESTRequest.AddBody(ABody); RESTRequest.Execute; /// проверяем ответ сервера if (RESTResponse.StatusCode <> 200) then raise Exception.CreateFmt('Оштбка сервера %d "%s"',[RESTResponse.StatusCode, RESTResponse.StatusText]); /// проверяем, содержит ли ответ json if not Assigned(RESTResponse.JSONValue) then raise Exception.Create('Ответ сервера не содержит подходящих данных'); /// Проверяем, не содержится ли в ответе ошибок Result := RESTResponse.JSONValue.GetValue<TJSONValue>('content'); if not RESTResponse.JSONValue.GetValue<string>('status').Equals('success') then raise Exception.Create(RESTResponse.JSONValue.GetValue<string>('error')); end; /// Так делаем отправку на конкретный URL /// Запрос логина (проверка существования пользователя) function TRestAPI.SendLogin(ABody: TApiLogin): TJSONValue; begin RESTClient.BaseURL := BaseURL + '?act=users&area=login&response=js'; Result := Request(ABody); end; /// регистрация нового пользователя function TRestAPI.SendRegistry(ABody: TApiUser): TJSONValue; begin RESTClient.BaseURL := BaseURL + '?act=terminal&area=create®isterType=2&response=js'; Result := Request(ABody); end; /// Информация о пользователе function TRestAPI.GetUserInfo(ABody: TApiInfo): TJSONValue; begin RESTClient.BaseURL := BaseURL + '?act=terminal&area=info&infoType=2&response=js'; Result := Request(ABody); end; /// Изменить баланс пользователя function TRestAPI.SetBalance(ABody: TApiBalance): TJSONValue; begin RESTClient.BaseURL := BaseURL + '?act=terminal&area=cash&response=js'; Result := Request(ABody); end; /// Это не обязательная функция, она просто упрощает работу. По сути просто вызывает нужную функцию, /// в зависимости от переданного объекта. после отправки запроса, удаляет объект из памяти. function TRestAPI.SendRequest(AObject: TApiObject; AOwn: Boolean): TJSONValue; begin try if (AObject is TApiLogin) then Result := SendLogin(AObject as TApiLogin) else if (AObject is TApiUser) then Result := SendRegistry(AObject as TApiUser) else if (AObject is TApiInfo) then Result := GetUserInfo(AObject as TApiInfo) else if (AObject is TApiBalance) then Result := SetBalance(AObject as TApiBalance) finally if AOwn and Assigned(AObject) then FreeAndNil(AObject); end; end; end. А работать с этим так:
procedure DoLogin(const AUser, APassw: string); var Usr: TApiLogin; Jsn: TJsonObject; begin Usr := TApiLogin.Create; Usr.Login := AUser; Usr.Password := APassw; Jsn := RestAPI.SendRequest(Usr, True); end; Следует заметить, что все запросы возвращают json. Просто потому что мне так было нужно. Однако можно немного изменить функцию Request, что бы возвращался объект конкретного типа.
-
aleksandrguru отреагировална ruslan в [Android] Как узнать мой IP адрес?
можно куда проще
ip:= IdHttp.get('http://icanhazip.com/'); -
aleksandrguru отреагировална Brovin Yaroslav в Подскажите, Почему у меня не освобождается память при выполнении 3D переворота контекста 2D формы
Куда вы убрали?