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

aleksandrguru

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

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

  • Посещение

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

    2

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

  1. Like
    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 внутри сервиса.
  2. Like
    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 мб )
     
  3. Like
    aleksandrguru отреагировална master webs в Запустить приложение из сервиса или показать форму   
    Notification.SoundName
  4. Like
    aleksandrguru отреагировална Andrey Efimov в Delphi XE8 автозагрузка приложения в Android   
    Я, другого способа не знаю, может уже и есть, но мне на глаза не попадался, поэтому написал способ, который точно должен сработать.   Про компонент: Ресейвер можно прописывать через манифест, а можно регистрировать во время работы приложения. Отличия в том: что через манифест ресейвер статичен, т.е. он всегда будет существовать и принимать сообщения, даже когда приложение закрыто а регистрация во время работы приложения, позволяет создать временный ресейвер, который будет работать, только если приложение уже запущено По поводу ошибки, точно не подскажу, возможно, это из-за того, что в манифесте указан не существующий java-класс.     p.s. В XE7-XE8 задача склеивания с файлом classes.dex значительно упрощена.   Полезные статьи: Как добавить jar библиотеку в проект (XE7-XE8) Как подключить и использовать свой JAVA-класс (общая инфа) Как создавать обёртки для JAVA-кода (ручной способ, ещё до появления утилиты)
  5. Like
    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; Держи
  6. Like
    aleksandrguru отреагировална R.is в [TidHTTP] Почему IdHttp1.Get может выдавать 404 ошибку, файл не найден?   
    Большое вам спасибо все отлично работает))
  7. Like
    aleksandrguru получил реакцию от kratos23 в Создание стилей runtime   
    Короче такая беда , листбокс красивый добавляю свои объекты через стили все там расставляю выравниваю , и тут мне вдруг захотелось поменять какието цвета или сделать сменные шаблоны ,а там графика которую уже не вытащить , или  в каждом шаблоне все эти объекты добавлять и  настраивать))) да это с ума сойдешь , или создаю лист бокс программно, тогда проблема с расположение элементов как все это программно расставить)) ладно берем битмап эдитор зачем картинок столько?? х15 х20  их что все править нужно?? можно было одну сделать самую большого размера а далее программа сама уменьшала бы и вычисляла положения))) короче хотелось програмно создать красивый листбокс, листбокс сделал только немогу на нем все расставить нормально , непойму как это сделать  
  8. Like
    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
  9. Like
    aleksandrguru получил реакцию от Streletz в Как сделать виджет   
    Подскажите как сделать виджет своей программы  спасибо
  10. Like
    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) для быстрого и удобного создания своих аниматоров. Общая чистка кода.
  11. Like
    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" должна быть создана заранее или программно.
  12. Like
    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
  13. Like
    aleksandrguru отреагировална Brovin Yaroslav в Видео проигрыватель VLC для Андроид   
    Компонент проигрывания всех современных форматов Видео/Аудио/потоков для Андроида.
     
    Автор: Flash AV Software Corp.
    Тип лицензии: коммерческая
    Ссылка: http://www.flashavconverter.com/content/vlc-player-android-10
    Скачать Trial: ZIP
     
  14. Like
    aleksandrguru отреагировална xenon54 в [FGX] Предложения о разработке компонентов   
    10к строк кода приложение для IOS ничего не падает и не виснет 
     
    Хотя канеш изрядно пришлось потрахаться с решением вопросов освобождения памяти...
  15. Like
    aleksandrguru получил реакцию от Satellite в [FGX] Предложения о разработке компонентов   
    держи тогда
    FMX.InterstitialAd.Android.zip
  16. Like
    aleksandrguru получил реакцию от kidrock1 в [FGX] Предложения о разработке компонентов   
    Ярослав может запилить типа маркета компонентов, с удовольствием бы покупал за разумную цену, многие замечал делают так удобно отсортировать все по категориям и выставить за денюжку, и всем хорошо, у людей и смысл был бы писать компоненты, и зарабатывать., и Delphi развивалась бы
  17. Like
    aleksandrguru получил реакцию от Вячеслав в [FGX] Предложения о разработке компонентов   
    Ярослав может запилить типа маркета компонентов, с удовольствием бы покупал за разумную цену, многие замечал делают так удобно отсортировать все по категориям и выставить за денюжку, и всем хорошо, у людей и смысл был бы писать компоненты, и зарабатывать., и Delphi развивалась бы
  18. Like
    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; я гарантирую что Вам это понадобится )
  19. Like
    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.
  20. Like
    aleksandrguru отреагировална xenon54 в Очередной вопрос про удаление объектов в ARC   
    "[Weak] FOwner: TComponent;" такое объявление делает так что RefCount не увеличивается от этой ссылки.
  21. Like
    aleksandrguru отреагировална Brovin Yaroslav в [XE7] [Отклонение] Не удается запустить приложение на Android 5.0   
    Hot Fix исправляющий проблему запуска приложений на Android 5.0 (Lollipop)
  22. Like
    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.
  23. Like
    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&registerType=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, что бы возвращался объект конкретного типа. 
  24. Like
    aleksandrguru отреагировална ruslan в [Android] Как узнать мой IP адрес?   
    можно куда проще 
    ip:= IdHttp.get('http://icanhazip.com/');
  25. Like
×
×
  • Создать...