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

97mik

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

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

  • Посещение

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

    3

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

  1. Like
    97mik получил реакцию от Cody71727172 в В DesignTime на форме появляются артефакты   
    При разработке приложения сталкиваюсь вот с такой штукой:
    То есть на форме происходят какие-то беспорядки.
    А при запуске приложения и наведении курсора на кнопку, вся форма почему-то становится чёрной.

  2. Like
    97mik получил реакцию от AgrikBus в Как отобразить видео из YouTube в FireMonkey?   
    Собственно как вставить видео c YouTube например в Item ListBox'a?
  3. Like
    97mik получил реакцию от Dai12lDymn1 в [iOS] Как сделать цветную обводку кнопки в iOS?   
    Как поменять например стиль кнопки для iOS? Чтобы была например не синяя обводка, а зелёная.
  4. Like
    97mik получил реакцию от HarrisNuh в Как отобразить контрол поверх всех остальных?   
    Как сделать Panel которая в дальнейшем будет поверх создаваемых Panel'ей в Run-time?
  5. Like
    97mik получил реакцию от HarrisNuh в Как создать выдвигаемую панель?   
    В системе iOS есть несколько вариантов анимации выдвижных панелей, и вот один из них это когда панель выходит снизу экрана, как это можно сделать?
  6. Like
    97mik получил реакцию от HarrisNuh в Как сделать эффект вспышки для контрола, когда он подсвечивается на короткий диапазон времени?   
    Как сделать эффект вспышки? То есть чтобы например Panel переходила из Opasity=0 в Opasity=1 и потом обратно, за 500мс..
  7. Like
    97mik получил реакцию от UFatueks в У меня не получается создать браузер в Run-time   
    Не пойму как правильно создавать WebBrowser в Run-time. Пишу так:
    w1[i] := TWebBrowser.Create(Form1.ListBox1.ListItems[Form1.ListBox1.Count - 1]); w1[i].Position.X := 3; w1[i].Position.Y := 3; w1[i].Width := 314; w1[i].Height := 177; w1[i].Parent := Form1.ListBox1.ListItems[Form1.ListBox1.Count - 1]; w1[i].Navigate('https://www.fire-monkey.ru/'); И ничего не происходит.
  8. Like
    97mik получил реакцию от UFatueks в Как отобразить видео из YouTube в FireMonkey?   
    Собственно как вставить видео c YouTube например в Item ListBox'a?
  9. Like
    97mik получил реакцию от ASRenuff в Срабатывает OnClick у Image на ListBox при скроллинге   
    Поместил Image на итем в ListBox и при скроле ListBox (жму на Image и тяну вверх) срабатывает OnClick у Image. Как это исправить?
  10. Like
    97mik получил реакцию от Bernardhums в Поддержка соединения устройств по Bluetooth   
    Возможно ли соединить 2 или более устройств по Bluetooth? То есть чтобы например на одном устройстве был сервер, а на остальных клиент.
  11. Like
    97mik получил реакцию от Bernardhums в Что лучше: многократная загрузка изображения из файла или однократная загрузка изображения в память?   
    На форме 5 Image, в них часто (1 раз в 2 секунды) меняется картинка (размер: 33x60):
    Как лучше менять её? Каждый раз загружать из файла нормально? И если загружать из файла, то как их добавить в проект, то есть чтобы при деплое они были в папке с проектом?
  12. Like
    97mik получил реакцию от Bernardhums в Как сделать эффект вспышки для контрола, когда он подсвечивается на короткий диапазон времени?   
    Как сделать эффект вспышки? То есть чтобы например Panel переходила из Opasity=0 в Opasity=1 и потом обратно, за 500мс..
  13. Like
    97mik получил реакцию от Afficelooge в Как отобразить видео из YouTube в FireMonkey?   
    Собственно как вставить видео c YouTube например в Item ListBox'a?
  14. Like
    97mik отреагировална Brovin Yaroslav в У меня не получается создать браузер в Run-time   
    В таком случае у вас точно будет тормозить скроллинг и все приложение. Так как создание и удержание даже 30 экземпляров браузера это тяжелая задача для телефона.
    Вначале изучите, как работает стандартное приложение YouTube или Вконтакте. И обратите свое внимание на то, когда и в какой момент воспроизводится видео. Отчетливо видно, что браузер имеет смысл создавать только в одном экземпляре и только в тот момент времени, когда пользователь непосредственно выявил свое желание просмотреть видео. Это является примером грамотного подхода к разработке.
     
    P.S. Я сделал новый раздел на форуме "Советы по разработке -> Мобильная разработка", в котором вы можете задавать свои вопросы для получения советов о том, как лучше спроектировать свое приложение, чтобы в дальнейшем не было проблем со скоростью и сопровождением.
  15. Like
    97mik отреагировална Brovin Yaroslav в Как сделать эффект вспышки для контрола, когда он подсвечивается на короткий диапазон времени?   
    Перед вызовом анимации сбросьте флаг Inverse:
    FloatAnimation1.Inverse := False; FloatAnimation1.Start;
  16. Like
    97mik отреагировална Brovin Yaroslav в Как определить пересекаются ли два контрола или нет?   
    Проще всего определить имеют ли два контрола точки пересечения или нет, используя функцию TRectF.IntersectsWith. Которая позволяет определить пересекаются ли два указанных прямоугольника или нет.
     
    Далее остается определить регионы контролов:
    Контролы имею общего родителя. В этом случае они лежат на одном уровне и являются дочерними объектами одного и того же родителя. А это значит, что в качестве их положения можно взять их регион в родительских координатах TControl.ParentedRect. Контролы не имеют общего родителя. В этом случае нужно воспользоваться регионом взятым в абсолютных координатах формы. То есть TControl.AbsoluteRect. Весь код функции определения пересечения двух контролов представлена ниже:
    function IsControlIntersected(const AControl1: TControl; const AControl2: TControl): Boolean; var ControlRect1: TRectF; ControlRect2: TRectF; begin Assert(AControl1 <> nil); Assert(AControl2 <> nil); if AControl1.Parent = AControl2.Parent then begin ControlRect1 := AControl1.ParentedRect; ControlRect2 := AControl2.ParentedRect; end else begin ControlRect1 := AControl1.AbsoluteRect; ControlRect2 := AControl2.AbsoluteRect; end; Result := ControlRect1.IntersectsWith(ControlRect2); end;  P.S. Мы могли бы всегда вычислять пересечение путем взятия абсолютного положения контролов. Однако, получение абсолютного положения контрола через AbsoluteRect выполняет дополнительные действия по конвертации координат (с учетом матрицы преобразования), что при очень частом использовании может быть не выгодным. Именно по этому правильнее будет использование абсолютных координат только в том, случае, когда это действительно необходимо. Именно по этому код функции IsControlIntersected имеет в себе два подхода.
  17. Like
    97mik получил реакцию от Brovin Yaroslav в Ошибка при деплое: Не возможно запустить процесс приложения   
    Наверное это может быть ещё из-за того, что у меня при регистрации продукта было выбрано русское имя.

  18. Like
    97mik получил реакцию от Brovin Yaroslav в Ошибка при деплое: Не возможно запустить процесс приложения   
    В общем при переустановке Windows указал английское имя и всё заработало.
  19. Like
    97mik получил реакцию от Brovin Yaroslav в Ошибка при деплое: Не возможно запустить процесс приложения   
    При развертывании приложения PAServer выдаёт ошибку:
     
     

    Имя пользователя Windows сначала было русское, а потом переименовал на англ. Имя подключения английское. Имя проекта английское.
  20. Like
    97mik отреагировална Brovin Yaroslav в Как сделать промежутки между подгруппами итемов?   
    Тогда нужно сделать свой стиль в TStyleBook и задать его для этого итема.
    1. Кидаем на форму TListBox и создаем итемы. Для разделения групп настроек вставляем TListBoxGroupHeader. У меня получился такой вариант:

    2. Кидаем на форму TStyleBook и открываем редактор стиля, двойным кликом на TStyleBook.
    3. Перетаскиваем TLayout к корню стиля в Structure и задаем название стиля как "listboxgroupheader".

    4. Подключаем стиль бук в дизайнере к форме Form.StyleBook = StyleBook и задаем произвольную высоту для разделителей групп итемов.

     
    P.S. Если хотите оставить текст на разделителях, то нужно в стиль добавить контрол для вывода текст (TText или TLabel) с название стиля "text"
    О том, почему некоторые контролы имеют фиксированный размер написано тут: Почему для некоторых контролов нельзя поменять высоту или ширину? О том, как снять это ограничение (но не рекомендуется) написано тут: Как снять запрет изменения размера контролов
  21. Like
    97mik отреагировална Brovin Yaroslav в Как я могу скрыть / показать клавиатуру под "Android"?   
    Русский
    За управление виртуальной клавиатурой в FireMonkey отвечает сервис IFMXVirtualKeyboardService (Embarcadero Doc Wiki). Который позволяет отображать и скрывать клавиатуру.
    Для скрытия клавиатуры достаточно выполнить следующий код:
    uses FMX.Platform, FMX.VirtualKeyboard; procedure TForm5.ButtonHideKeybordClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Запрашиваем сервис виртуальной клавиатуры if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.HideVirtualKeyboard; end; Чтобы показать клавиатуру для контрола:
    procedure TForm5.ButtonShowKeyboardClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Запрашиваем сервис виртуальной клавиатуры if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.ShowVirtualKeyboard(Edit1); end;

    English 
    FireMonkey has special service for managing Virtual Keyboard. It is IFMXVirtualKeyboardService (Embarcadero Doc Wiki). It allows show and hide keyboard.
    For showing virtual keyboard use next code: uses FMX.Platform, FMX.VirtualKeyboard; procedure TForm5.ButtonHideKeybordClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Request service of visrtual keyboard if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.HideVirtualKeyboard; end; For showing virtual keyboard for control:
    procedure TForm5.ButtonShowKeyboardClick(Sender: TObject); var KeyboardService: IFMXVirtualKeyboardService; begin // Request service of visrtual keyboard if TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(KeyboardService)) then KeyboardService.ShowVirtualKeyboard(Edit1); end;
  22. Like
    97mik отреагировална Brovin Yaroslav в Почему на мобильных платформах у меня не рисуется окружность?   
    В вашем случае вы не задали тип кисти Canvas.Stroke. Более, чем уверен, что на устройстве там стоит TBrushKind.bkNone. Вашу проблему решит задание типа кисти TBrushKind.bkSolid.
    procedure TForm5.Image14Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var EllipseRegion: TRectF; begin Canvas.Stroke.Kind := TBrushKind.bkSolid; Canvas.Stroke.Color := TAlphaColorRec.Red; EllipseRegion := TRectF.Create(TPointF.Create(100, 100), 20, 20); Canvas.DrawEllipse(EllipseRegion, 1); end;  Хорошая практика отрисовки в FMX полагает, что вы полностью инициализируете все кисти, необходимые вам для отрисовки.
    Так же обратите внимание, что канва для формы и всех контролах, размещенных на ней, всегда существует в одном экземпляре. И правилом хорошего тона, является использовать канву, переданную через параметры события отрисовки.
  23. Like
    97mik отреагировална Brovin Yaroslav в Как правильно удалять контролы в RunTime?   
    Добрый вечер,
     
    Главное, что нужно помнить по теме время жизни объектов - это то, что в мобильных платформах (Android и iOS) процесс удаления объектов отличается от поведения на настольных платформах (Windows и OSX). В мобильных платформах появился механизм ARC (Automatic Reference Counting - автоматический подсчет ссылок). Почитать описание (на английском), как это работает можно тут: Apple Developer. Для нас же, это означает, что все объекты имеют поле - счетчик ссылок (RefCount). Когда счетчик ссылок равен нулю, объект автоматически удаляется. Если кто-то присваивает ссылку на объект, то счетчик автоматически увеличивается на 1.
    property RefCount: Integer read FRefCount; // Свойство TObject Можно ошибочно подумать, что это связано со сборщиком мусора. Однако, это не так. При компиляции, компилятор автоматически вставляет в код служебные команды по увеличению и уменьшению счетчика ссылок. Поэтому объект физически уничтожится в тот момент, когда счетчик ссылок станет равным 0. В то время как сборщик мусора, удаляет объекты по своему внутреннему расписанию.
     
    Теперь о вашем вопросе. Когда вы создаете объект и указываете ему родителя, автоматически ваш объект попадает как минимум в список дочерних объектов TabItem1. А значит, автоматически счетчик ссылок на TCircle будет увеличен. Когда вы сохраняете ваш объект в массиве, это опять же автоматически увеличивает счетчик ссылок. Поэтому, чтобы удалить объект есть два способа:
     
    1. Вызвать метод TObject.DisposeOf. Это форсирует вызов деструктора, но не очищает память выделенную под объект. Это означает, что выполниться код деструктора, TCircle будет удален из списков, все ресурсы, которые окружность захватила будут распущены. Но сама память, которая была выделена из кучи под его хранение будет распущена, только в момент, когда больше не будет ни одной ссылки. Например, так:
    c[r].DisposeOf; c[r] := nil; 2. Убрать все ссылки, которые указывают на ваш объект. Это приведет к автоматическому удалению объекта. Убрать объект из структуры объектов, путем удаления удаления его из родительcкого контроkа Parent = nil, и затем вызывать Free и занилилить уже ссылку на объект в массиве. 
    c[r].Parent := nil; c[r].Free; c[r] := nil; // Или FreeAndNil(c[r]), в зависимости от типа c. Если больше ссылок на ваш объект нету, то данный код автоматически удалит объект c[r].
    Дополнение от RAD Studio XE6. В этой версии компилятор автоматически после вызова метода Free очистит указатель на объект. По этой причине дополнительно присваивание nil указателю на объект не требуется на мобильных платформах
    var A: TObject; begin A := TObject.Create; A.Free; // В этом месте A = nil на мобильных платформах. // На настольных платформах: A указывает на мусор end;  Чтобы осталась совместимость с настольными платформами, лучше использовать второй подход.
     
    P.S. Никогда не вызывайте деструктор напрямую, вызовом метода Destroy.
×
×
  • Создать...