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

Andrey Efimov

Модераторы
  • Постов

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

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

    123

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

  1. Like
    Andrey Efimov получил реакцию от xenon54 в Приложение для создания файла ресурсов (RC, RES)   
    Появилась необходимость добавить большое количество картинок, но делать это стандартными средствами не очень удобно (почитать можно тут: Где хранить большое количество картинок?).
     
    Собственно, написал маленькую программку для создания файла RC и создания bat – файла, который позволяет генерировать RES файл.
     
    В свободное время буду допиливать.
     
    Как использовать:
    Указываете путь до папки с файлами, которые необходимо добавить в ресурсы. Указываете имя выходного файла, без расширения. Расширение (.rc) уже забито в коде. Выбираете тип ресурсов. Ставите необходимые галочки. Жмёте "Создать" Итоговые файлы будут лежать рядом с exe-файлом приложения.
     
    Обращаться к ресурсам можно по оригинальным именам или автоматически сгенерованным.
    Пример (оригинальные имена):
    Имя файла "FruitsVegetables_1.png". В готовом файле будет так: FruitsVegetables_1 ТИП ПУТЬ\FruitsVegetables_1.png Надеюсь, кому-нибудь пригодится.
     
    Версия 1.4:

     
      Скачать с Google Drive (версия 1.4). Новую версию можно скачать ниже, в последнем сообщении.
  2. Like
    Andrey Efimov отреагировална Kikoma в Где хранить большое количество картинок?   
    StyleBook - Я бы создал дополнительное приложение для добавления картинок в StyleBook программно, и потом сохранил в файл (метод StyleBook.WriteResourses). Сам не пользовался, но копал бы в этом направлении Хранить в ресурсах - Если воспользоваться вариантом Сысоева Максима из этой темы, то опять таки быстрее было бы написать программку для создания файла ресурса resource.rc из картинок в определенной папке. Да и в будущем такая программка обязательно понадобится. Задеплоить - Добавить большое кол-во файлов и назначить им путь - не проблема, В дальнейшем работать с этим списком файлов не удобно. Я бы предложил разработчикам еще и фильтр туда вставить, было бы удобнее. Ну а пока только сортировкой по колонке пользуюсь, и то она после каждого действия слетает. (Кстати куда про найденные баги писать то можно? А то я их на листочек себе записываю) zip архив - аналог предыдущему пункту "задеплоить". APK - сам по себе zip архив, так что в итоге удобство сведется к не работать с большим списком в деплой менеджере, но дополнительной операции распаковки на устройстве (ведь при установке пользователь терпимо ждет и не спорит с иногда "долгим" процессом установки, а вот в процессе работы с приложением... ему это уже не нравится Чтобы принять окончательное решение, надо учесть будут ли добавляться картинки программно или только с обновлением apk? Как будут использоваться картинки в приложении и как лучше организовать к ним доступ для наилучшего быстродействия? Ну а самое главное программа создается для пользователя, поэтому чтобы пользователь был доволен (в контексте данной темы самый главный показатель для пользователя быстродействие работы программы)
  3. Like
    Andrey Efimov отреагировална Kikoma в Как программно добавить объект в StyleBook?   
    1.  А если программно в StyleBook из папки, а потом сохранить стиль?
    2. А если станет больше картинок в ресурс можно их программно добавить? как?
    3. Я для себя имя файла хроню в БД а картинки деплою assets\internal\img\ - (Надеюсь в будущем можно будет потом программно сюда добавить/закачать, а в БД запись добавлю)
       (Кстати задеплоить файлы массово можно и пути им тоже массово назначить, выделяешь и там кнопочки вверху )
    4. А смысл? Если хранить картинки jpeg то объем архива не изменится. а ресурсы на распаковку архива дополнительно будут тратиться. Если только имеешь ввиду, что задеплоить архив, а уже на месте его распаковать? - смысл? см. п.3
  4. Like
    Andrey Efimov отреагировална Brovin Yaroslav в Как получить количество элементов стиля?   
    Каждый стилевой объект является дочерним к корню TStyleBook. Поэтому получение количества стилевых объектов будет запрашиваться так:
    StyleBook1.Style.ChildrenCount
  5. Like
    Andrey Efimov отреагировална Brovin Yaroslav в [Отклонение] При использовании AutoReverse не восстанавливается значение свойства Inverse   
    Исправлено в XE10.
     
    Workaround для версий до XE8 (включительно)
    Перед вызовом анимации сбросить Inverse в False.
    Это косвенно обсуждалось в теме: Как сделать эффект вспышки для контрола, когда он подсвечивается на короткий диапазон времени?
  6. Like
    Andrey Efimov отреагировална Brovin Yaroslav в В моем случае при использовании 3D формы и ряда TLayer3D не удается нажать на 2D контрол   
    Посмотрите пример ControlsDemo, внизу есть кнопка, которая переводит интерфейс в 3D и крутит его. После возвращения переводит его обратно в 2D.
     
    Да и обратите внимание на отсутствие мерцания.
  7. Like
    Andrey Efimov отреагировална Brovin Yaroslav в В моем случае при использовании 3D формы и ряда TLayer3D не удается нажать на 2D контрол   
    Рабочее решение, сбросить HitTest в False для слоев. Они перехватывают события. Для 3D объектов BringToFront и BringToBack не работают так, как вы ожидаете. Поскольку у 3D объектов это положение зависит от точки наблюдения. Вместо этого в вашем случае нужно использовать ось Z. Зачем для 2D интерфейса использовать 3D форму?
     
    Это не оправдано. Отмечу, что выбор использования 2D или 3D формы зависит от вашего варианта использования. Например:
    2D форма. Когда преобладающая часть контролов - это 2D контролы. Чтобы использовать 3D объекты, используйте встроенные TViewPort3D. Если нужны 3D эффекты в редких случаях, то проще на момент создания эффекта добавить в корень формы TViewPort3D с TLayer3D, затем перенести туда все ваши контролы. выполнить эффекты и восстановить обратно. В этом случае не будет и проблем с нажатием в 3D форме.  3D форма. Все тоже, что и в 2D форме только со знаком минус.
  8. Like
    Andrey Efimov отреагировална Brovin Yaroslav в Как программно получать время в русском формате у TimeEdit?   
    Конвертации вида:
    TTime <-> String TDate <-> String TDateTime <-> String являются базовыми операциями в RTL и не имеют отношения к компоненту TTimeEdit.
     
    Чтобы время перевести в строку с требуемым форматом, нужно использовать метод FormatString:
    TimeEdit1->Time.FormatString("hh:nn:ss"); По умолчанию все функции конвертации без параметров используют настройки формата из FormatSettings. Можете поменять стандартный формат в этой глобальной переменной, тогда все функции будут использовать ваш формат.
  9. Like
    Andrey Efimov получил реакцию от Kitty в Как получить Thumbnail файла mp4?   
    Если вам для Андроида, то попробуйте воспользоваться Android API, а точнее классом "ThumbnailUtils", у него есть метод "createVideoThumbnail(String filePath, int kind)".
  10. Like
    Andrey Efimov отреагировална Brovin Yaroslav в Как добавить в TEdit кнопку очистки поля?   
    Добрый день,
     
    Лучше не использовать TClearingEdit, потому что TEdit поддерживает добавление специальных кнопок. И компонент TClearingEdit является частным случаем и не исключено, что он может быть в будущем удален.
     
    Чтобы можно было очистить поле Edit, не достаточно применить к нему стиль ClearingEditStyle. Необходимо, чтобы сам TEdit умел работать с объектами стиля. Но "clearingeditstyle" не предназначен для TEdit. Поэтому не смотря на то, что эдит будет выглядеть с кнопкой очисти, кнопка работать не будет.
     
    Как встроить кнопки в TEdit
    Обратите внимание, что при использовании этого способа, кнопка очистки будет автоматически очищать поле.


  11. Like
    Andrey Efimov получил реакцию от brunnengi в Как добавить в TEdit кнопку очистки поля?   
    Может быть, вам попробовать использовать компонент TClearingEdit?
    Стиль, который вы пытаетесь использовать предназначен именно для этого компонента.
  12. Like
    Andrey Efimov отреагировална Brovin Yaroslav в Почему для моих объектов стиля сбрасываются данные при прокручивании TListBox?   
    Это хороший вопрос. Я поясню. 
    TListBox может иметь большое число элементов (Items, например 1000). Однако, реально из них отображается только видимая часть (Например 50). Отсюда приходит мысль, что не следует грузить стиль всем элементам в лист боксе, поскольку это займет очень много ресурсов: как процессорного времени на загрузку, так и памяти на хранение.  При прокручивании TListBox, стили выгружаются с невидимых элементов, и загружаются для новых видимых. Каждый элемент TListBoxItem, хранит свои данные у себя (Text, IsChecked, Bitmap).  Когда стиль загружается, сам элемент TListBoxItem, устанавливает нужные данные в объекты стиля в соответствии с хранимыми данными (Text, IsChecked, Bitmap).  При выгрузке стиля установленные данные в объекты стиля, теряются. Если только они не были самостоятельно сохранены. Когда вы вручную самостоятельно добавляете свой объект в стиле, вы должны позаботиться о том, чтобы сохранить задаваемые данные для элементов и восстановить эти значения при очередной загрузке стиля. TStyledControl поддерживает встроенный механизм кэширования пользовательских данных через StylesData.  При использовании StylesData контрол автоматически сохраняет ваше значение в своем словаре и при смене стиля самостоятельно обновляет свойства объектов стиля в соответствии с хранимыми данными в словаре. О том, как работать с StylesData можно прочитать тут: Доступ к элементам стиля StylesData Когда вы стали использовать вариант с icon, то по сути сам TListBoxItem за вас восстановил иконку, поскольку это заложено в его базовое поведение  P.S. Используйте StylesData.
  13. Like
    Andrey Efimov отреагировална antarey в Как в Firemonkey на C++Builder использовать ява код?   
    Итак, вот результат моих потуг
    antareyToast.java
    package com.antarey; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.widget.Toast; public class antareyToast {     private Context context;     private Handler mHandler = new Handler(Looper.getMainLooper());     private String mMsg;     public antareyToast(Context context) {         this.context = context;     }     public void ShowToast(String msg)     {         mMsg = msg;         mHandler.post(new Runnable() {             public void run() {                 Toast.makeText(context, mMsg, Toast.LENGTH_SHORT).show();             }         });     } } обертка 
    unit com.antarey.antareyToast; interface uses   FMX.Helpers.Android,   Androidapi.Helpers,   AndroidAPI.JNIBridge,   Androidapi.JNI.JavaTypes,   Androidapi.JNI.GraphicsContentViewText,   Androidapi.JNI.os; type   JantareyToast = interface;   JantareyToastClass = interface(JObjectClass)     ['{C4BED43A-7A25-43F2-A9BE-B2E1602FB2D8}']     function init(JContextparam0 : JContext) : JantareyToast; cdecl;   end;   [JavaSignature('com/antarey/antareyToast')]   JantareyToast = interface(JObject)     ['{5AFABA34-5223-424D-A381-5F61E4B67B53}']     procedure ShowToast(JStringparam0 : JString) ; cdecl;   end;   TJantareyToast = class(TJavaGenericImport<JantareyToastClass, JantareyToast>)   end; procedure ShowToast(ToastMsg: String); implementation procedure ShowToast(ToastMsg: String); var  Activity:JantareyToast; begin   Activity:=  TJantareyToast.JavaClass.init(SharedActivityContext);   Activity.ShowToast(StringToJString(ToastMsg)); end; procedure RegisterTypes; begin   TRegTypes.RegisterType('com.antarey.antareyToast',TypeInfo(com.antarey.antareyToast.JantareyToast)); end; initialization RegisterTypes; end. вызов
     
    //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShowToast( UnicodeString(_D("Ура!!!! - Получилось")) ); } //--------------------------------------------------------------------------- Все работает.
    Более подробно читаем тут
    Но ето только один из методов, использовать стандартные библиотеки немного проще, проще в том что не надо писать ява код самому, а обертки есть уже готовые
  14. Like
    Andrey Efimov получил реакцию от Brovin Yaroslav в Как в Firemonkey на C++Builder использовать ява код?   
    По первому пункту: Цифры(GUID) берутся рандомно, необходимы для RAD Studio, для генерации используйте комбинацию клавиш "Ctrl+Shift+G"
  15. Like
    Andrey Efimov получил реакцию от Kitty в Некорректное отображение элементов списка при загрузке глобального стиля   
    Стили лежат тут "C:\Users\Public\Documents\Embarcadero\Studio\14.0\Styles", там есть папки "Android", "iOS".
    Также все стандартные стили можно вытащить из "Bitmap Style Designer", как это сделать, читайте в разделе "Стили", например в теме "Где взять стандартный стиль в FireMonkey для iOS и Android, используемый по умолчанию?"
  16. Like
    Andrey Efimov отреагировална Kitty в Использование killBackgroundProcesses для пользоватлей С++ Builder   
    Тема была закрыта: http://fire-monkey.ru/topic/230-zapusk-video-po-raspisaniiu-v-pleere-na-androide/
    Однако было найдено решение и в продолжение темы вопрос решен так:
    1. Воспользуемся советом Nix0N и используем PAS файл из той темы.
    2. Чтобы в C++ Builder XE6 можно было корректно использовать killBackgroundProcesses, в PAS файл вносим изменения любезно предоставленные Hugh Xiao. Источник обсуждения тут:
    http://bcbjournal.org/forums/viewtopic.php?f=10&t=2496&sid=b33b673eeb80f12f15a169a58e55cc67&start=15
    Код:
    //------------------------------------------------ // RegisterTypes added by Hugh Xiao : qs.xiao@gamil.com 2014-07-20 Taiwan Time procedure RegisterTypes; begin TRegTypes.RegisterType('Androidapi.JNI.ActivityManager.JDebug_MemoryInfo', TypeInfo(Androidapi.JNI.ActivityManager.JDebug_MemoryInfo)); end; initialization RegisterTypes; // end by Hugh //--------------------------------------------------- 3. Теперь запускаем MX плеер по расписанию кодом, при котором предыдущий экземпляр видео уничтожается и таким образом программа не вываливается из памяти:
    //запуск PlayVideo из таймера Timer1 void PlayVideo(const String AFileName) { try { //MX player: https://sites.google.com/site/mxvpen/api _di_JString PackageName = StringToJString(L"com.mxtech.videoplayer.ad"); _di_JActivityManager activityManager = GetActivityManager();//<- для работы GetActivityManager необходим код от Hugh Xiao activityManager->killBackgroundProcesses(PackageName); //убиваем предыдущее видео String EXE = System::Ioutils::TPath::GetExtension(AFileName); _di_JIntent Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW); _di_Jnet_Uri Data = StrToJURI(AFileName); Intent->setDataAndType(Data, StringToJString(L"video/" + EXE)); //Важные две строки совет от rlebeau разработчика Indy Intent->setPackage(PackageName); Intent->addFlags(TJIntent::JavaClass->FLAG_ACTIVITY_CLEAR_TOP | TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK | TJIntent::JavaClass->FLAG_ACTIVITY_NO_HISTORY); //Application->ProcessMessages(); //Sleep(2000); SharedActivity()->startActivity(Intent);//старт нового видео } catch(Exception &E) { ShowMessage( E.ClassName() + " " + E.Message); Application->Terminate(); } } В архиве правильный PAS и HPP, включая тестовый пример на С++.
    Androidapi.JNI.ActivityManager.zip
  17. Like
    Andrey Efimov отреагировална Brovin Yaroslav в Мировой тур RAD Studio XE6   
    Демо проекты: demos.zip
    Презентации:
    01. Улучшение продуктивности и качества кода при разработке на VCL.pdf 02. Обеспечение взаимодействия настольных и мобильных приложений.pdf 03. Переход к мобильности и платформе приложений FM.pdf
  18. Like
    Andrey Efimov получил реакцию от Brovin Yaroslav в О подключении к базе SQLite в Андроид-приложении   
    Вам необходимо просто указать путь до базы и всё должно заработать. (Посмотрите примеры, на которые я дал вам ссылку и всё станет понятно)
    Пример для пути "assets\internal":
    procedure TForm1.FDConnection1BeforeConnect(Sender: TObject); begin   {$IF DEFINED(iOS) or DEFINED(ANDROID)}   FDConnection1.Params.Values['Database'] :=        TPath.Combine(TPath.GetDocumentsPath, 'shoplist.s3db');   {$ENDIF} end;
  19. Like
    Andrey Efimov получил реакцию от Brovin Yaroslav в О подключении к базе SQLite в Андроид-приложении   
    Не нашёл в вашем проекте подключения к БД через код. Советую ознакомиться с примерами в справке Accessing a Database
  20. Like
    Andrey Efimov отреагировална Kitty в Delphi XE6 and C++Builder XE6 Update 1   
    Fix list for RAD Studio XE6, Delphi XE6 and C++Builder XE6 Update 1
    http://edn.embarcadero.com/article/43893
  21. Like
    Andrey Efimov получил реакцию от Brovin Yaroslav в Мировой тур RAD Studio XE6   
    Фотки есть на сайте, но на Фейсбуке их намного больше
    Буду ждать презентации и демки.
    Ярослав, привет.
    Где-то уже лежат презентации и демки или ещё не выкладывал?
  22. Like
    Andrey Efimov отреагировална Brovin Yaroslav в Мировой тур RAD Studio XE6   
    А куда выложили фотки?
     
    Видео с семинаров не будет. Но зато я на следующей неделе выложу используемые презентации и демки.
  23. Like
    Andrey Efimov получил реакцию от Brovin Yaroslav в [Android] Как можно изменить стиль кнопки в TListViewItem?   
    В стиле есть ветка "listviewstyle", там вы найдёте все, что относится к "ListView".
  24. Like
    Andrey Efimov получил реакцию от Brovin Yaroslav в При попытке сохранить фотографию на устройство у меня возникает ошибка.   
    Вопроса не нашёл, поэтому ответ "всё правильно понимаете".
  25. Like
    Andrey Efimov отреагировална RoschinSpb в Мне кажется, что TNumberBox работает не так   
    Вообще всегда приходит либо KeyChar, либо Key. Вроде бы об этом написано в тут и тут.
    Key - это код виртуальной клавиши vkXXX. Он зависит от конкретной нажатой клавиши, при чем на разных платформах он приводится к виндовым эквивалентам. 
    KeyChar - это символ который может быть изображен где-нибудь в поле ввода. Он зависит от текущего языка, раскладки, IME, способа ввода (в числе прочего можно использовать голосовой ввод) и еще неизвестно чего, короче его подставляет система по не известным в общем случае правилам. 
    Сделано так специально, чтобы не путали и не пытались выводить в виде текста букву А, когда нажато сочетание клавиш Ctrl+A. Эти два параметра принципиально по разному обрабатываются.
×
×
  • Создать...