在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 "表单?
我们已经有一段时间在办公室与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) 它是一个Firemonkey组件,但是我可以看到VCL和FMX的大部分组件基础是相同的,所以如果你知道如何在VCL中分享你的知识,那么它最终可能是我案例的解决方案.
我使用TPopup作为祖先.它对我来说很方便,因为它保留在表单/框架上,我可以使用父进程的相同上下文/结构与LiveBindings连接,这对我来说非常方便.
我需要它的行为恰好是TPopup,作为一个容器.但我需要它看起来更好,并有我的特定按钮(我已经为我的软件内部创建了一些属性和自动化)
问题是我创建了一些内部控件,比如TLayouts,Tpanels和Tbuttons,看起来像这样:(空)
其中的黑色区域是我想放弃像TEdit和其他人一样的控件.
我已将所有内部创建的控件设置为Store = false,因此它不会存储在流式系统上.当我放弃一个TEdit时这样做,我得到的是这个(Tedit with aligned = top我需要这个):
但是我期待这个:
如果我更改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) 我们正在体验Firemonkey的ScrollBox组件中似乎是一个奇怪的错误(因为TGrid
从TScrollBox
它继承也会影响所有网格).在我们的开发机器上,一切正常,而在其他机器上则会发生错误.我们未能检测到系统之间的任何模式(我们检查了操作系统,图形硬件,DirectX版本).
再生产:
TScrollBox
在表格上放置一个.如果发生错误,则该按钮不可见.
使用网格时,这会导致1-19047行正确显示,并且不显示19047及以上的所有行.
有谁知道是什么原因引起的?或者任何想法我们如何更详细地识别问题?
假设我在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) 我正在玩FireMonkey,看看图形绘画是否比GDI或Graphics32(我目前选择的库)更快.
为了看它有多快,我已经进行了一些测试,但我遇到了一些奇怪的行为:
与较粗的线条相比,绘制细线(<1.5像素宽)似乎非常慢:
结果非常稳定; 一旦线宽超过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) 使用新的FireMonkey跨平台工具,如何创建托盘图标?使用Delphi,它曾经是TTrayIcon.
文档什么都没有,似乎没有其他问题可以回答这个问题.会欣赏任何想法(我总是可以求助于每个平台的系统编程,但那就是真的没有这样的东西).
每当我使用Delphi的Gethomepath函数时,我都会不断收到Shell脚本调用错误.
这个功能被更新的功能取代了吗?
通常,我使用: ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);
如何在所有平台(Windows 和 OSX)上具有相同的行为(在默认浏览器中打开链接)?
delphi ×10
firemonkey ×10
delphi-xe2 ×4
performance ×2
browser ×1
c++builder ×1
components ×1
delphi-xe6 ×1
graphics ×1
line ×1
macos ×1
osx-lion ×1
synedit ×1
systray ×1
trayicon ×1