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

Brovin Yaroslav

Администраторы
  • Постов

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

  • Посещение

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

    390

Ответы сообщества

  1. Пост Brovin Yaroslav - сообщение в Есть ли принципиальная возможность управлять раскраской PickerList'а у TCombobox? был отмечен как ответ   
    TComboBox имеет две реализации выпадающего списка. Выбор реализации зависит от свойства DropDownKind.
    TDropDownKind.Custom - означает, что будет TComboBox будет сам реализовывать выпадающий список. Он его делает на основе TPopup и TListBox. Так как TComboBox хранит в себе элементы TListBoxItem. То вы можете создать специальные стили для раскрашивания и указывать их для требуемых элементов выпадающего списка. 

    Пример, упоминания есть тут: [Windows] TComboBox, как разрешить использовать кастомные, стилизованные TListBoxItem в выпадающем списке? В случае с TDropDownKind.Native на iOS и Android используются нативные контролы, которые не подлежат стилизации FireMonkey. Они еще известны в FireMonkey, как Pickers (FMX.Pickers.pas) На Windows и OSX вместо нативных используется эмуляция, в которой используется наш TListBox в выпадающем окне. Однако, он не доступен напрямую для редактирования стилей элементов, в целях универсальности. 
  2. Пост Brovin Yaroslav - сообщение в Можно ли заполнить TListView в DesignTime без LiveBinding? был отмечен как ответ   
    Добрый день,
     
    Нет, TListView не поддерживает создание элементов в DesignTime, только в RunTime. Но такая функция будет очень полезной.
  3. Пост Brovin Yaroslav - сообщение в Позволяет ли медиаплеер запускать видео НЕ на весь экран? был отмечен как ответ   
    Добрый день,
     
    На Андроиде пока нет.
  4. Пост Brovin Yaroslav - сообщение в Поддерживает ли TImage 9-patch? был отмечен как ответ   
    Нет, базовый Timage не поддерживает 9-patch изображения. 
     
    Однако, в FireMonkey для создания растровых стилей есть специальный объект, позволяющий вывести такое изображение: FMX.Styles.Objects.TStyleObject.
     
    Чтобы этот объект появился в палитре инструментов его нужно зарегистрировать. Это можно сделать так:
    Редактирование стиля, как добавить "TStyleObject", "TActiveStyleObject" и т.п.? Или просто установить пакет FGX, который в том числе регистрирует все стилевые объекты.
  5. Пост Brovin Yaroslav - сообщение в ошибка e8008015 был отмечен как ответ   
    С вероятность 99% все такие ошибки связаны с неправильной настройкой девайса для отладки. Поэтому они решаются обычно проверкой сертификата и Provision Files.
     
    По вашей ошибке:
    Adhoc distribution not working, error e8008016 displays as 0xE8000001 Error during install of Distribution Build onto device
  6. Пост Brovin Yaroslav - сообщение в [Android] [XE7] Пропадает окно ShowMessage был отмечен как ответ   
    В XE7 диалоговые окна стали не блокирующими. То есть, событие закрытия диалога приходит асинхронно через указанный CallBack. 
    В ShowMessage нету параметра CallBack. Поэтому вместо него нужно использовать:
    MessageDlg('Text', TMsgDlgType.mtCustom, [TMsgDlgBtn.mbOK], -1, procedure (const AResult: TModalResult) begin Application.Terminate; end); Ссылка на эту тему: 
    [Android] Использование ACloseDialogProc в MessageDlg Пример использования MEssageDlg в C++ Builder
  7. Пост Brovin Yaroslav - сообщение в Куда пропали методы DoChangeTracking и Change? был отмечен как ответ   
    Начиная с XE7 TEdit построен с использованием представлений. Частично общая идея описана тут: Нативные элементы управления
     
    Что это означает теперь для разработчиков компонентов?
    Что в вашем ситуации, старая реализация перенесена полностью в представление FMX.Edit.Style.TStyledEdit. Варианта два:
     
    1. Создание своей модели данных
    Все данные TEdit теперь хранятся в отдельном классе - моделе. Вы можете создать свою модель данных для, отнаследовавшись от TCustomEditModel и перекрыв требуемые методы DoChangeTracking и DoChange. 
    В этом случае ваш код будет работать и с нативным представление TEdit для iOS так же. Если требуется внести только доп. действия для обработки данных. То вам не потребуется создавать свой компонент. Поскольку вы просто подмените модель TEdit своим классом в событии OnModelChoosing 2. Создание своего представления
    В этом случае вы должны создать свою представление на базе представления TEdit (TStyledEdit) или свое с нуля. В этом случае будут доступны все старые методы, которые были ранее.
  8. Пост Brovin Yaroslav - сообщение в Помогите разобраться с редактированием стиля в StyleBook был отмечен как ответ   
    Стили бывают двух видов:
    Растровые - использую картинки для отображения Векторные - использую векторные объекты На первых скриншотах представлен вариант векторного стиля, составленного, как видно в том числе из векторного объекта TRectangle.
    На вашем же, у вас растровый стиль. Объект TButtonStyleObject берет регионы исходного изображения и сам их отрисовывает в нужные моменты времени.
     
    Списки регионов изображений для разных состояний кнопки: HotLink, FocusedLink, NormalLink, PressedLink
    Название исходного изображения (стиля, содержащего изображение) - SourceLink
     
    Полезное следствие для понимания, 
    В векторном стиле вы можете менять параметры отрисовки через свойства (в виду природы векторной графики).  В растровом стиле, вам нужно менять исходное изображение. Сейчас все базовые стили растровые.
     
    Полезные ссылки:
    [Android] Как поменять цвет выделенного итема в ListBox для андроид стиля? [Android] Можно ли изменить цвет TProgressBar?  
  9. Пост Brovin Yaroslav - сообщение в Почему при старте программы FindStyleResource не может ничего найти? был отмечен как ответ   
    Ответ прост.
     
    Потому что в событии OnCreate и OnShow еще не загружен стиль. Поэтому FindStyleResource ничего вам не найдет. Стиль загружается обычно в момент первой прорисовки.
     
    Два решения:
    Принудительно загрузить стиль для требуемого компонента
    Button1.NeedStyleLookup; Button1.ApplyStyleLookup; Выполнять код по поиску элементов стиля в специально отведенном событии TStyledControl.OnApplyStyleLookup.
  10. Пост Brovin Yaroslav - сообщение в Использование WebView. Отслеживание переходов с помощью decidePolicyForNavigationAction был отмечен как ответ   
    Ошибка в неправильной трансляции методов протокола. В вашем случае:
    – webView:decidePolicyForNavigationAction:request:frame:decisionListener: Должен перейти в (Правильно):
    procedure webView(webView1: WebView; decidePolicyForNavigationAction: NSDictionary; request: NSURLRequest; frame: WebFrame; decisionListener: WebPolicyDecisionListener); cdecl; А не в (Неправильно), потеряли параметр webView :
    procedure decidePolicyForNavigationAction(actionInformation: NSDictionary; request: NSURLRequest; frame: WebFrame; listener: WebPolicyDecisionListener); cdecl; В качестве примера, посмотрите для сравнения, как транслируется CLLocationManagerDelegate:
    – locationManager:didFailWithError: – locationManager:didUpdateToLocation:fromLocation: В Delphi:
    CLLocationManagerDelegate = interface(IObjectiveC) ['{C1794A16-F4FB-46E1-839E-2AFBA43B420C}'] procedure locationManager(manager: CLLocationManager; didFailWithError: NSError); cdecl; overload; procedure locationManager(manager: CLLocationManager; didUpdateToLocation: CLLocation; fromLocation: CLLocation); cdecl; overload; end;
  11. Пост Brovin Yaroslav - сообщение в Отличия отрисовки Stroke для DrawRect под Windows и Android был отмечен как ответ   
    Посмотрите "Почему на мобильных платформах у меня не рисуется окружность?". Я думаю в вашем случае ответ будет такой же.
  12. Пост Brovin Yaroslav - сообщение в Нативные элементы управления был отмечен как ответ   
    На счет планов вам не могу ничего рассказать.
     
    На счет того, что значит "нативный" элемент управления. Практически все контролы FireMonkey - это самодельные контролы, которые сделаны с нуля. За исключением пары: TWebBrowser, TMediaPlayerControl и TBannerAd. "Нативные" - это значит использование родного элемента управления, предоставляемого операционной системой. Каждая ОС имеет свой набор элементов управления, которые можно использовать в своих программах. Поэтому, в XE6 появился механизм поддержки нескольких реализаций контрола в рамках одной системы. Или другими словами появился некий аналог MVP (Model, View, Presenter), который позволяет в режиме выполнения менять на лету способы отображения контрола и его работу.
     
    XE7 имеет несколько контролов, которые поддерживают такой механизм: TEdit, TCalendar, TEditBox, TSpinBox, TNumberBox, TCalendarEdit, TClearingEdit, TComboEdit и TComboTrackBar. Это значит, что для этих контролов пользователь может использовать новый подход для создания своих независимых представлений. Из этих контролов, пока только 2 имеют нативное представление (то есть используют контролы ОС) - это TCalendar и TEdit.
     
    Выбор представления осуществляет через свойство ControlType. Platform - означает, что будет пытаться взяться нативное представление, Styled - самостоятельная реализация FM с использованием стилей. Если текущая платформа не имеет нативного представления, то контрол автоматически будет использовать Styled представление.
     
    Нативное представление обычно не может покрыть всю функциональность FMX. Так как у нас она расширенная. Но список ограничений для нативных представлений есть на сайте DocWiki.
  13. Пост Brovin Yaroslav - сообщение в Как сделать отложенное удаление компонента из обработчика его же события? был отмечен как ответ   
    Это ошибка 3D контрола в FMX. В коде TControl3D пропущена проверка на не пустой Context. Context сбрасывается в момент Parent := nil.
     
    Поэтому Release для 3D объектов не подойдет до исправления.  Для 2D объектов Release работает корректно.
     
    В итоге, удалить можно:
    Либо в OnMoseUp Либо использовать TTimer для этого. Или вспомогательную обертку, для более удобного удаления объектов подобным способом. P.S. Ошибку уже исправил.
  14. Пост Brovin Yaroslav - сообщение в [Android/Windows] [XE7] Как запретить прокручивание? был отмечен как ответ   
    Тогда, отключение:
    ScrollBox.AniCalculations.TouchTracking := []; Включение:
    ScrollBox.AniCalculations.TouchTracking := [ttVertical];
  15. Пост Brovin Yaroslav - сообщение в Как добиться эффекта отражения? был отмечен как ответ   
    Используем специальные методы:
    TBimap.FlipHorizontal TBimap.FlipVertical TBimap.Rotate TBitmapSurface.Mirror TBitmapSurface.Flip TBitmapSurface.Rotate90 Или получаем доступ к точкам изображения и меняем их расположение.
    procedure FlipHorizontal(var ABitmap: TBitmap); var Data: TBitmapData; X, Y: Integer; Pixel: TAlphaColor; begin Assert(ABitmap <> nil); if ABitmap.Map(TMapAccess.ReadWrite, Data) then try for X := 0 to (Data.Width div 2) - 1 do for Y := 0 to Data.Height - 1 do begin Pixel := Data.GetPixel(X, Y); Data.SetPixel(X, Y, Data.GetPixel(Data.Width - X, Y)); Data.SetPixel(Data.Width - X, Y, Pixel); end; finally ABitmap.Unmap(Data); end; end; Аналогично делается отражение относительно горизонтальной оси.
  16. Пост Brovin Yaroslav - сообщение в [TCornerButton] [Android] Почему у TCornerButton не поддерживаются XRadius и YRadius на Android? был отмечен как ответ   
    Стиль для андроида растровый. А он не поддерживает скругление. Поэтому свойства "XRadius" и "YRadius" игнорируются.
     
    Если требуется добавить такую поддержку, то нужно сделать векторный стиль для этой кнопки. Только нужно помнить, что стиль должен состоять из прямоугольников TRectangle с названиями: "Background" и "SecondBackground"
  17. Пост Brovin Yaroslav - сообщение в Почему при очистке элементов у TComboBox, не удаляются пользовательские объекты, прикрепленные к итемам? был отмечен как ответ   
    Потому что лучше очищать пользовательские объекты, так как это потенциально снижает варианты использования списков. Так как в качестве такого объекта может выступать все что угодно. Начиная от простых объектов, как у вас, и заканчивая "тяжелыми" объектами коннектами, источниками данных и тд. В этом случае вам придется делать дубликаты ваших данных или использовать более умные варианты прокси объектов для доступа к единому источнику данных. Используемый для хранения итемов TStringList не подразумевает очистку хранимых в нем объектов. Для этого есть другой список TObjectList, но он не используется по причине первого пункта. Если вы хотите отследить момент удаления объекта, для исключения его из списка. Вы можете воспользоваться интерфейсом IFreeNotification. 
  18. Пост Brovin Yaroslav - сообщение в Как узнать поддерживаемый максимально допустимый размер изображения в TBitmap? был отмечен как ответ   
    В FireMonkey TBitmap имеет верхнее ограничение на размеры хранимого изображения, ограниченные максимально допустимым размером текстур в текущей платформе. Узнать максимальную ширину и высоту можно так:
    var MaxWidthHeight: Integer; begin MaxWidthHeight := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize); end;
  19. Пост Brovin Yaroslav - сообщение в [TCornerButton] Можно ли группировать CornerButton? был отмечен как ответ   
    Нет, нельзя. 
     
    Но если очень хочется, можно сделать наследника от TCornerButton и реализовать интерфейс IGroupName. Через этот интерфейс идет группировка всех контролов в FireMonkey.
  20. Пост Brovin Yaroslav - сообщение в [Android] [XE7] Как программно включить GPS? был отмечен как ответ   
    Никак,
     
    На андроиде специально сделано включение/выключение GPS только через настройки телефона. Включить GPS можно программно только при помощи неисправленных уязвимостей ОС Андроид. 
     
    Хорошая дискуссия есть на StackOverflow: How can I enable or disable the GPS programmatically on Android?
  21. Пост Brovin Yaroslav - сообщение в Добавлена ли поддержки своих шрифтов в XE7? был отмечен как ответ   
    Такой поддержки в XE7 нету.
  22. Пост Brovin Yaroslav - сообщение в [XE7] Что использовать вместо TFmxObject.AnimateXXX в XE7? был отмечен как ответ   
    Добрый вечер,
     
    Эти методы были перенесены в класс FMX.ANi.TAnimator. Теперь эти методы классовые, поэтому в качестве первого параметра нужно указывать объект, для которого анимируются свойства. Так же в него вошли дополнительные методы по запуску триггеров и анимации по названию.
  23. Пост Brovin Yaroslav - сообщение в TChart ест память? был отмечен как ответ   
    Запускаю ваш проект на XE7 под Widnows 64Bit. Рост памяти не вижу. Специально сделал частоту генерации данных, 10 раз в секунду. Прикладываю скриншоты анализа используемой памяти. Как видно на графиках, рост памяти не наблюдается на графике, постоянен и равен 33,4 Мб. 

     
    При удалении TeeChart все корректно происходит. Память занимаемая самим компонентом отдается менеджеру памяти Delphi, а не системе. А менеджер делфи будет держать ее у себя для новых ваших объектов. Поэтому вы не увидите на системном графике, что память отдана обратно приложением операционной системе. 
     
  24. Пост Brovin Yaroslav - сообщение в Поддержка соединения устройств по Bluetooth был отмечен как ответ   
    Полная поддержка Bluethooth была добавлена в RAD Studio XE7
  25. Пост Brovin Yaroslav - сообщение в В каких координатах выполняется отрисовка на канве? был отмечен как ответ   
    В FMX работа с канвой принципиально отличается от работы в VCL. В VCL канва была у каждого оконного контрола своя. В FMX одна канва на все контролы в одной форме. Несколько важных фактов, которые помогут вам:
    Канва одна на всю форму и на все контролы формы. Из пункта 1 следует - Значит каждый контрол рисует себя на одной общей канве При передачи управления на отрисовку контролу, канве задаются настройки (матрица трансформации, кисти и тд) таким образом, чтобы отрисовка выполнялась в локальных координатах контрола. Значит если вы рисуете в другом месте, то отрисовка выполняется в глобальных координатах формы. По этому отрисовку нужно выполнять в абсолютных координатах (координатах формы) Прямую отрисовку на форме нельзя выполнять по нажатию на кнопку. Так как в FMX есть четкая последовательность фаз отрисовки. Места отведенные для рисования - это событие OnPaint. В противном случае, не гарантируется корректная отрисовка на всех платформах.
×
×
  • Создать...