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

Brovin Yaroslav

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

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

  • Посещение

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

    390

Весь контент Brovin Yaroslav

  1. Выглядит так, как будто TListBox по умолчанию не обрезает дочерние контролы по своей границе. Попробуйте установить: ListBox.ClipChildren := True;
  2. Оформите этот вопрос отдельно, я на него дам ответ. P.S. Nixon уже ответил на этот вопрос.
  3. 10 Глава. Стилизация

  4. Чтобы добавить в свой итем поддержку выделения, нужно в TListBox добавить объект, который будет использоваться для выделения: Добавляем TRectangle в стиль TStyleBox -> Background. Для добавленного прямоугольника задаем название стиля: StyleName = 'selection' Указываем цвет заливки прямоугольника После запуска TListBox будет использовать этот объект для осуществления выделения своих итемов.
  5. Каково назначение поля DataString? Колонки по ширине всегда одинаковой ширины? Если я правильно понял, то компоненту не требуется поддержка стилизации?
  6. Добрый день О том, как получить доступ к любому свойству через StylesData (в том числе к свойству text) частично описано тут: Как получить значение свойства объекта стиля, используя StylesData? Как получить объект стиля? Назначение обработчиков событий для элементов стиля через StylesData Допустим, что TSpinBox в стиле назван (StyleName), как 'spinbox', тогда Присваивание обработчика для SpinBox: ListBoxItem1.StylesData['spinbox.OnChange'] := TValue.From<TNotifyEvent>(SBCountChange); Доступ к свойству Text у TSpinBox: ListBoxItem1.StylesData['spinbox.Text'].ToString; Таким способом можно получить доступ к любому свойству и событию любого элемента стиля.
  7. Каждый стилевой объект является дочерним к корню TStyleBook. Поэтому получение количества стилевых объектов будет запрашиваться так: StyleBook1.Style.ChildrenCount
  8. Исправлено в XE10. Workaround для версий до XE8 (включительно) Перед вызовом анимации сбросить Inverse в False. Это косвенно обсуждалось в теме: Как сделать эффект вспышки для контрола, когда он подсвечивается на короткий диапазон времени?
  9. При добавлении своих итемов загрузите стиль принудительно: procedure TTabbedForm.AddItem; var Item: TCustomListBoxItem; begin Item:=TCustomListBoxItem.Create(ListBox1, 100); Item.AssignBitmap(ImageControl1.Bitmap); Item.MainText := DateToStr(Now); Item.DetailText := 'Note'; ListBox1.AddObject(Item); Item.ApplyStyleLookup; // <-- форсируем загрузку стиля end; Если стиль грузить не хотите, то можно принудительно вызывать метод для выравнивания всех итемов: ListBox.RealignContent; Но этот метод нужно вызвать после того, как стили всех видимых итемов были загружены. P.S. При создании своих итемов не вешайте внутри них на свои же события OnResize и OnApplyStyleLookup обработчики. При таком подходе любой пользователь вашего класса, повесив свой обработчик полностью сломает логику работы ваших итемов. Вместо этого используйте специальные виртуальные методы базового класса: procedure ApplyStyle; override; procedure Resize; override;
  10. 7 глава. Эффекты и Фильтры

  11. У вас простая ошибка в реализации OnExpandAction: Вы вызываете Item.DeleteChildren Этот метод удаляет все дочерние объекты. Но в FireMonkey в дочерние объекты так же входят объекты стиля. Поэтому вы по сути удалили все итемы и стиль этого элемента, хотя сами в OnClick (кнопки стиля узла дерева) еще находитесь в кнопке, которую разрушили. Правило: удалять нужно только подитемы. Очистить подитемы в узле дерева можно так: procedure RemoveSubNodes(ARoot: TTreeViewItem); var SubNode: TTreeViewItem; begin Assert(ARoot <> nil); while ARoot.Count > 0 do begin SubNode := ARoot.ItemByIndex(0); SubNode.Parent := nil; FreeAndNil(SubNode); end; end;
  12. Пока могу предложить вам только другие курсы: Hi-TECH Academy - Партнер компании Embarcadero. Читает очные курсы по XE6. По ссылку есть вся необходимая информация по записи на курс и ценам. Курсы могут быть как в Москве, так и локализованы в регионе в зависимости от состояния набора. SoftLine. Учебный центр Softline по заявке. SkillFactory. Ориентировочно планируют организовать дистанционные курсы для самостоятельного изучения в октябре-ноябре.
  13. Поняли правильно, системный диалог выбора времени на андроиде не дает возможности изменять секунды и миллисекунды. Чтобы заменить значение миллисекунд на свое вы можете воспользоваться функцией RecodeSecond или RecodeMilliSecond: #include "System.DateUtils.hpp" void __fastcall TForm1::TimeEdit1Change(TObject *Sender) { TimeEdit1->DateTime = RecodeSecond(TimeEdit1->DateTime, 0); }
  14. Такой вариант тоже возможен. Просто он является более длинной записью конвертации, чем использование встроенных хелперов в сам тип TDate. P.S. А вообще лучше избегать сравнение времени через строковое представление. Так как вероятность ошибки при смене формата очень высок. Поэтому лучше хранить всегда дату в форматах TDateTime, TDate, TTime.
  15. Клик по итему Как уже предыдущие пользователи правильно заметили, нажатие на итем в списке самый интуитивно понятный способ на мобильных платформах. По скольку это полностью совпадает с правилами построения пользовательского интерфейса на мобильных платформах. Не надо придумывать свои способы, когда уже есть стандартные. Этим вы только запутаете пользователя, привыкшего к общему принципу работы с любым приложением. Если вам такой способ нужен, то лучше перепроектируйте ваш интерфейс, чтобы этого избежать (смотрите пункт 1.) Открытие нового вида На счет этого, если вы делаете приложение под андроид, то я бы не рекомендовал для этих целей использовать TTabControl. По одной самой главной причине: Потребление дополнительных ресурсов. Заставляет форму создавать все контролы на всех вкладках, даже на тех, что не видны. Легко представить типичную ситуацию, когда ваше приложение довольно большое и содержит большое число форм ввода и редактирования данных. Теперь представьте, что все эти контролы создаются при запуске приложения и живут все время существования приложения. Это совсем не маленькие размеры памяти, особенно на Андроиде. Ресурсы мобильной платформа не равны ресурсам настольных платформ. И если на настольной системе вы можете особо не заморачиваться о размере потребляемой памяти, так как ее много. То на мобильнике это может привести к нехватке памяти и как следствие разрушение вашего приложения. Главная идея - это иметь в каждый момент времени только то, что нужно. Поэтому я бы лучше рассматривал либо создание отдельной формы, либо создание в рантайме специального слоя (вида), которые будет загружен по верх всего, а потом будет разрушен после окончания выполнения редактирования. Так же советую использовать фреймы для таких функционально законченных блоков (редакторы сущности): Позволяет быстро и удобно создавать в нужное время на мобильной платформе требуемый вид. Забирая от системы ресурсы только в тот момент, когда они действительно необходимы. Повторное использование в других местах приложения.
  16. Конвертации вида: TTime <-> String TDate <-> String TDateTime <-> String являются базовыми операциями в RTL и не имеют отношения к компоненту TTimeEdit. Чтобы время перевести в строку с требуемым форматом, нужно использовать метод FormatString: TimeEdit1->Time.FormatString("hh:nn:ss"); По умолчанию все функции конвертации без параметров используют настройки формата из FormatSettings. Можете поменять стандартный формат в этой глобальной переменной, тогда все функции будут использовать ваш формат.
  17. Лучше использовать для этих целей TMetropolisUIListBoxItem и создавать итемы именно этого класса. Так как TMetropolisUIListBoxItem определяет логику по заданию данных в объекты стиля item = new TMetropolisUIListBoxItem(Owner); Стандартный стиль для TMetropolisUIListBoxItem - "collectionlistboxitem"P.S. Когда создаете объекты в RunTime нужно указывать в качестве владельца форму, а не родительский контрол.
  18. О вашей цели. Я уже не раз говорил вам, что не получится сделать то, что вы хотите. В частности нельзя просто так взять и поместить FireMonkey компонент в нативный. Это задача не тривиальная и требует глубокого понимания работы платформы FireMonkey под Android. Вы на это потратите кучу времени и с очень большой вероятностью не дойдете до финиша. Об отладке java кода. Stack Trace попадает в лог только если в коде выбрасывающим исключение явно написано выводить StackTrace. try { .... } catch (IOException e) { e.printStackTrace(); } В любом другом случае будет выведено только название исключение. Поэтому отлаживаться лучше через команды логирования Log.d, Log.e, Log.w
  19. Главные отличия TListView от TListBox в: TListBoxItem - контрол, TListViewItem - нет В TListBoxItem можно добавлять любые контролы, используя Parent. В TListVIewItem - нет. TListVIewItem хранит только данные для отображения TListVIewItem сам выполняет отрисовку хранимых данных через метод Render За счет собственно ручной отрисовки в TListVIewItem достигается прирост скорости и малое потребление памяти (хранение только актуальных данных) Чтобы создать свой вариант TListViewItem, нужно создать свой класс итема, в нем реализовать требуемые данные (например время) и создать in-place редактор для редактирования времени, зарегистрировать его и тд. P.S. В вашем случае, проще использовать Master-Detail подход. При котором по нажатию на итем, будет открываться вкладка для редактирования информации об итеме, в том числе время через TTimeEdit. Это будет быстрее и проще. P.S.P.S. Если же вы все-таки хотите создать свой итем, будьте готовы, что придется детально изучить, как это делается в самом TListVew.
  20. 1. Устанавливаем отображение итемов в TListView с картинкой: 2. Вытаскиваем по имени картинку из TStyleBook способом, описанным в этой теме: Есть ли в fmx класс TImageList? function GetImage(const AImageBook: TStyleBook; const AImageName: string): TBitmap; var StyleObject: TFmxObject; Image: TImage; begin StyleObject := AImageBook.Style.FindStyleResource(AImageName); if StyleObject is TImage then begin Image := StyleObject as TImage; Result := Image.Bitmap; end else Result := nil; end; 3. Код по установке картинки в итем: var ListItem: TListViewItem; begin ListItem := ListView1.Items.Add; ListItem.Bitmap.Assign(Image1.Bitmap); end; 4. Наблюдаем результат:
  21. Почему не добавляется иконка в TListBoxItem на платформе Windows?Так же поле Detail так же не поддерживается для TListBoxItem под Windows.Либо используйте свой стиль, либо TMetropolistUIListBoxItem P.S. Лучше определить TTimeEdit в стиле. При создании TTImeEdit, привязке к итему и большом числе итемов могут наблюдаться большое потребление ресурсов. За счет того, что для 1000 итемов будет создано и не распущено 1000 TTimeEdit
×
×
  • Создать...