Перейти к содержанию

Вопросы

Для примера:

 

Есть объект ListBoxItem. В StyleBook загружен стиль по умолчанию. Для итема лист бокса задан стандартный стиль:

ListBoxItem.Stylename = "listboxitemlabel"

Если заглянуть в StyleBook, то мы увидим что "listboxitemlabel" это TLayout.

  • Каким образом можно изменить/получить свойства этого объекта, к примеру текущую его высоту для нашего ListBoxItem?
Отредактировал Brovin Yaroslav

Поделиться сообщением


Ссылка на сообщение

Рекомендуемые сообщения

  • 0

Вроде как можно искать объект стиля, например иконку в ListBoxItem:

var
  StyleObject: TFmxObject;
  StyleIcon: TControl;
begin
  // Ищем объект стиля - картинка. Лучше закешировать один раз, избежав постоянный поиск картинки 
  StyleObject := Item.FindStyleResource('icon');
  if (StyleObject <> nil) and (StyleObject is TControl) then
  begin
    StyleIcon := TControl(StyleObject);
    // и дальше работаем как с обычным контролом
  end;
end;

попробуйте, может поможет.

Поделиться сообщением


Ссылка на сообщение
  • 0

Еще можно через StylesData. Но в этом случае вначале идет название (StyleName) внутреннего объекта стиля, а потом через точку название свойства. 

Вы пытались задать, но не правильно указали название элемента. Если итем лист бокса принимает стиль "listboxitemlabel", то чтобы добраться например до внутреннего объекта icon. Нужно написать так:

ListBoxItem.StylesData['icon.width'].asInteger 

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От eser
      Как связать кастомный элемент стиля (например к тексту на кнопке лежащей на элементе listbox'а)  с полем FDQuery при помощи Livebinding?
    • От Error
      ЧАВО:
      Опишу "багофичу" на которую я наткнулся.
      Предположим что вы пишете свой компонент, наследуемый от TStyledControl (или любого другого компонента, который происходит от  TStyledControl), для доступа к элементам стиля обычно используют FindStyleResource('ИмяРесурса') (есть вариант в виде FindStyleResource<Класс>('ИмяРесурса', Переменная)) , например компонент TImageControl получает Image так:
      procedure TImageControl.ApplyStyle; begin inherited; if FindStyleResource<TImage>('image', FImage) then UpdateImage; end; И FindStyleResource работает отлично, пока в дереве стиля искомый объект лежит на НЕ TStyledControl-ах, то есть FindStyleResource будет успешно находить объект, который расположен на TRectangle, но не найдет его же, но на TPanel!
      Пример:
      Код, в процедуре ApplyStyle:
      procedure TEsImageSelection.ApplyStyle; var T: TControl; begin inherited ApplyStyle; if FindStyleResource<TControl>('selection', T) then ShowMessage('"selection" founded!'); end; Что делает данный код? - При нахождении стилевого объекта выдает соответствующее сообщение.
      Рассмотрим стиль:

      Как видите в варианте A, "Selection" лежит на НЕ наследнике TStyledControl. Запустив программу можно убедиться что FindStyleResource<TControl>('selection', T) найдет объект "Selection".
      В варианте B, при запуске можно с удивлением обнаружить что FindStyleResource<TControl>('selection', T) не находит объект "Selection"!
      Почему так?
      Судя по исходникам поиск во вложенных TStyledControl-ах сломан специально, дабы не всплывали еще большие глюки\проблемы.(но я не изучал вопрос очень подробно, во внутренний код работы с загрузкой и поиском стилей - кромешный ад, с наслаиванием истории Fire-Monkey разных лет).
      Как можно обойти проблему?
      Я нашел следующее решение:
      (Однако я совершенно не уверен в отсутствии побочных эффектов, возможно @Brovin Yaroslav сможет прокомментировать его?)
      Данный код находит искомый стилевой объект, в отличии от FindStyleResource.
      procedure TEsImageSelection.ApplyStyle; var T: TControl; begin inherited ApplyStyle; T := nil; EnumObjects( function (Obj: TFmxObject): TEnumProcResult begin if Obj.StyleName.ToLower = 'selection' then begin T := TControl(Obj); Result := TEnumProcResult.Stop; end else Result := TEnumProcResult.Continue; end); if T <> nil then ShowMessage('"selection" founded!'); end;  
      Процедура-замена FindStyleResource, работает как ожидается:
      type TOpenStyledControl = class(TStyledControl); function EsFindStyleResource(Self: TStyledControl; StyleName: string): TFmxObject; var StyleObject: TFmxObject; begin // если Self.ChildrenCount < 1 то в компоненте не загружен стиль, // т.к. известно что главный эллемент стиля ВСЕГДА находиться по нулевому индексу. if (TOpenStyledControl(Self).ResourceLink = nil) or (Self.ChildrenCount < 1) then Exit(nil); StyleObject := nil; Self.Children[0].EnumObjects( function (Obj: TFmxObject): TEnumProcResult begin if Obj.StyleName.ToLower = StyleName.ToLower then begin Result := TEnumProcResult.Stop; StyleObject := Obj; end else Result := TEnumProcResult.Continue; end); Result := StyleObject; end;  
    • От Akromd
      Добрый день, не знаю уместен ли вопрос в этой ветке, но тем не менее.
      Задача следующая: есть ListBox на форме, с помощью стилей создан специальный ListItem с множеством edit'ов  и т.д. При загрузке excel файла все это заполняется и выводится.
      Так вот, все это работает хорошо, до тех пор пока не начинаешь прокручивать - через некоторое время вылетает ошибка
      Собственно вопрос - По каким причинам она возникает и как ее можно исправить?
      проект выложил, подгрузка из файла - по умолчанию путь к файлу - C:\Users\Admin\Documents\Embarcadero\Studio\Projects\.
      Projects.rar
    • От trl
      Не нашел ответа на форуме.  не могу понять почему FindStyleResource  не возвращает объекта.
      procedure TMainForm.Button1Click(Sender: TObject); var item :  TListBoxItem;       lbName:TLabel; begin     Item := TListBoxItem.Create(Self);     Item.Parent := ListBox;      Item.StyleLookup := 'lyItemBoxDetail';        lbName := Self.FindStyleResource('lbname') as TLabel; // Здесь получаю nil     ShowMessage(  Item.StylesData['lbname.Text'].AsString) // А этот код работает end;  
    • От max7ka
      Подскажите где можно найти структуру StyleLookup для объектов, чтобы можно было использовать в FindStyleResource?
       
      Например
       
       CheckBox
          checkboxunchecked
          checkboxchecked
          checkmark
          ...
       
       TGrid
         header
         focus
         selection
         ...
    • От Ra72
      Создал компонент:
      type TTube = class(TFmxObject) private FTheColor: TAlphaColor; public constructor Create(AOwner: TComponent); override; published property TheColor: TAlphaColor read FTheColor write FTheColor; end; constructor TTube.Create(AOwner: TComponent); begin inherited; FTheColor := $FFFFFFFF; end; Вставил его в StyleBook.
      object TTube StyleName = 'tube1' TheColor = claViolet end Ищу его в стилизованном контроле:
       
      var tube: TTube; begin tube := ATarget.FindStyleResource('tube1') as TTube; Не находится компонент. 
      Стандартные Text, Rectangle... находятся таким способом, а свой - нет.
      Что я делаю не так?
    • От estra
      Редактирую стиль, добавляю к нему компонент TImage и для свойства RotateAngle создаю FloatAnimation (параметры анимации на скрине). Но при запуске никакой анимации нет. Почему? И как все же добиться работоспособности анимации для элемента стиля?
    • От estra
      Почему метод FindStyleResource  в OnCreate и OnShow формы возвращает nil, а после запуска программы (в Button1.OnClick) возвращает указатель на объект? Как получить доступ к объекту стиля в момент запуска программы?
    • От estra
      Собственно вопрос в заголовке темы.

      В редакторе стиля добавляю TImage, загружаю в него картинку. В StyleName кнопки прописываю свой стиль, но изображение все равно нет. Подскажите, как правильно добавить изображение на кнопку?

      Вот пример.
      CornerButtom.zip
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...