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

Brovin Yaroslav

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

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

  • Посещение

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

    390

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

  1. Пост Brovin Yaroslav - сообщение в Качественное увеличение картинка/изображения. Есть ли система изменения размеров картинки, с качественным увеличением? был отмечен как ответ   
    Добрый день. Нет в состав FMX не входят подобные фильтры по выполнению сжатия изображения разными способами.
  2. Пост Brovin Yaroslav - сообщение в Как удалить элемент в дизайнере стилей? был отмечен как ответ   
  3. Пост Brovin Yaroslav - сообщение в [TCornerButton] Почему у меня не применяется мой стиль к TCornerButton? был отмечен как ответ   
    В вашим проекте у вас ошибка. Посмотрите внимательно на:
    CornerButton1.StyleName = 'CornerButtonImageStyle'.  Должен быть пуст в вашем случае CornerButton1.StyleLookupName = 'CornerButton1Style1'. Хотя в стиле ваш стиль назван: "CornerButtonImageStyle"
  4. Пост Brovin Yaroslav - сообщение в Как сделать так, чтобы прозрачность родительского TRectangle не влияла на прозрачность дочерних компонентов? был отмечен как ответ   
    Описанное вами поведение корректное. Так как прозрачность родительского компонента влияет на прозрачность всех дочерних. В вашем случае достаточно задать прозрачность для кисти заливки Fill и границ Stroke, указав в цвете нужную альфа составляющую.
  5. Пост Brovin Yaroslav - сообщение в Как узнать, что приложение меняет свое состояние? был отмечен как ответ   
    В XE6 появился специальный сервис для контролирования смены состояния приложения IFMXApplicationEventService. Он позволяет задать свой обработчик на событие смены состояния. Всего поддерживаются следующие типы состояний TApplicationEvent:
    FinishedLaunching - приложение запущено BecameActive - приложение стало активным, после того, как до этого было свернутым. WillBecomeInactive - приложение будет активировано EnteredBackground - приложение свернулось WillBecomeForeground - приложение будет свернуто WillTerminate - приложение будет завершено LowMemory - Нехватка памяти OpenURL - открытие приложение по ссылке. 1 Способ. Запрос сервиса IFMXApplicationEventService
    Соответственно, чтобы узнать о смене состояния нужно:
    Запросить сервис:
    uses FMX.Platform; var ApplicationService: IFMXApplicationEventService; begin TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, ApplicationService); Создать свой обработчик и задать его при помощи полученного сервиса:
    function TForm1.ApplicationEventChanged(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; begin // Здесь получаем новое состояние приложения end; var ApplicationService: IFMXApplicationEventService; begin TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, ApplicationService); if ApplicationService <> nil then ApplicationService.SetApplicationEventHandler(ApplicationEventChanged); end; 2 Способ. Подписка на получение сообщения:
    Вместе со сменой состояния платформа FMX осуществляет широковещательную рассылку сообщения о смене состояния: TApplicationEventMessage
    Второй способ заключается в подписке на это сообщение:
    Подписываемся на получение сообщения TApplicationEventMessage:
    uses System.Messaging; // Подписка TMessageManager.DefaultManager.SubscribeToMessage(TApplicationEventMessage, DoApplicationEventChanged); Получаем сообщения
    procedure DoApplicationEventChanged(const Sender: TObject; const Message: TMessage); begin end; Не забываем отписаться от сообщений, когда это больше уже не нужно:
    // Отписка TMessageManager.DefaultManager.Unsubscribe(TApplicationEventMessage, DoApplicationEventChanged);
  6. Пост Brovin Yaroslav - сообщение в [Android] Как скрыть/показать системный Status Bar? был отмечен как ответ   
    С учетом того, что XE7 официально анонсирована. Возможность скрытия и отображения статус бара на Андроиде была добавлена и реализована в XE7.
  7. Пост Brovin Yaroslav - сообщение в Почему для моего контрола при копировании компонента в Design-Time не копируется внутренняя картинка? был отмечен как ответ   
    На счет  сеттера я ошибся, не обратил внимание, что это TImage.
    Ошибка в неправильном подходе создания собранного компонента. 
    Вы создаете в конструкторе объект TImage и добавляете его прямо к компоненту. Если вы не сбрасываете для TImage stored, то TImage будет сериализован в ресурсы формы (fmx - файл). НО при открытии формы заново, ваш компонент создаст опять новый объект TImage и + при чтении данных из ресурсов, общий механизм десериализации объектов восстановит старый TImage и в итоге вы получите два TImage.  Если вы говорите, что TImage не должен сохраняться в ресурсы. То при копировании объекта TImаge не будет копироваться, так как при копировании объекта в IDE по сути происходит копирование части ресурсов, относимые к этому объекту. В вашем случае нужно создать поля для хранения именно картинки TBitmap, открыть доступ к этому полю на запись и чтения. И в сеттере выполнять присваивание вашей картинки из поля TBitmap в TImage, который вы создаете динамически, но не сохраняете его в ресурсы (Stored = False) P.S. Кстати, такая тема частично уже обсуждалась на форуме: Как добавить в свой компонент TImage и дать возможность менять картинку? посмотрите
  8. Пост Brovin Yaroslav - сообщение в Проблемы с StyleBook при закрытии программы был отмечен как ответ   
    В XE7 описанные ошибки не воспроизводятся.
  9. Пост Brovin Yaroslav - сообщение в Как в Builder C++ задать выравнивание компонента TAlignLayout? был отмечен как ответ   
    Точка используется в языке Delphi, в С++ это будет в данном случае "::"
    ScrollBar1->Align = TAlignLayout::Client P.S. По скольку начиная с ХЕ6 требуется обязательное указание пространства имен для перечислимых типов, нужно обязательно указывать namespace.
  10. Пост Brovin Yaroslav - сообщение в Ошибка перед запуском приложения на iPad: "Unable to install package (e800801c)" был отмечен как ответ   
    Решение написано в комментарии: QC #119149 
    Открываем [Tools] | [Options...] | [Environment Options] | [Provisioing] Выбираем [iOS Device - Debug] для типа сборки Вводим ваш код от сертификата (цифры, указанные в скобках после названия вашего сертификата, например FJ3U479D4J) вместо "iPhone Developer" в [Developer Certificate] Нажимаем кнопку [OK] для закрытия опции диалога Пересобираем вашего iOS приложение для iOS устройства
  11. Пост Brovin Yaroslav - сообщение в Почему для моего компонента временно создаваеммые контролы в RunTime видны в Structure Panel? был отмечен как ответ   
    Добрый день, при создании временного компонента в ваше случае нужно указать для временно создаваемого компонента (FIcon, FDescription и тд)
    ​Stored = False
    О Stored можно почитать:
    "Какое назначение у свойства TFmxObject.Stored?"
    DocWiki: FMX.Types.TFmxObject.Stored

  12. Пост Brovin Yaroslav - сообщение в Почему для моего стиля TListBoxItem сбрасывается состояние встроенного TCheckBox при прокручивании списка? был отмечен как ответ   
    Я поясню. В вашем проекте, вы создали встроенный TCheckBox в стиле, дали ему свое название "mycheckbox". Но когда вы прокручиваете элементы в списке, то стиль выгружается для не видимых элементов и загружается для новых видимых заново. В этом случае TCheckBox теряет свое состояние (стоит галка или нет). Когда вы задаете галку для итема через:
    Item.StylesData['mycheckbox'] := True; то при загрузке стиля итем автоматически восстанавливает значение галки. А для состояния, когда галка снята, итем не сохраняет эту информацию. Поэтому ваше найденное решение заключается в том, что всем итемам нужно через StylesData задать состояние TCheckBox. И это в принципе правильно кроме одного НО: Обратите внимание, что не нужно устанавливать галку и тут же ее сбрасывать. Достаточно сделать это один раз и установить требуемое значение.
     
    Подробнее о ситуации выгрузке стиля можно прочитать тут: Почему для моих объектов стиля сбрасываются данные при прокручивании TListBox? - это аналогичная ситуация.
     
    P.S. На счет попутного вопроса о том, почему при загрузке нового стиля галка стоит отмеченной отвечу. В TListBox выгружаемые стили скрывающихся итемов при прокручивании не распускаются, а повторно используются для новых итемов.
  13. Пост Brovin Yaroslav - сообщение в Сортировка элементов TListBoxItem в TListBox при помощи функции Sort по любым критериям был отмечен как ответ   
    Добрый вечер,
     
    После сортировки вызовите:
    ListBox1.RealignContent;
  14. Пост Brovin Yaroslav - сообщение в Есть ли поддержка минимальной и максимальной даты в TDateEdit? был отмечен как ответ   
    Этот компонент не поддерживает этой функциональность.
    Но вы можете реализовать это используя событие: TDateEdit.OnChange
    procedure TForm1.DateEdit1Change(Sender: TObject); begin if DateEdit1.Date < MinDate then DateEdit1.Date := MinDate; if DateEdit1.Date > MaxDate then DateEdit1.Date := MaxDate; end;
  15. Пост Brovin Yaroslav - сообщение в [TWebBrowser] [Android] Работа с локальными картинками и файлами был отмечен как ответ   
    Добрый день,
     
    Для использования локальных картинок в локальной странице, всем картинкам нужно добавить приставку: 
  16. Пост Brovin Yaroslav - сообщение в Перевод массива кодов символов в строку был отмечен как ответ   
    Да, вы правы. Ошибся.
     
    StringOf использует текущую кодировку на платформе, на Windows - это ANSI, на мобильных платформах - это UTF8:
    function StringOf(const Bytes: TBytes): UnicodeString; begin if Assigned(Bytes) then Result := TEncoding.Default.GetString(Bytes, Low(Bytes), High(Bytes) + 1) else Result := ''; end; Поэтому лучше используйте TEncoding.ANSII:
    TEncoding.ANSI.GetString(BufferOfBytes, Low(BufferOfBytes), High(BufferOfBytes) + 1);
  17. Пост Brovin Yaroslav - сообщение в Как программно добавить изображения в MultiResBitmap? был отмечен как ответ   
    Например так:
    const RequiredSclae = 1.0; var BitmapItem: TFixedBitmapItem; Bitmap: TBitmap; begin if OpenDialog.Execute then begin // Запрашиваем картинку для нужного Scale Bitmap := Image1.MultiResBitmap.Bitmaps[RequiredSclae]; // Проверяем, есть картинка или нет. if Bitmap = nil then begin // Если нет, то заводим контейнер для новой картинки BitmapItem := Image1.MultiResBitmap.Add; BitmapItem.Scale := RequiredSclae; Bitmap := BitmapItem.Bitmap; end; Bitmap.LoadFromFile(OpenDialog.FileName); end;
  18. Пост Brovin Yaroslav - сообщение в AniCalculations в TListView, оттягивание. Возможно? был отмечен как ответ   
    Добрый день,
     
    Увы нет, это поведение определяется по умолчанию самой платформой: "Будет ли доступен эффект оттягивания или нет".
    AniCalculation есть в TListView, но он закрыт.
     
    Единственное решение, это при наличии исходников FMX, завести для TCustomListVIew открытое свойство для поля FAniCalc в файле FMX.ListView.pas.
    property AniCalculation: TAniCalculations read FAniCalc;
  19. Пост Brovin Yaroslav - сообщение в Как правильно программно удалить TListBoxItem из стилевого объекта? был отмечен как ответ   
    Добрый день,
     
    Неправильно построили алгоритм. При скрытии стилизованных контролов, контрол выгружает (удаляет) свой стиль. Поэтому, когда вы из объекта стиля скрываете стилизуемый контрол (TListBoxItem), то он в свою очередь удаляет ваш стиль вместе с TSpinBox. В итоге управление возвращается у уже полностью разрушенный объект и вы получаете исключение.
     
    Чтобы в вашем варианте скрыть TListBoxItem есть триспособа:
    Сделать отложенное удаление штатными средствами FireMonkey:
    ListBoxItem1.Release; Явно запретить TListBoxItem выгружать стиль, когда он скрывается со сцены. Это можно сделать так:
    ListBoxItem1.DisableDisappear := False Поставить в очередь скрытие итема через TThread.Queen. В этом случае ваша процедура скрытия вызовется после всех действий.
    TThread.Queue(TThread.CurrentThread, procedure begin ListBoxItem1.Visible := False; end); Сделать отложенное скрытие. То есть после изменения значения TSpinBox, вы можете, например, запустить таймер на 500-600 мс и по истечении времени скрыть итем. Правда по мне так этот способ не надежный и я бы не советовал не использовать. P.S. Если хотите удалить итем из стилевого объекта, то лучше делать тогда вторым способом.
  20. Пост Brovin Yaroslav - сообщение в [OSX] Поддерживаются ли встроенные покупки In-app Purchases для OSX? был отмечен как ответ   
    Добрый день,
     
    На текущий момент XE6, сервис встроенных платежей не реализован для OSX и Win
  21. Пост Brovin Yaroslav - сообщение в Как определить, что ListBox прокручен в самый конец? был отмечен как ответ   
    Добрый день,
     
    Определить, что TListBox (TScrollBox) прокручен до конца можно используя событие OnViewPortPositionChange. Это событие вызывается каждый раз при прокручивании контента. Этот метод возвращает текущее положение ViewPort - позиция окна, в котором отображаются текущие элементы TListBox. Об этом подробно описано в этой статье: "Платформонезависимый скроллинг в Fire Monkey"
     
    Ниже приведен код, который проверяет, что TListBox прокручен до конца.
    procedure TForm1.ListBox1ViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean); begin if NewViewportPosition.Y > ListBox1.ContentBounds.Height - ListBox1.Height then ShowMessage('End!'); end;
  22. Пост Brovin Yaroslav - сообщение в Как очистить ScrollBox от содержимого был отмечен как ответ   
    Все контролы, которые вы кидаете в TScrollBox находятся в дополнительном промежуточном контроле TScrollContent. Когда вы удаляете все дочерние узлы TScrollBox, то вы удаляете все сами, стиль и контент, что делать нельзя.
    Похожее поведение есть и в TTreeView: При попытке создать дочерние итемы при разворачивании узла дерева, у меня возникает ошибка. В чем может быть проблема?
    Поэтому, удалять объекты нужно непосредственно у контента. Это можно сделать так:
    type TOpenScrollBox = class(TScrollBox); procedure ClearChildren(AScrollBox: TScrollBox); begin Assert(AScrollBox <> nil); TOpenScrollBox(AScrollBox).Content.DeleteChildren; AScrollBox.Repaint; end;
  23. Пост Brovin Yaroslav - сообщение в Как программно добавить объект в StyleBook? был отмечен как ответ   
    Добавление своего объекта в стиль бук, на примере добавления TImage:
    var Image: TImage; begin Image := TImage.Create(nil); Image.StyleName := 'MyNewImage'; ImageBook.Style.AddObject(Image); end; На счет остальных вопросов нужно смотреть по факту. Если скорость загрузки изображения вас не устраивает (тормозит интерфейс), то делайте асинхронную загрузку изображения в потоках. Иначе не нужно усложнять себе жизнь.
     
    Если изображений очень много и они большие, то я бы не стал всех грузить в TStyleBook. Опять же все зависит от реального варианта использования. 
  24. Пост Brovin Yaroslav - сообщение в [TScrollBox] Как предотвратить автоскрытие скроллбара при использовании AniCalculations был отмечен как ответ   
    Добрый день,
     
    Такое поведение не предусмотрено.
  25. Пост Brovin Yaroslav - сообщение в Выделенный CustomListBoxItem выходит за границы ListBox'а при скроллинге. был отмечен как ответ   
    Выглядит так, как будто TListBox по умолчанию не обрезает дочерние контролы по своей границе.
    Попробуйте установить:
    ListBox.ClipChildren := True;
×
×
  • Создать...