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

Tumaso

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

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

  • Посещение

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

    39

Сообщения, опубликованные Tumaso

  1. Всё никак не могу разобраться, как все таки отправлять данные через TNetHTTPClient на сервер, сжатые gzip

    В исходниках модуля System.Net.HttpClient видно, что компонент умеет распаковывать сжатые данные, пришедшие от сервера. А как самому правильно сжать отправляемые данные на сервер?

  2. Увы, но нет проблем вытащить пароль из apk, если он лежит в открытом виде. Подпись приложения этому никак не препятствует (подпись гарантирует только отсутствие изменений, но не более того).

    Пароль внутри кода однозначно нужно хранить в разобранном виде, чтобы его было как можно сложнее узнать. Идеальный вариант - получать зашифрованный пароль с сервера, причем с использованием временных ключей шифрования.

  3. 2 часа назад, CyberStorm сказал:

    Поставил новую версию делфей. Решил перекомпилить свои предыдущие проекты, при вызове рекламного модуля:
        BannerAd1.LoadAd;

    вываливается ошибка: Java class JAdSize could not be found

    Если тот же BannerAd создавать в новом проекте - то все Ок.

    Как такое может быть?

    Попробуй в дереве проекта кликнуть правой клавишей мышки на узле Target platforms->Android->Libraries, в появившемся меню выбрать Revert System Files to Default

    И после этого ребилдни проект

  4. 45 минут назад, Akad сказал:

    А есть какие-нибудь демки? Главное, что бы хеловорд apk не весил 5-10Мб и не тормозил на старых аппаратах безбожно, как FMX. И что с сервисами под андроид?
     

    Размер apk/ipa как раз не главное, пусть хелловорд хоть 50 мб весит. Главное чтобы все быстро и надежно работало.

    Ждем вебинара.

  5. Асинхронность работает надежно даже в андроид :)

    Вопрос в другом - каким образом вы будете непосредственно заполнять комбобоксы загруженными списками. тут либо с использованием synchronize либо через внутренние списки в потоках (откуда главный поток по готовности сам заполняет комбобоксы)

  6. 33 минуты назад, DMS сказал:

    Здравствуйте!
    Как сделать такое приложение на Андроиде, чтобы было удобно ввести значения для множества полей TEdit?
    На форме больше 10 эдитов друг под другом (различные поля). Когда спускаемся к 8-му эдиту, то при выплывании клавиатуры не видно, что мы вводим в эдите.

    Как выйти из положения?

    Определяй, не перекрывается ли активный TEdit клавиатурой. Если перекрывается, то смещай все едиты вверх, чтобы было видно, в какое поле и что вводишь.

    Я бы разместил все TEdit например на TRectangle, ловил событие FormVirtualKeyboardShown, определял размеры перекрываемой области и в случае необходимости двигал TRectangle. А на событие FormVirtualKeyboardHidden возвращал бы все назад.

    Тут только есть нюанс - FormVirtualKeyboardShown не всегда вызывается с правильными размерами (Эмбе над этим еще видимо долго работать))) ), поэтому нужно отдельно хранить правильное значение размеров клавиатуры (оно возвращается при первом вызове FormVirtualKeyboardShown)

  7. В 03.03.2018 в 04:58, Pulsarius сказал:

    Я тоже с этим не согласен. Почти все терминалы, кассовые ПК и т.п. работают на Linux'е и в основном на ARM. Им нужно делать поддержку и x64, и ARM Linux. Иначе действительно смысла нет, если делать только x64. Я больше сторонник C/C++, т.к. это уже вроде как стандарт и код на этом языке можно перенести хоть куда, если конечно не использовать библиотеки среды, а на Delphi перенос уже более ограниченный. Да и, мне кажется, C/C++ более гибкие языки, на них можно писать от системных драйверов режима ядра до высокоуровневых приложений.

    Да ты, батенька, оптимист. Большинство терминалов и кассовых ПК работают на винде XP )))

  8. 12 минуты назад, mazayhin сказал:

    Только лучше использовать THTTPClient

    да, согласен

    1 минуту назад, DMS сказал:

    Tumaso, спасибо!

    Получается, необязательно использовать асинхронный NetHTTPClient? Можно использовать синхронный, но запустить во TThread

    именно так, только замените TNetHTTPClient на THTTPClient

     

  9. DMS,
    простейший пример (без обработки эксепшенов) отдельного класса на базе TThread:

    Скрытый текст


    
    type
      TAsyncHttp = class(TThread)
      private
        FCritical: TCriticalSection;
        [volatile] FCommand: string;
        [volatile] FIsReady: Boolean;
        FHttpClient: TNetHTTPClient;
        function GetIsReady: Boolean;
        procedure SerIsReady(Value: Boolean);
        function GetCommand: string;
        procedure SetCommand(Value: string);
        procedure Post;
      protected
        procedure Execute; override;
      public
        property Command: string read GetCommand write SetCommand;
        property IsReady: Boolean read GetIsReady;
        constructor Create;
        destructor Destroy; override;
        procedure Lock; inline;
        procedure UnLock; inline;
      end;
    
    function TAsyncHttp.GetIsReady: Boolean;
    begin
      Lock;
      try
        Result := FIsReady;
      finally
        UnLock;
      end;
    end;
    
    procedure TAsyncHttp.SetIsReady(Value: Boolean);
    begin
      Lock;
      try
        FIsReady := Value;
      finally
        UnLock;
      end;
    end;
    
    function TAsyncHttp.GetCommand: string;
    begin
      Lock;
      try
        Result := FCommand;
      finally
        UnLock;
      end;
    end;
    
    procedure TAsyncHttp.SetCommand(Value: string);
    begin
      Lock;
      try
        FCommand := Value;
      finally
        UnLock;
      end;
    end;
    
    procedure TAsyncHttp.Post;
    var
      LUrl: string;
      LSource: TStrings;
      LResult: TStringStream;
    begin
      Lock;
      try
        LUrl := FCommand;
        FCommand := '';
        FIsReady := False;
      finally
        UnLock;
      end;
      LSource := TStrings.Create;
      try
        LResult := TStringStream.Create;
        try
          FHttpClient.Post(LUrl, LSource, LResult);
          {
            todo : здесь добавить код, который возвращает в нужном виде ответ.
            Можно через Synchronize, можно через callback,
            а можно просто заполнить дополнительное свойство в этом потоке, а главный поток потом считает при IsReady = True
          }
        finally
          LResult.DisposeOf;
        end;
      finally
        LSource.DisposeOf;
      end;
      SetIsReady(True);
    end;
    
    procedure TAsyncHttp.Execute;
    begin
      while not Terminate do
      begin
        if Command <> '' then
          Post;
        Sleep(1);
      end;
    end;
    
    constructor TAsyncHttp.Create;
    begin
      inherited Create(True);
      FCritical := TCriticalSection.Create;
      FHttpClient := TNetHTTPClient.Create(nil);
      FHttpClient.Asynchronous := False;
      FCommand := '';
      FIsReady := True;
    end;
    
    destructor TAsyncHttp.Destroy;
    begin
      try
        FHttpClient.DisposeOf;
        FCritical.DisposeOf;
      finally
        inherited Destroy;
      end;
    end;
    
    procedure TAsyncHttp.Lock;
    begin
      FCritical.Acquire;
    end;
    
    procedure TAsyncHttp.UnLock;
    begin
      FCritical.Release;
    end;

     

    В основном потоке создаешь нужное количество экземпляров (можно начать с одного), запускаешь, потом при необходимостии передаешь команду на выполнение/получаешь ответ выполненной команды. например так (простейший пример):

    LThread := TAsyncHttp.Create;

    LThread.Start;

    LThread.Command := 'http://www.site.com/data?param=value';

    while not LThread.IsReady do

     Sleep(1);

  10. Если ты сам руками удаляешь компоненты, то правильнее их будет создавать так:

    control := TEdit.Create(nil);

    control.Parent := parent;

    уничтожаю контролы через .DisposeOf (но с таким способом уничтожения согласны не все)

  11. А меня System.JSON полностью устраивает. Ошибок парсинга валидных данных не было ни разу, скорость на нормальном уровне. Гигабайтные данные правда не парсирую, но мне это и не нужно

×
×
  • Создать...