在FireMonkey中更改TMemo的字体和背景颜色

10

我正在编写一个备忘录组件,需要呈现成老式终端会话的样式。这本应该很简单,但是 FireMonkey 样式的工作方式使其变得难以置信复杂。

在非移动版的 FireMonkey 应用程序中,我可以右键单击控件并选择“编辑自定义样式”。但是移动应用程序中没有此选项。下面是一位 FireMonkey 开发人员给出的原因:

iOS 和 Android 支持不同的样式。我们不能在 Android 上运行 iOS 样式的应用程序。但是,当您尝试更改平台样式时,自动地会在每个目标平台上使用它。如果您想更改 fm 控件的默认样式,应将其放入窗体样式簿中,并在其中设置样式或加载到样式簿中的平台样式并进行更改。

还有一个非常重要的问题,当您将平台样式加载到样式簿中时,您可能希望应用程序实例不会有两个平台样式副本(一个来自 fmx 包中的系统样式,另一个副本在您的样式簿中)。为此,您应该在 TStylebook.UseStyleManager 中设置标志为 true。在这种情况下,样式簿中的样式将替换平台样式。

好的,我想我需要创建一个自定义样式。我该如何创建一个只覆盖字体和背景属性的自定义样式呢?

我猜可以像这样重写 ApplyStyle 过程。

procedure TMyMemo.ApplyStyle;
var
  BackgroundObject: TFmxObject;
begin
  inherited;

  BackgroundObject := FindStyleResource('content');

  if Assigned(BackgroundObject) then
  begin
    // Change the background color of the background
  end;
end;

我该如何知道背景对象的类型以及需要更改哪个属性?

肯定,改变控件的背景颜色不可能这么难!我是否在FM样式中遗漏了一些基本的东西?

2个回答

7
希望您会发现这个解决办法很有用。
uses System.UIConsts;


procedure TfPlanJob.mDetailApplyStyleLookup(Sender: TObject);
var Obj: TFmxObject;
    Rectangle1: TRectangle;
begin    
     Obj := mDetail.FindStyleResource('background');
     if Obj <> nil then
     begin
          TControl(Obj).Margins   := TBounds.Create(TRectF.Create(-1, -1, -1, -1));
          Rectangle1              := TRectangle.Create(Obj);
          Obj.AddObject(Rectangle1);
          Rectangle1.Align        := TAlignLayout.Client;
          Rectangle1.Fill.Color   := claLightslategrey;
          Rectangle1.Stroke.Color := claNull;
          Rectangle1.HitTest      := False;
          Rectangle1.SendToBack;
     end;
end;

1
要更改字体,只需转到文本设置>字体颜色。 - Dreamer64
我认为你应该使用Margins.Rect := TRectF.Create(...),或者更好的方法是直接使用RectF(...),因为有一个函数可以实现这个功能。为了避免内存泄漏,尝试在你的程序(.dpr)文件中添加ReportMemoryLeaksOnShutdown := True; - George Birbilis

2

我发现一个问题是在FireMonkey中不能更改字体!你可以将其设置为不同的字体,但在设备上运行时会回到默认字体。

如果要更改备忘录的背景颜色,您应该在表单中添加样式簿并加载所需的样式文件(例如默认的浅色iOS样式)。加载样式后进入memostyle并更改背景。

希望这有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接