2013-06-12 1 views
2

하나의 ListBox가 다른 인터페이스에있는 매우 복잡한 인터페이스를 만들고 싶습니다. 첫째,에 ListBox1의 모든 요소 Firemonkey에서 스타일 디자이너에서 스타일 "시 CustomItem"를 얻을 :ListBox가 Firemonkey 스타일 디자이너의 다른 ListBox에 있음

Item := TListBoxItem.Create(nil); 
    Item.Parent := ListBox1; 
    Item.StyleLookup := 'CustomItem'; 

는 그런 스타일 "CustomItem에"다른 목록 상자 ("ListBox2을")가있다.

어떻게이 ListBox2의 "StyleLookup"속성에 액세스 할 수 있습니까?

Item.StylesData['ListBox2'].StyleLookup := 'CustomItem2'; //this does not work. 

Firemonkey가 지원하는지 알고 계십니까?

감사합니다.

답변

2

TListBox 구성 요소가 작동하는 방식과 StyleLookup 속성이 어떻게 관련되는지 오해했습니다. TListBox가 호스팅 할 수있는 유일한 컨트롤은 TListBoxItem 또는 해당 컨트롤의 하위 항목입니다.

참조하는 CustomItem은 Delphi Firemonkey CustomListBox 샘플에 포함 된 사용자 정의
FMX 스타일의 일부인 스타일 객체의 이름입니다.

StyleLookup
속성에 이름을 지정하여 스타일 목록을 특정 목록 상자 항목에 지정할 수 있습니다. 그러면 해당 항목은 해당 스타일 개체가 지시 한대로 시각적으로 동작합니다.

정말로 찾고있는 것은 FMX.TTreeView 구성 요소입니다. TListBox와 똑같이 동작하도록 만들 수 있습니다. 항목의 추가 보너스는 하위 항목을 호스팅 할 수 있습니다. 제공된 Firemonkey 샘플을 잘 살펴 보시기 바랍니다.

+0

좋은 설명 주셔서 감사합니다! FMX.TTreeView 및 TListBox에 대한 표준 예제를 확인하여 Delphi가 설치와 함께 제공하며 TreeView가 필요한 것처럼 보이는 데 동의합니다. :) 그러나 다른 많은 구성 요소가있는 TListBox의 항목이 필요합니다 (단추, 콤보 상자 및 다른 목록 상자). 네, 복잡한 인터페이스입니다. 나는 그것들에 접근하고, 스타일 룩업을 지정하고, 데이터로 채울 수있는 방법을 찾을 수 있었으면 좋겠다. 가능하다고 생각하십니까? –

+0

@Andrey, 물론 가능합니다. StyleBook을 사용하면 TTreeView의 각 항목 및 하위 항목을 시각적으로 모양을 잡아 실제 FMX 객체를 나타내는 것처럼 보이게 할 수 있습니다. 이것은 [Firemonkey Style Designer] (http://docwiki.embarcadero.com/RADStudio/XE4/en/FireMonkey_Style_Designer)를 통해 수행됩니다. 새로운 TLayout을 만들고, 예를 들어 Layout의 자식으로 TButton을 추가하고 HitTest를 구현 한 다음 TLayout의 이름을 TButton을 닮고 싶은 TTreeView 항목의 StyleLookup 속성에 연결하면됩니다. – Peter

1

StylesData의 사용법에 익숙하지 않지만 OnApplyStyleLookup 이벤트 처리기의 FindStyleResource를 사용하여이 작업을 수행 할 수 있습니다.

procedure TForm1.ApplyStyleLookupEvent(Sender: TObject); 
var O: TFMXObject; 
begin 
    O := (Sender as TFMXObject).FindStyleResource('ListBox2'); 
    if O is TStyledControl then 
    TStyledControl(O).StyleLookup := 'CustomItem2'; 
end; 

사용자 지정 TListBoxItem 개체가있는 경우 ApplyStyle 프로 시저에 넣을 수도 있습니다.

+0

멋진 답변을 보내 주셔서 감사합니다. TFMXObject 유형의 변수 "O"에 "StyleLookup"속성이 없기 때문에 코드를 시도하고 컴파일 오류가 발생합니다. 다음으로 변경하려고했습니다 : var SubItem : TListBoxItem; begin SubItem : = (보낸 사람 : TListBoxItem) .FindStyleResource ('ListBox2'); 할당 된 경우 (SubItem) SubItem.StyleLookup : = 'CustomItem2'; 끝; 그러면 호환되지 않는 형식 인 'TListBoxItem'및 'TFmxObject'가 발생합니다. –

+1

@Andrey, 목록 상자 안에 목록 상자를 구현할 수 없습니다. 나는 TListBox가 TListBoxItem 컨트롤 만 호스트 할 수 있다고 설명했습니다. 당신은 참신함을 넘어서서 ListBox가 본질적으로 상자에 항목으로 채워지는 문자열의 목록임을 알아야합니다. StyleBook을 사용하여 해당 항목이 나타나는 방식에 영향을 주지만 다른 FMX 객체를 하위 항목으로 구현할 수는 없습니다. 이 대답은 모두 당신의 질문과는 아무런 관련이없는 다른 목록 상자의 스타일 객체를 채택하는 방법을 보여줍니다. – Peter

+0

@ 피터, 네, 이제 네가 무슨 뜻인지 알 겠어! 이렇게하면 Firemonkey Style Designer에서 변경할 수있는 TListBoxItem 만 나타나게됩니다. 예를 들어이 레이아웃에서 다른 FMX 객체 (버튼, 편집 필드 등)를 가질 수있는 TLayout을 만들 수 있습니다. 하지만 말했듯이 레이아웃을 ListBoxItem에 적용하면 여전히 내 TListBoxItem의 하위 항목으로 액세스 할 수 없습니다. 나는 그것을 올바르게 받았는지, 보여줄 수는 있었지만 그것을 사용하지는 않았는가? –