标签: firemonkey

如何在Firemonkey中创建"No Activate"表单

在XCode中,通过将这些方法添加到NSView子类可以防止窗口在单击时变为活动状态:

- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent {
    return YES;
}
- (BOOL)acceptsFirstMouse:(NSEvent )theEvent {
    return YES; 
}
- (void)mouseDown:(NSEvent )theEvent {
    [[[NSApp]] preventWindowOrdering]; 
}
Run Code Online (Sandbox Code Playgroud)

在Windows平台中,这是通过以下简单代码完成的:

HWND hWnd = FindWindowW((String("FM") + fmxForm->ClassName()).c_str(), 
    fmxForm->Caption.c_str());

SetWindowLong(hWnd, GWL_EXSTYLE,
    GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
Run Code Online (Sandbox Code Playgroud)

我怎样才能将NSView子类化以防止我的FMX TForm在点击时变为活动状态?

如何在firemonkey中创建" No Activate "表单?

delphi macos c++builder delphi-xe2 firemonkey

147
推荐指数
1
解决办法
7234
查看次数

屏幕上有很多控件时严重的FireMonkey性能问题

我们已经有一段时间在办公室与FireMonkey合作了.经过一段时间后,我们注意到,由于Embarcadero告诉我们GPU加速,它并不是那么闪电.

因此,我们构建了一个基本应用程序,仅用于测试FireMonkey性能.基本上它是一个底部有一个面板(alBottom)的表单,它作为状态栏和一个所有客户端(alClient)面板.底部的面板有一个进度条和一个动画.

我们在表单中添加了一个方法,该方法释放了所有客户端面板中存在的任何控件,并使用自定义类型和"鼠标悬停"样式的单元格来实现它,并更新动画,进度条和表单的标题以及有关的信息.实现进步.最重要的信息是所需的时间.

最后,我们将这种方法添加到表单的OnResize中,运行应用程序并最大化表单(1280x1024).

XE2的结果非常慢.花了大约11秒钟.此外,由于面板完成直到应用程序准备好接收用户输入,因此存在大约10秒的额外延迟(如冷冻).整体为21秒.

随着XE3,情况变得更糟.对于相同的操作,总共需要25秒(14 + 11冻结).

有传闻称XE4将是XE3中最糟糕的.

考虑到完全相同的应用程序,使用VCL而不是FireMonkey并使用SpeedButtons以获得相同的"鼠标悬停效果"仅需1.5秒!所以问题显然存在于一些内部FireMonkey引擎问题中.

我开了一个QC(#113795)和一张(付费)票给embarcadero支持,但没有什么他们不会解决它.

我真的不明白他们怎么能忽视这么重的问题.因为我们的企业是一个显示阻止和交易破坏者.我们不能以如此糟糕的表现向我们的客户提供商业软件.早些时候或早些时候我们将被迫转移到另一个平台(顺便说一句:相同的代码Delphi Prism with WPF需要1.5秒作为VCL).

如果有人知道如何解决问题或尝试提高测试性能并希望提供帮助,我会很高兴.

先感谢您.

布鲁诺弗拉蒂尼

该申请如下:

unit Performance01Main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects;

const
  cstCellWidth = 45;
  cstCellHeight = 21;

type

  TCell = class(TStyledControl)
  private
    function GetText: String;
    procedure SetText(const Value: String);
    function GetIsFocusCell: Boolean;
  protected
    FSelected: Boolean;
    FMouseOver: Boolean;
    FText: TText;
    FValue: String;
    procedure ApplyStyle; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
    procedure DoMouseEnter; override; …
Run Code Online (Sandbox Code Playgroud)

delphi performance firemonkey

43
推荐指数
2
解决办法
1万
查看次数

如何创建一个类似对话框的对话框,允许删除其中的其他控件?

它是一个Firemonkey组件,但是我可以看到VCL和FMX的大部分组件基础是相同的,所以如果你知道如何在VCL中分享你的知识,那么它最终可能是我案例的解决方案.

我使用TPopup作为祖先.它对我来说很方便,因为它保留在表单/框架上,我可以使用父进程的相同上下文/结构与LiveBindings连接,这对我来说非常方便.

我需要它的行为恰好是TPopup,作为一个容器.但我需要它看起来更好,并有我的特定按钮(我已经为我的软件内部创建了一些属性和自动化)

问题是我创建了一些内部控件,比如TLayouts,Tpanels和Tbuttons,看起来像这样:(空)

我空的弹出窗口

其中的黑色区域是我想放弃像TEdit和其他人一样的控件.

我已将所有内部创建的控件设置为Store = false,因此它不会存储在流式系统上.当我放弃一个TEdit时这样做,我得到的是这个(Tedit with aligned = top我需要这个):

我用TEdit弹出

但是我期待这个:

我的弹出窗口,TEdit位于正确的位置

如果我更改Store = true,我可以获得正确的效果,但所有内部控件都在Structure面板上公开,每次保存表单并重新打开时,所有内容都会重复.暴露的内部组件对我来说不是问题,但重复的是,如果我关闭并打开组件10次,我会将整个内部结构复制10次.

我将尝试显示一些与组件设计相关的代码:

舱位声明:

  [ComponentPlatformsAttribute(pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator or pidiOSDevice or pidAndroid)]
  TNaharFMXPopup = class(TPopup, INaharControlAdapter, INaharControl)
  private
  protected
    FpnlMain       : TPanel;
    FlytToolBar    : TLayout;
    FbtnClose      : TButton;
    FbtnSave       : TButton;
    FbtnEdit       : TButton;
    FpnlClientArea : TPanel;
    FlblTitle      : TLabel;
    procedure   Loaded; override;
    procedure   Notification(AComponent: TComponent; Operation: TOperation); override;

constructor Create:

    constructor TNaharFMXPopup.Create(AOwner: TComponent);
    begin
      inherited;

      FpnlMain         := TPanel.Create(Self);
      FlblTitle        := TLabel.Create(Self);
      FlytToolBar …
Run Code Online (Sandbox Code Playgroud)

delphi components firemonkey delphi-xe6

43
推荐指数
1
解决办法
1468
查看次数

Firemonkey ScrollBox Bug

我们正在体验Firemonkey的ScrollBox组件中似乎是一个奇怪的错误(因为TGridTScrollBox它继承也会影响所有网格).在我们的开发机器上,一切正常,而在其他机器上则会发生错误.我们未能检测到系统之间的任何模式(我们检查了操作系统,图形硬件,DirectX版本).

再生产:

  1. 创建一个新的FireMonkey应用程序.TScrollBox在表格上放置一个.
  2. 向scrollBox添加一个按钮,并将其垂直位置设置为500000.
  3. 启动应用程序并检查滚动到滚动框末尾时是否显示按钮.

如果发生错误,则该按钮不可见.

使用网格时,这会导致1-19047行正确显示,并且不显示19047及以上的所有行.

有谁知道是什么原因引起的?或者任何想法我们如何更详细地识别问题?

delphi delphi-xe2 firemonkey

39
推荐指数
1
解决办法
4355
查看次数

Firemonkey的SynEdit?

是否有一个synedit包与firemonkey(或在其上工作的人)一起工作?

从我可以收集到的是之前有一个VGScene端口(参见:这个网站),但似乎已被删除.

另见本网站:

delphi synedit firemonkey

39
推荐指数
1
解决办法
2657
查看次数

Firemonkey(FMX)位图和颜色

假设我在Firemonkey中有一个小位图(例如32x24像素).所以我把一个TImage放到一个表单上,在构造函数中有这样的代码:

  Image1.Bitmap.Create(32, 24);
  if Image1.Bitmap.Canvas.BeginScene then
  try
    Image1.Bitmap.Canvas.Fill.Color := claBlack;
    Image1.Bitmap.Canvas.Stroke.Color := claYellow;
    Image1.Bitmap.Canvas.FillRect(RectF(0,0,32,24), 0, 0, AllCorners, $FF);
    Image1.Bitmap.Canvas.DrawLine(PointF(1,1), PointF(10,10), $FF);
  finally
    Image1.Bitmap.Canvas.EndScene;
    Image1.Bitmap.BitmapChanged;
  end;
Run Code Online (Sandbox Code Playgroud)

这在blackground上绘制了一条漂亮的对角线.

我想要做的是现在解析位图以确定受线条绘制影响的像素.如果我使用以下方法逐像素检查:

  for y := 0 to 23 do
    for x := 0 to 31 do
      if Image1.Bitmap.Pixels[x,y] <> claBlack then
        memo1.Lines.Add(Format('x=%d. y=%d. c=%x', [x,y,Image1.Bitmap.Pixels[x,y]]));
Run Code Online (Sandbox Code Playgroud)

输出到我的备忘录是:

x=0. y=0. c=FF3C3C00
x=1. y=0. c=FF3C3C00
x=0. y=1. c=FF3C3C00
x=1. y=1. c=FFE7E700
x=2. y=1. c=FF3C3C00
x=1. y=2. c=FF3C3C00
x=2. y=2. c=FFE7E700
x=3. y=2. c=FF3C3C00
x=2. y=3. c=FF3C3C00
x=3. y=3. …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2 firemonkey

35
推荐指数
2
解决办法
6370
查看次数

为什么画一条小于1.5像素的线的速度是画一条10像素厚的线的两倍?

我正在玩FireMonkey,看看图形绘画是否比GDI或Graphics32(我目前选择的库)更快.

为了看它有多快,我已经进行了一些测试,但我遇到了一些奇怪的行为:

与较粗的线条相比,绘制细线(<1.5像素宽)似乎非常慢: 性能

  • 垂直轴:cpu刻度绘制1000行
  • 横轴:线条刻度*

结果非常稳定; 一旦线宽超过1个像素宽,绘图总是变得更快.

在其他库中,似乎有单行快速算法,粗线较慢,因为首先创建了多边形,所以为什么FireMonkey反过来呢?

我主要需要单像素线,所以我应该以不同的方式画线?

测试使用以下代码运行:

// draw random lines, and copy result to clipboard, to paste in excel
procedure TForm5.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
  i,iWidth:Integer;
  p1,p2: TPointF;
  sw:TStopWatch;
const
  cLineCount=1000;
begin
  Memo1.Lines.Clear;
  // draw 1000 different widths, from tickness 0.01 to 10
  for iWidth := 1 to 1000 do
  begin
    Caption := IntToStr(iWidth);
    Canvas.BeginScene;
    Canvas.Clear(claLightgray);
    Canvas.Stroke.Kind := TBrushKind.bkSolid;
    Canvas.Stroke.Color := $55000000;
    Canvas.StrokeThickness :=iWidth/100;
    sw := sw.StartNew;
    // draw 1000 random lines
    for I := …
Run Code Online (Sandbox Code Playgroud)

delphi graphics performance line firemonkey

32
推荐指数
2
解决办法
4321
查看次数

如何使用FireMonkey创建托盘图标?

使用新的FireMonkey跨平台工具,如何创建托盘图标?使用Delphi,它曾经是TTrayIcon.

文档什么都没有,似乎没有其他问题可以回答这个问题.会欣赏任何想法(我总是可以求助于每个平台的系统编程,但那就是真的没有这样的东西).

delphi trayicon systray firemonkey

29
推荐指数
1
解决办法
3759
查看次数

Gethomepath无法在iOS 5/OSxLion上运行

每当我使用Delphi的Gethomepath函数时,我都会不断收到Shell脚本调用错误.

这个功能被更新的功能取代了吗?

delphi osx-lion firemonkey

29
推荐指数
1
解决办法
569
查看次数

如何使用FireMonkey跨平台应用程序使用默认浏览器打开URL?

通常,我使用: ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);

如何在所有平台(Windows OSX)上具有相同的行为(在默认浏览器中打开链接)?

browser delphi delphi-xe2 firemonkey

28
推荐指数
3
解决办法
3万
查看次数