这个问题,我在盒子发了,也没有满意的结果。
(http://bbs.2ccc.com/topic.asp?topicid=535134)
模仿FMX的标准TPanel控件(这个控件没有什么实现的代码),自己写了个Panel,可以实现改变颜色及Stroke等属性,就是增加这几个属性: //Appreance property Fill; property Stroke; property Cornered; property CornerSize; property FaceColor; 通过以下2个方法加载Style及得到Style的TRectangle对象 function GetStyleObject: TFmxObject; override; procedure ApplyStyle; override; 实现代码: function TMyPanel.GetStyleObject: TFmxObject; begin if StyleLookup.IsEmpty then Result := TStyleManager.GetStyleResource(DefStyleName) else inherited; end; procedure TMyPanel.ApplyStyle; begin inherited; if FindStyleResource<TRectangle>(DefStyleName, FAppreance) then begin if FAppreance <> nil then begin FAppreance.Fill.Assign(FFill); FAppreance.Stroke.Assign(FStroke); if FCornered then FAppreance.Corners := [TCorner.TopLeft, TCorner.TopRight, TCorner.BottomLeft, TCorner.BottomRight] else FAppreance.Corners := []; FAppreance.CornerType := TCornerType.Round; FAppreance.XRadius := FCornerSize; FAppreance.YRadius := FCornerSize; FAppreance.Align := TAlignLayout.Client; FAppreance.Anchors := [TAnchorKind.akLeft, TAnchorKind.akTop]; end; end; end; FAppreance就是Style中的Rectangle 但是,有一个大问题,这样的控件当设置了Parent时,只能显示最后创建的一个,前面的全部不显示,不管其Parent是不是一样的。估计是丢失了Style,所以对象存在,但是显示不了。 简单跟踪了下,在设置控件Parent,发生了许多事,看的晕乎乎。 就是创建多个Panel时,为什么只显示最后一个Panel!!!!! |
这几天又在折腾这个问题,现在DELPHI帮助里的 FMX控件开发指导,还是DELPHIXE5还是XE6时候的帮助,无语了,都不一样了,还误导开发者。
上面代码的GetStyleObject方法的写法是不对的
因为是用自己的Style资源,所以还是得明确从Res文件加载,
function TJKCustomPanelButton.GetStyleObject: TFmxObject;
begin
if StyleLookup = '' then
begin
//Result := TStyleManager.GetStyleResource(DefJkPanelButtonStyleName);
Result := TStyleStreaming.LoadFromResource(HInstance, DefJkPanelButtonStyleName, RT_RCDATA);
end
else
inherited GetStyleObject;
end;
这样就可以了,深层原因就不知道了,这里的代码转的厉害,看的晕呼呼。