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

ENERGY

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

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

  • Посещение

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

    57

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

  1. File > New > MultiDevice Form.

    Также можно кинуть на форму TabControl и делать экраны на его основе, но лучше создавать формы по мере надобности (чтобы не все контролы загружались за раз, а по мере надобности).

    Есть еще фреймы (TFrame) - фрейм можно динамичеcки создавать и показывать на форме или каком либо компоненте (панели, TabControl, layout).

    В FMX также можно менять главную форму, при ее закрытии закроется вся программа : Application.MainForm 

    В вашем случае все просто - создаете 2 формы. Первой основную форму, второй логин форму. Если логин прошел успешно, то из логин формы показываете основную, а логин форму скрываете.

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

    Меню Project > View Source

     

    Вот к примеру в текущем моем проекте (gDataMod - это DataModule на котором лежит скин StyleBook): 

    begin
      GlobalUseGPUCanvas := true;
      Application.Initialize;
      gCore := TCore.Create;
      Application.CreateForm(TDataMod, gDataMod);
      if gCore.Settings.HasSetupInfo then
        Application.CreateForm(TfrmMain, frmMain)
      else
        Application.CreateForm(TfrmSetup, frmSetup);
    
      Application.Run;
      gCore.Free;
    end.

     

  3. Вот вариант, его можно применять в любом месте (обычно в OnCreateForm), не обязательно в DPR. 

    Флаг можно добавлять и удалять.     

    Для обычного запрета выключать экран нужен только лишь флаг FLAG_KEEP_SCREEN_ON, остальные не нужны.
     

    Для Tokyo и возможно поздних версий, CallInUIThread не нужен.

    {$IFDEF ANDROID}
      procedure TurnOnAndKeepScreenAndroid(aEnable: boolean);
      var
        vFlags: integer;
      begin
        vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or
            TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or
            TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or
            TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON;
    
        if aEnable then
        begin
          CallInUIThread (   // uses FMX.Helpers.Android
          procedure
          begin
            TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags);
          end );
        end
        else
          CallInUIThread (
          procedure
          begin
            TAndroidHelper.Activity.getWindow.clearFlags (vFlags);
          end );
      end;
      {$ENDIF}


     

  4. Понял как это делать.

    Устанавливаем высоту кнопки

    procedure TfrmMain.lvFavoritesUpdateObjects(const Sender: TObject; const AItem: TListViewItem);
    var
      TextObject: TListItemDrawable;
    begin
      TextObject := AItem.Objects.FindDrawable('TextButton16');
      if TextObject <> nil then
      begin
        TextObject.Height := 30;
    
      end;
    
    end;

     

  5. Ребят, подскажите как менять высоту у TTextButtonObjectAppearance.

    Я взял пример у Равиля - ModernLIstView. Взял форму с Colorize, поменял ListView Item на Dynamic, добавил TextButton. В Design Time  кнопка изменять размер, а в RunTime она здоровенная на всю высоту Itema. Неужели нельзя в DynamicAppearance работать с этой кнопкой? Мне просто нужно 2 кнопки, почему так все запутанно в FMX...

    Неужели придется ListBox использовать?

     

    Вот кстати в одной из тем Равиль показывал скриншот одной программы, там 2 кнопки, маленького размера. Равиль как вы их сделали? Это просто 2 картинки или Text Button?

    Screenshot_2015-07-30-19-12-07.png

  6. DisposeOf не освобождает память, а просто вызывает деструктор.

    Можно не использовать его, а использовать обычный Close с TCloseAction.caFree.

    Я проверял на мобильном компиляторе (Android) - все уничтожается корректно, срабатывает деструктор формы.

    Обязательно создавать надо форму с Owner nil, иначе форма не уничтожится. 

    frmLoading := TfrmLoading.Create(nil);
    frmLoading.Show;
    
    //В форме:
    
    procedure TfrmLoading.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := TCloseAction.caFree;
    end;
    
    //Уничтожаем:
    
    frmLoading.Close;
    frmLoading := nil;

     

    Если на ARC компиляторах вместо Close, вызвать FreeAndNil(frmLoading)  - форма не уничтожится и останется видимой.

  7. @Евгений Корепов

    Я не собираюсь использовать Error Code, т.к. там может быть проблема с прокси. Но насчет JSON не согласен.

    Не понимаю эти заделы на будущее. Сколько лет уже программирую, и всегда приходилось писать под текущую задачу, а универсальные вещи\классы пылились на полке. Мне напоминает это серванты с посудой и дорогим постельным бельем у наших родителей и бабушек, с надеждой на применение их в лучшем будущем или по особым случаям, которые у многих и не наступают..

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

    Я не сторонник такого подхода, точнее даже категорически против, т.к. универсальность влияет на производительность. Я за принцип бритвы Оккама. Имхо если нужно будет возвращать доп. данные, то их добавить просто, но делать это нужно тогда когда это реально понадобится. Стандартного "ОК или ошибка" вполне достаточно (тем более если появится ошибка, то она будет не в стандарте json\xml, а обычным текстом), для другого будет другой запрос.

    Если бы скрипт возвращал не обычное бинарное подтверждение - да\нет, а какое то значение, тогда было бы лучше использовать json - можно добавить и новые параметры, в новых версиях, не нарушив работу старых версий программы.

  8. function FileSize(const aFilePath: string): Int64;
    var
      vSR : TSearchRec;
    begin
      if FindFirst(aFilePath, faAnyFile, vSR ) = 0 then
      begin
        Result := vSR.Size;
        FindClose(vSR);
      end
      else
         Result := -1;
    end;

    Мультиплатформенный вариант без открытия файла (размер берется из файловой системы).

  9.  

    16 минут назад, Евгений Корепов сказал:

    Не забывайте что между вашим скриптом на php и клиентом есть еще http сервер. Ваш запрос может и не дойти до модуля php, всякое бывает (обслуживание сервера, ddos атака и т.п.). В этом случае вы не сможете понять кто именно прислал вам HTTP status. 

    Понять легко, если использовать не зарезервированные номера. Мануал это и рекомендует, первая цифра класс статуса, остальные 2 свои.

    Другое дело что может быть проблема с прокси серверами. 

  10. 1 час назад, krapotkin сказал:

    есть протокол HTTP, есть ваш протокол, который идет поверх HTTP

    поэтому лучше оставить коды HTTP в покое и передавать все что нужно, в теле ответа. тут уже почти стандарт - к-нить JSON

    Здесь вы не совсем правы. Эти коды и придуманы в том числе и для использования в своих целях.

    Цитата

     RFC 2616: "HTTP status codes are extensible. HTTP applications are not required to understand the meaning of all registered status codes, though such understanding is obviously desirable. However, applications MUST understand the class of any status code, as indicated by the first digit, and treat any unrecognized response as being equivalent to the x00 status code of that class, with the exception that an unrecognized response MUST NOT be cached. For example, if an unrecognized status code of 431 is received by the client, it can safely assume that there was something wrong with its request and treat the response as if it had received a 400 status code."

    Они разделены на классы.

    200 это коды "удачные", 400 "не удачные" итп. Есть зарезервировнные значения, все остальное можно использовать.

    Не спорю, это не так удобно как текст.  Но имхо в таких простых boolean запросах проще использовать текст 'ОК', если это не ОК, значит интепретировать как ошибку, ведь по факту какая нибудь ошибка скрипта отображается простым текстом, без json форматирования. И код станет и прозрачней и быстрее.

    А если понадобится возвращать сложные данные, то это будет уже другой запрос, со своей описанной в доках структурой (json).

  11. 4 часа назад, krapotkin сказал:

    это как-то так себе
    StatusCode - это HTTP коды.

    тут должно бы быть просто 200

    Как вы к примеру подтверждаете из скрипта (напр. PHP) о том что запись добавилась в базу?

    Есть 2 варианта - возвращать нужный код (не вижу причин почему не рекомендуется возвращать свой Custom Error Code, имхо это вполне логично), или возвращать текст (напр. ошибки или "ОК"). Возвращать пустую строку при удачном добавлении при error code 200 на мой взгляд не совсем правильно. Что то пропустите в коде скрипта - что -то отвалиться, и в итоге запись не добавиться, при этом в ответ вернется 200 и пустая строка.

     

    3 часа назад, Евгений Корепов сказал:

     

    Этот код работает под iOS? Равиль ведь писал что там какая то проблема с IHTTPResponse и он не возвращает код. Я к сожалению не смогу проверить в ближайшее время на iOS .

  12. В 3/22/2017 в 10:20, Равиль Зарипов (ZuBy) сказал:

    get запрос

    Можно еще сокращенный вариант, без объявления TStringStream;

     Get возвращает IHTTPResponse . Там есть и StatusCode и ContentAsString.

    Напомню, переменные тип которых начинаются с буквы I (Interface), как IHTTPResponse не нужно уничтожать, они самоуничтожаются при выходе из процедуры.

    uses System.Net.HttpClient;
    
    with THTTPClient.Create do
    try
      Result := Get(vURL).StatusCode = ADDED_TO_DB;
    finally
      Free;
    end;

     

    Также в этом теме описано как отправить файл.

     

  13. Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу.

    А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android?

    POST запрос? Кто нибудь делал такое уже?

    Спасибо 

     

    P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и  InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения. 

  14. 1 час назад, Равиль Зарипов (ZuBy) сказал:

    там есть TBitmap.HandleAllocated, его нужно использовать

    нет, тут речь идет про Handle формы (хотя я не пойму причем тут Handle формы под Android, это же фишка Windows). Почему то сначала он <> nil, затем при втором срабатывании onResize Handle = Nil , и где то  в дебрях в результате получается  AV после присваивания Image1.Height .

    Причем это новый проект.

    .

  15. 17 часов назад, Равиль Зарипов (ZuBy) сказал:

    как-то так, но это наверное сложно для понимания)

    LVStars.rar

    Огромное спасибо Равиль! Как хорошо что вы помогаете.

    Итак для тех кто не знает, в TListView есть режим DynamicAppearance , который позволяет добавлять предустановленные элементы - картинки, текст, GlyphButon. В хелпе  написано что их может быть любое количество.

    Итак добавляем TListView, в панели Structure  выбираем TListView > ItemAppearance > Item.

    В инспекторе объектов выбрать свойство Appearance и  комбобоксе Dynamic Appearance. Рядом в инспекторе появится свойство Objects - нажать на него и там уже добавляем нужные поля. Там же можно переименовать поле, в AppearanceObjectName чтобы позже использовать в RunTime. У меня периодически на этих этапах вылетает Catastrophic Failure и среду приходится терминировать с диспетчера (Berlin Update 2).

    Дальше, жмем правой кнопкой мыши по ListView и выбираем Toggle Design Mode, где можно увидеть эти добавленные Custom поля и расставить их мышкой и указать выравнивание.

    Это имя затем можно использовать в Runtime, для картинки это индекс в ImageList, который нужно указать в ListView  таким образом (за это еще раз спасибо Равилю! :), почему это сделали так неочевидно и почему это не указано в мануале, остается загадкой.. 

    Для TImageObjectAppearance с именем Star - 

    ListView1.Items.Add.Data['Star'] := Integer(1);

    Например заполняем список с картинками с индексами 0 и 1:

    procedure TForm5.FormShow(Sender: TObject);
    var
      I: Integer;
    begin
      for I := 0 to 9 do
      begin
        with ListView1.Items.Add do
        begin
          Text := 'Item ' + I.ToString;
          Data['Star'] := Integer(I mod 2 = 0);
        end;
      end;
    end;
    
    
    Переключаем с картинки с индексом 1 на 0 и наоборот.
    
    procedure TForm5.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem);
    begin
      AItem.Data['Star'] := AItem.Data['Star'].AsInteger xor 1;
    end

    ;
     

     

     

  16. Привет.

    Я к своему стыду так и не научился толком работать с TListView. 

    TListBox это сделать просто, а вот как это сделать в TListView... Это сложный компонент.

    Подскажите как правильно реализовать.

    Нужно добавить с правой стороны каждого Item иконку избранное, которая работала бы как чекбокс - если нажать по ней то звездочка становится желтой и без заливки (Checked/unchecked) .

    Насколько я понял в GlyphButton нельзя добавить картинку.. Как же тогда это сделать?

    Спасибо.

  17. Я работаю на Windows 10, линии появляются на ней.

    Если  использовать GlobalUseGPUCanvas := true то баг пропадает. Но с этим флагом другая проблема, если в системе установлено dpi больше 100%, напр. как у меня 150%, то программа не масштабируется автоматически, т.е. форма становится пропорционально меньше, выглядит как для 100% dpi на 150%. Это аналог Form Scaled  := true на VCL. Хотя мне так больше нравится, я давно искал где же выключается это некрасивое масштабирование в FMX (слишком большое на мой взгляд).

    Большое спасибо 

    @andrew4010!

  18. Для Android лучше Berlin использовать с последним Update 2. На Tokyo Android глючный и тормозит, фактически программы получаются не юзабельные, для Tokyo лучше подождать обновления. Все детали на форуме эбмаркадеры.

  19. В общем вот работающий костыль, который полностью убирает полосы.

    2 Timage лежат на TLayout.

    Если после каждого поворота менять высоту Tlayout на 0,001 туда-обратно, то полос нет.  На глаз никакого движения не заметно.

     

    Жмем по FloatAnimation  и выбираем событие OnProcess.

    Далее  

    procedure TfrmSplash.FloatAnimation1Process(Sender: TObject);
    begin
    {$IFDEF MSWINDOWS}
      if Layout1.Height > fNormHeight then
        Layout1.Height := Layout1.Height - 0.001
      else
        Layout1.Height := Layout1.Height + 0.001;
    {$ENDIF}
    end;
    
    procedure TfrmSplash.FormCreate(Sender: TObject);
    begin
      fNormHeight := Layout1.Height; 
    end;

     

  20. А чем можно заменить Timage, может вручную можно отрисовать?

     

    Пока я вижу единственный выход, это делать анимацию из 360 картинок и грузить их в TBitmapListAnimation..

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