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

Вопросы

Не нашел ответа на форуме.  не могу понять почему 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;

 

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


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

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

  • 0

Спасибо!))) Упрощал код поисках ошибки и не заметил )))

Однако заметил другую особенность: FindStyleResource не работает для корневого элемента (в моем случае это был TLayout), однако для всех элементов в этом контейнере Ok

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


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

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

    • От 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
    • От 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) возвращает указатель на объект? Как получить доступ к объекту стиля в момент запуска программы?
    • От Nix0N
      ListBox содержит 100 ListBoxItem (созданные в run-time) с кастомным стилем, который содержит TCheckBox и TLabel. Если у первого item'a отметить CheckBox, он выборочно дублируется у остальных item. Пример: отмечаем первый item, отмечаются 20, 30 и т.д. Пробовал перерисовку, перестановку контента и т.д. - не помогает. В чем может быть дело ?

      Чистый проект прилагается. RAD Studio XE6 
      ChekBox ListBox.zip
    • От Kikoma
      Здравствуйте, подскажите направление решения следующей проблемы:
       
      Есть стилизовнный ListBoxItem, содержащий два поля:
      TText: [styleName = 'TextPrice' и 'TextSum'] TSpinBox: [styleName = 'Count'] Каким образом:
      Можно повесить обработчик на SpinBox.OnChange, чтобы рассчитывать Sum? И как обратиться к значению SpinBox.Text? Код обработчика события изменения SpinBox:
      procedure TFormMain.SBCountChange(Sender: TObject); // Какой вызов и где его назначить? var Item: TListBoxItem; begin Item:= ??? //Определение того итема, в котором был изменен TListBox [Name=StyleName='SBCount'] Item.StylesData['TextSum'] := StrToInt( Item.StylesData['TextPrice'] ) * StrToInt( ??? SBCount.Text ); end Подскажите, пожалуйста, а то только туманные решения
    • От Nix0N
      Для примера:
       
      Есть объект ListBoxItem. В StyleBook загружен стиль по умолчанию. Для итема лист бокса задан стандартный стиль:
      ListBoxItem.Stylename = "listboxitemlabel" Если заглянуть в StyleBook, то мы увидим что "listboxitemlabel" это TLayout.
      Каким образом можно изменить/получить свойства этого объекта, к примеру текущую его высоту для нашего ListBoxItem?
  • Последние посетители   0 пользователей онлайн

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

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