Перейти к содержанию
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. @Равиль Зарипов (ZuBy) А можно пару строчек как это делается, ведь у кнопки нет свойства Height, как же это сделать? Просто на тему этих кнопок в ListView вообще нигде нет информации. Вы многим поможете. Спасибо.
  6. Ребят, подскажите как менять высоту у TTextButtonObjectAppearance. Я взял пример у Равиля - ModernLIstView. Взял форму с Colorize, поменял ListView Item на Dynamic, добавил TextButton. В Design Time кнопка изменять размер, а в RunTime она здоровенная на всю высоту Itema. Неужели нельзя в DynamicAppearance работать с этой кнопкой? Мне просто нужно 2 кнопки, почему так все запутанно в FMX... Неужели придется ListBox использовать? Вот кстати в одной из тем Равиль показывал скриншот одной программы, там 2 кнопки, маленького размера. Равиль как вы их сделали? Это просто 2 картинки или Text Button?
  7. 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) - форма не уничтожится и останется видимой.
  8. @Евгений Корепов Я не собираюсь использовать Error Code, т.к. там может быть проблема с прокси. Но насчет JSON не согласен. Не понимаю эти заделы на будущее. Сколько лет уже программирую, и всегда приходилось писать под текущую задачу, а универсальные вещи\классы пылились на полке. Мне напоминает это серванты с посудой и дорогим постельным бельем у наших родителей и бабушек, с надеждой на применение их в лучшем будущем или по особым случаям, которые у многих и не наступают.. Или например напоминает создание всех форм и компонентов сразу при старте. В результате юзер в основном использует только одну форму, но программа забирает больше ресурсов и медленнее загружается. Я не сторонник такого подхода, точнее даже категорически против, т.к. универсальность влияет на производительность. Я за принцип бритвы Оккама. Имхо если нужно будет возвращать доп. данные, то их добавить просто, но делать это нужно тогда когда это реально понадобится. Стандартного "ОК или ошибка" вполне достаточно (тем более если появится ошибка, то она будет не в стандарте json\xml, а обычным текстом), для другого будет другой запрос. Если бы скрипт возвращал не обычное бинарное подтверждение - да\нет, а какое то значение, тогда было бы лучше использовать json - можно добавить и новые параметры, в новых версиях, не нарушив работу старых версий программы.
  9. 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; Мультиплатформенный вариант без открытия файла (размер берется из файловой системы).
  10. Понять легко, если использовать не зарезервированные номера. Мануал это и рекомендует, первая цифра класс статуса, остальные 2 свои. Другое дело что может быть проблема с прокси серверами.
  11. Здесь вы не совсем правы. Эти коды и придуманы в том числе и для использования в своих целях. Они разделены на классы. 200 это коды "удачные", 400 "не удачные" итп. Есть зарезервировнные значения, все остальное можно использовать. Не спорю, это не так удобно как текст. Но имхо в таких простых boolean запросах проще использовать текст 'ОК', если это не ОК, значит интепретировать как ошибку, ведь по факту какая нибудь ошибка скрипта отображается простым текстом, без json форматирования. И код станет и прозрачней и быстрее. А если понадобится возвращать сложные данные, то это будет уже другой запрос, со своей описанной в доках структурой (json).
  12. Как вы к примеру подтверждаете из скрипта (напр. PHP) о том что запись добавилась в базу? Есть 2 варианта - возвращать нужный код (не вижу причин почему не рекомендуется возвращать свой Custom Error Code, имхо это вполне логично), или возвращать текст (напр. ошибки или "ОК"). Возвращать пустую строку при удачном добавлении при error code 200 на мой взгляд не совсем правильно. Что то пропустите в коде скрипта - что -то отвалиться, и в итоге запись не добавиться, при этом в ответ вернется 200 и пустая строка. Этот код работает под iOS? Равиль ведь писал что там какая то проблема с IHTTPResponse и он не возвращает код. Я к сожалению не смогу проверить в ближайшее время на iOS .
  13. Разве этот код не будет работать под iOS? Под Android он работает.
  14. Можно еще сокращенный вариант, без объявления 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; Также в этом теме описано как отправить файл.
  15. Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу. А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android? POST запрос? Кто нибудь делал такое уже? Спасибо P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения.
  16. нет, тут речь идет про Handle формы (хотя я не пойму причем тут Handle формы под Android, это же фишка Windows). Почему то сначала он <> nil, затем при втором срабатывании onResize Handle = Nil , и где то в дебрях в результате получается AV после присваивания Image1.Height . Причем это новый проект. .
  17. На Android без вот этого кусочка программа молча вылетает (Segmentation Failed) if Handle = nil then exit;
  18. Огромное спасибо Равиль! Как хорошо что вы помогаете. Итак для тех кто не знает, в 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 ;
  19. Привет. Я к своему стыду так и не научился толком работать с TListView. TListBox это сделать просто, а вот как это сделать в TListView... Это сложный компонент. Подскажите как правильно реализовать. Нужно добавить с правой стороны каждого Item иконку избранное, которая работала бы как чекбокс - если нажать по ней то звездочка становится желтой и без заливки (Checked/unchecked) . Насколько я понял в GlyphButton нельзя добавить картинку.. Как же тогда это сделать? Спасибо.
  20. Я работаю на Windows 10, линии появляются на ней. Если использовать GlobalUseGPUCanvas := true то баг пропадает. Но с этим флагом другая проблема, если в системе установлено dpi больше 100%, напр. как у меня 150%, то программа не масштабируется автоматически, т.е. форма становится пропорционально меньше, выглядит как для 100% dpi на 150%. Это аналог Form Scaled := true на VCL. Хотя мне так больше нравится, я давно искал где же выключается это некрасивое масштабирование в FMX (слишком большое на мой взгляд). Большое спасибо @andrew4010!
  21. Есть у вас какие то сдвиги по теме? http://www.codenewsfast.com/cnf/thread/0/permalink.thr-ng2072q1234 FDDataMove1.Destination := FDMemTable1; FDDataMove1.SourceKind := skText; FDDataMove1.TextFileName := '.......'; FDDataMove1.TextAnalyze := [taDelimSep, taHeader, taFields];
  22. Для Android лучше Berlin использовать с последним Update 2. На Tokyo Android глючный и тормозит, фактически программы получаются не юзабельные, для Tokyo лучше подождать обновления. Все детали на форуме эбмаркадеры.
  23. В общем вот работающий костыль, который полностью убирает полосы. 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;
  24. А чем можно заменить Timage, может вручную можно отрисовать? Пока я вижу единственный выход, это делать анимацию из 360 картинок и грузить их в TBitmapListAnimation..
×
×
  • Создать...