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

Kitty

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

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

  • Посещение

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

    16

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

  1. Like
    Kitty отреагировална estra в Как правильно добавить форму в мобильный проект?   
    Не синен я в плюсах, а на Delphi делаю так
    procedure TForm1.Button1Click(Sender: TObject); var f: TForm2; begin f := TForm2.Create( nil ); f.Show; f.Free; // или f.Destroy end; 1. В плюсах вместо nil скорее всего надо писать NULL
    2. Из за использования в мобильной платформе автоматического подсчета ссылок (ARC), удалять возможно следует так
    f := nil // или NULL в плюсах (без delete Form2, но тут пусть лучше разработчики скажут)
  2. Like
    Kitty отреагировална estra в Как правильно добавить форму в мобильный проект?   
    Может так?
    TForm *Form2 = new TForm2(0);
  3. Like
    Kitty отреагировална nek в Перестал работать Сtrl+Пробел в С++ Builder   
    Намучался я с этим CB!
    Вот мои)
    #include "Clipbrd.hpp" #include "DateUtils.hpp" Кода ~500 строк не считая юниты.
    Чистый проект ведёт себя адекватно. Открываю большой и понеслась! При попытке проверить синтаксис/какие-то внутринние действия или отобразить подсказку IDE виснет. Если повезёт, то вскоре очухается, если нет, то CB вылетит без каких либо ошибок.
    Иногда работает подсказка ListView1->Items->..отображается список методов, иногда нет. То же со справкой F1.
    Очень редко возникает ошибка "Программа всё ещё запущена?", недавно решил поискать мой процесс в...process explorer'е и угадайте, где я его нашел? В Steam.exe, который никак не связан с моей программой и находится на другом диске. Поясняю: steam система дистрибьюции цифрового контента в частности игр, которая люто бешено ненавидит вмешательства в своё адресное пространство и просто напросто банит аккаунты за посягательства на файлы ядра и изменение процесса в памяти. О бане можно узнать и через недельку другую, причём никакие "я больше так не буду" или "это не я" не помогут)))
    Тьфу тьфу тьфу пока всё ок. Я вообще у себя избавился от одной сомнительной фичи, но факт остаётся фактом как-то процесс "перетёк" в другой)) Ничего криминального в коде нет,
  4. Like
    Kitty отреагировална Nix0N в [Windows] TnTRayIcon не визуальный компонент обеспечивающий управление значком в области System Tray   
    Набросал компонент для работы с значком в системном трее. Компонент только для FM и только для платформы Windows ! Среда: Delphi XE6 
     
    Основные моменты
     
    Свойства:
    Hint : string - отображает текст при наведении на значок в системном трее BalloonTitle : string - текст заголовка всплывающей подсказки BalloonText : string - текст содержания всплывающей подсказки IconBalloonType : TBalloonIconType - иконка всплывающей подсказки. Принимает значения: ​​​​BigError, BigWarning, Error, Info, None, User, Warning Indent : Cardinal - "косметический костыль" для нормального отображения меню при клике по значку в системном трее. Подбирается экспериментально, так как при различных стилях область отображения меню изменяется (меню уезжает вверх) PopUpMenu : TPopUpMenu - всплывающее меню, при OnClick правой кнопкой мыши по значку ​Методы:
    Show - отображать значок в системном трее Hide - скрыть значок из системного трея ShowBalloonHint - показать всплывающую подсказку События:
    OnClick - нажатие левой кнопки мыши OnDblClick - двойное нажатие левой кнопки мыши Важное замечание: необходимо обязательное наличие TForm и только один экземпляр TnTrayIcon в приложении !
     
    Установка:
    Распаковать содержимое архива Открыть файл nTrayIcon.dpk В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Compile В Project Manager окне правой кнопкой мыши по nTrayIcon.bpl -> Install Добавляем путь в Library: Tools -> Options -> Delphi Options -> Library -> Library Patch -> Add... В архиве компонент и пример для работы.
     
    P.S. Писал для себя, так как частенько использую... Всегда хочется простоты.
    P.S.S. Писал быстро и ночью. Возможны недочеты и ошибки. Постепенно исправлю.
    TnTrayIcon.zip
  5. Like
    Kitty отреагировална antarey в Голосование за появление обучающего курса по FireMonkey   
    Очень сильно поддерживаю - не забывайте за бульдозеристов  - если будет код на делфи - рядом на с++
  6. Like
    Kitty отреагировална Brovin Yaroslav в Как обнулить миллисекунды в TTimeEdit?   
    Поняли правильно, системный диалог выбора времени на андроиде не дает возможности изменять секунды и миллисекунды.
     
    Чтобы заменить значение миллисекунд на свое вы можете воспользоваться функцией RecodeSecond или RecodeMilliSecond:
    #include "System.DateUtils.hpp" void __fastcall TForm1::TimeEdit1Change(TObject *Sender) { TimeEdit1->DateTime = RecodeSecond(TimeEdit1->DateTime, 0); }
  7. Like
    Kitty отреагировална Brovin Yaroslav в Советы по созданию мобильного приложения Master-Detail   
    Клик по итему
    Как уже предыдущие пользователи правильно заметили, нажатие на итем в списке самый интуитивно понятный способ на мобильных платформах. По скольку это полностью совпадает с правилами построения пользовательского интерфейса на мобильных платформах.
    Не надо придумывать свои способы, когда уже есть стандартные. Этим вы только запутаете пользователя, привыкшего к общему принципу работы с любым приложением. Если вам такой способ нужен, то лучше перепроектируйте ваш интерфейс, чтобы этого избежать (смотрите пункт 1.) Открытие нового вида
    На счет этого, если вы делаете приложение под андроид, то я бы не рекомендовал для этих целей использовать TTabControl. По одной самой главной причине:
     
    Потребление дополнительных ресурсов. Заставляет форму создавать все контролы на всех вкладках, даже на тех, что не видны. 
     
    Легко представить типичную ситуацию, когда ваше приложение довольно большое и содержит большое число форм ввода и редактирования данных. Теперь представьте, что все эти контролы создаются при запуске приложения и живут все время существования приложения. Это совсем не маленькие размеры памяти, особенно на Андроиде.
     
    Ресурсы мобильной платформа не равны ресурсам настольных платформ. И если на настольной системе вы можете особо не заморачиваться о размере потребляемой памяти, так как ее много. То на мобильнике это может привести к нехватке памяти и как следствие разрушение вашего приложения.
     
    Главная идея - это иметь в каждый момент времени только то, что нужно. Поэтому я бы лучше рассматривал либо создание отдельной формы, либо создание в рантайме специального слоя (вида), которые будет загружен по верх всего, а потом будет разрушен после окончания выполнения редактирования.
     
    Так же советую использовать фреймы для таких функционально законченных блоков (редакторы сущности):
    Позволяет быстро и удобно создавать в нужное время на мобильной платформе требуемый вид. Забирая от системы ресурсы только в тот момент, когда они действительно необходимы. Повторное использование в других местах приложения.
  8. Like
    Kitty отреагировална Brovin Yaroslav в Как программно получать время в русском формате у TimeEdit?   
    Конвертации вида:
    TTime <-> String TDate <-> String TDateTime <-> String являются базовыми операциями в RTL и не имеют отношения к компоненту TTimeEdit.
     
    Чтобы время перевести в строку с требуемым форматом, нужно использовать метод FormatString:
    TimeEdit1->Time.FormatString("hh:nn:ss"); По умолчанию все функции конвертации без параметров используют настройки формата из FormatSettings. Можете поменять стандартный формат в этой глобальной переменной, тогда все функции будут использовать ваш формат.
  9. Like
    Kitty отреагировална Виктор в Советы по созданию мобильного приложения Master-Detail   
    Если у вас на клики по элементам ListView не будет больше никаких действий, то правильней будет если пользователь будет иметь возможность кликнуть в любую часть строки (для этого обработку клика надо делать всей строки, а элементам отключать HitTest). Галочек как и полос прокрутки на мобильных девайсах стоит по возможности избегать, по ним неудобно попадать. В качестве места для расположения редактора времени я бы предложил невидимую до нажатия панельку, это ускорит работу ибо не потребуются ресурсы на создания окна. Уточню, что я не в курсе как там дела именно на android-е, и можно ли там отрисовать панельку поверх других элементов формы. Но если можно это на мой взгляд лучший вариант. А область за панелькой просто затемнить в момент её появления, что бы сконцентрировать внимание пользователя на ней.
     
  10. Like
    Kitty отреагировална Nix0N в Советы по созданию мобильного приложения Master-Detail   
    Клик по item в ListView самый удачный и интуитивно-понятный вариант.
  11. Like
    Kitty отреагировална Brovin Yaroslav в Как программно создаваемому TListBoxItem присвоить стиль?   
    Лучше использовать для этих целей TMetropolisUIListBoxItem  и создавать итемы именно этого класса. Так как TMetropolisUIListBoxItem определяет логику по заданию данных в объекты стиля
    item = new TMetropolisUIListBoxItem(Owner); Стандартный стиль для TMetropolisUIListBoxItem - "collectionlistboxitem" P.S. Когда создаете объекты в RunTime нужно указывать в качестве владельца форму, а не родительский контрол.
  12. Like
    Kitty отреагировална Brovin Yaroslav в Как разместить программно TTimeEdit в ListView?   
    Главные отличия TListView от TListBox в:
    TListBoxItem - контрол, TListViewItem - нет В TListBoxItem можно добавлять любые контролы, используя Parent. В TListVIewItem - нет. TListVIewItem хранит только данные для отображения TListVIewItem сам выполняет отрисовку хранимых данных через метод Render За счет собственно ручной отрисовки в TListVIewItem достигается прирост скорости и малое потребление памяти (хранение только актуальных данных) Чтобы создать свой вариант TListViewItem, нужно создать свой класс итема, в нем реализовать требуемые данные (например время) и создать in-place редактор для редактирования времени, зарегистрировать его и тд. P.S. В вашем случае, проще использовать Master-Detail подход. При котором по нажатию на итем, будет открываться вкладка для редактирования информации об итеме, в том числе время через TTimeEdit. Это будет быстрее и проще.
     
    P.S.P.S. Если же вы все-таки хотите создать свой итем, будьте готовы, что придется детально изучить, как это делается в самом TListVew.
  13. Like
    Kitty отреагировална Brovin Yaroslav в [Windows] Почему итемы у TListBox не отображают ItemData?   
    Почему не добавляется иконка в TListBoxItem на платформе Windows? Так же поле Detail так же не поддерживается для TListBoxItem под Windows. Либо используйте свой стиль, либо TMetropolistUIListBoxItem 
    P.S. Лучше определить TTimeEdit в стиле. При создании TTImeEdit, привязке к итему и большом числе итемов могут наблюдаться большое потребление ресурсов. За счет того, что для 1000 итемов будет создано и не распущено 1000 TTimeEdit
  14. Like
    Kitty отреагировална Nix0N в Некорректное поведение анимации цвета шрифта   
    Это не странность, а так и задумано. Если не используется стильбук, то обязательно необходимо явно вводить данные о размере, цвете и т.д.
  15. Like
    Kitty отреагировална Andrey Efimov в Как получить Thumbnail файла mp4?   
    Если вам для Андроида, то попробуйте воспользоваться Android API, а точнее классом "ThumbnailUtils", у него есть метод "createVideoThumbnail(String filePath, int kind)".
  16. Like
    Kitty отреагировална Brovin Yaroslav в Как получить Thumbnail файла mp4?   
    Добрый день,
     
    Собственно исключение оправдано. Вы пытаетесь в качестве картинки подсунуть видео. И считаете, что объект TBitmap почему-то должен работать с видео. Почему тогда туда не подсунуть аудио запись или файл экселя, полагая, что он выдаст скриншот файла и тд. Мысль я думаю понятна.
     
    Теперь к задаче: решить ее можно двумя путями:
    Простой. Храните вместе с видео обложку с видео. И когда нужно отобразить обложку просто загружать ее. Сложный. Поискать в интернете, как храниться обложка видео в видеофайле и написать код, который будет читать ее из файла.
  17. Like
    Kitty отреагировална Brovin Yaroslav в Какой способ лучше для информирования пользователя о выполнении долгой операции?   
    Добрый день,
     
    Использование отдельного потока для длительной операции - хорошая практика. Вопрос о том, как вы будите информировать пользователя об этом ложится на ваши плечи. И зависит от того, чего вы хотите добиться.
     
    Способы индикации выполнения длительной операции
    В голову на первый взгляд мне приходят, например, такие способы:
     
    1. Модальное окно с индикацией хода выполнения операции

    Полностью блокирует работу с приложением, до тех пор, пока операция не закончится или пользователь не отменит ее выполнение.
     
    Достоинства:
    Хорошо применимо, когда в вашем приложении много окон и вам нужно разом заблокировать все. Если вы идете этим путем, то вы можете сделать свою модальную форму со своим дизайном и любыми вариантами индикации вашей задачи, так же как вы работаете с FireMonkey.  Такой подход будет кроссплатформенным и хорошо будет работать, как на Windows, так и на OSX. Недостатки:
    Если вы не используете специальные стили и хотите, чтобы ваше приложение выглядело на всех настольных версиях ОС, как родное, придется постараться, чтобы добиться полного соответствия с темой ОС.  
    2. Системное окно выполнения долгой операции

    Такой же способ, как и первый. Единственное отличие, что в этом способе вы используете диалоговое окно операционной системы.
     
    Достоинства:
    Такое диалоговое окно будет на всех версия ОС Windows выглядеть, как родное. Вам не надо будет заботиться о том, что оно будет выглядеть "не так" в какой-то версии Windows. Недостатки:
    Если вы используете свою стилизацию, отличную от системной. То вам придется изрядно попыхтеть, чтобы сделать нативный диалог в вашем стиле. Такое решение не кроссплатформенно. Вам придется отдельно реализовать такой диалог на разных платформах по разному. 3. Создание слоя, перекрывающего всю форму

    Заключается в размещении TLayout с TAniIndicator и TProgressDialog, перекрывающей все содержимое формы. 
     
    Достоинства:
    В случаях, когда ваше приложение состоит из одной формы (без Docked окон), такое решение будет эффектно и красиво выглядеть. Кроссплатформенно Недостатки:
    Не позволяет полностью блокировать интерфейс, если ваше приложение состоит из нескольких окон (не модальных). 4. Локальное отображение выполнения операции

    Если действие не должно блокировать весь интерфейс, то лучше сделать отображение индикации локальным. Например, в примере выше, при отправке заявки, пока заявка выполняется, отображается индикатор в самой кнопки. Кнопка при этом блокируется.
     
    P.S. Если речь идет об андроиде, то обратите свое внимание на готовые компоненты отображения диалогов:
    FGX. Индикация хода выполнения длительных операций, виртуальная клавиатура и ActionSheet
  18. Like
    Kitty отреагировална Brovin Yaroslav в [Android] Как реализовать Explorer файловой системы?   
    Добрый день,
     
    Могу посоветовать вам прочитать две хорошие статьи, как это сделать:
    Пишем свой файловый менеджер для Android, #1 Пишем свой файловый менеджер для Android, #2 Нужно только адаптировать предложенное решение на ваш вкус и цвет, согласно вашему скриншоту.
     
    P.S. Если оформите, описанное в статьях, решение в виде фрейма, то в будущем сможете легко повторно это использовать.
  19. Like
    Kitty отреагировална sn_nn в Правильное задание пути к базе данных в приложении для Андроид   
    В Remote path Указал «.\assets\internal\».
     
    В коде (Delphi XE6) сделал так:
    var     DBPath: string; begin {$IF DEFINED(iOS) or DEFINED(ANDROID)}   DBPath := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, 'Location.s3db'); {$ENDIF} fdCon.ConnectionString:= 'DriverID=SQLite;Database='+DBPath+';StringFormat=Unicode;LockingMode=Normal'; fdCon.Connected:=True; fdCon.GetTableNames('' , '', '', ListBox1.Items, [osMy, osOther], [tkTable, tkView]); Все получилось, спасибо! 
  20. Like
    Kitty отреагировална Fireleo в Правильное задание пути к базе данных в приложении для Андроид   
    Remote path Указывайте «.\assets\internal\».
    Адрес к базе можно получить через: 
    FDConnection1.Params.Values['Database']:=TPath.Combine(TPath.GetDocumentsPath, '<имя файла БД>'); лежать будет в "/data/data/<application ID>/files"
    Кстати, было уже здесь: http://fire-monkey.ru/topic/374-o-podkliuchenii-k-baze-sqlite-v-android-prilozhenii/
  21. Like
    Kitty отреагировална Nix0N в [TWebBrowser] Как получить исходный текст страницы из WebBrowser?   
    Сам когда-то спрашивал, сам же и отвечу. В составе компонентов TMS Pack for FireMonkey версии 2.5.0.2 от 4 Июля 2014 года появился компонент TTMSFMXWebBrowser, который обеспечивает данный функционал.
  22. Like
    Kitty отреагировална Nix0N в [TidHTTPServer] Не удается получить русские символы в idHTTPServer   
    Быстрый способ для GET-запроса:
    TIdURI.URLEncode('http://www.mysite.com/search?q=кириллица');
  23. Like
    Kitty отреагировална Nix0N в [Отклонение] При попытки максимизировать стилизованного окно, окно не разворачивается   
    Установить Update 1 для XE6 "Window can't be maximized with styles, which have custom window border" выдержка из Fix list
  24. Like
    Kitty отреагировална 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("Ура!!!! - Получилось")) ); } //--------------------------------------------------------------------------- Все работает.
    Более подробно читаем тут
    Но ето только один из методов, использовать стандартные библиотеки немного проще, проще в том что не надо писать ява код самому, а обертки есть уже готовые
  25. Like
    Kitty отреагировална Brovin Yaroslav в FGX. Индикация хода выполнения длительных операций, виртуальная клавиатура и ActionSheet   
    Автор: Бровин Ярослав Тип лицензии: Open Source (MPL 2.0) Видео обзор: http://www.youtube.com/watch?v=bzEzOU3EWI4 FGX - Donate - QIWI: 4890 4941 7671 0929 Скачать:
    RAD Studio XE5 fgx_0.3.0.11.zip RAD Studio XE6 fgx_0.4.0.12.zip RAD Studio XE7 fgx_0.5.0.41.zip RAD Studio XE8 fgx_0.6.0.46.zip fgx_0.6.0.60.zip RAD Studio XE10 (RX) fgx_0.7.0.69.zip fgx_0.7.1.74.zip RAD Studio R101 (Berlin) fgx_0.7.1.112.zip , fgx_0.7.1.114.zip , fgx_0.7.1.118.zip  
    fgx_0.6.0.46.zip
    fgx_0.6.0.60.zip
    fgx_0.7.0.69.zip
    fgx_0.7.1.74.zip
×
×
  • Создать...