假设我在Firemonkey中有一个小的位图(比如32×24像素)。 所以我把一个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; 这在blackground上画了一条很好的对angular线。 我想要做的是现在parsing位图来确定受到线条绘制影响的像素。 如果我做一个基本的像素检查使用: 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]])); 输出到我的备忘录是: x=0. y=0. […]
我们正在经历Firemonkey的ScrollBox组件中的一个奇怪的错误(因为TGrid从TScrollBoxinheritance,它也影响所有的网格)。 在我们的开发机器上,一切正常,而另一些则发生错误。 我们没有检测到系统之间的任何模式(我们检查了操作系统,graphics硬件,DirectX版本)。 再生产: 创build一个新的FireMonkey应用程序。 在表单上放置一个TScrollBox 。 将一个button添加到滚动框并将其垂直位置设置为500000。 启动应用程序,并检查滚动到滚动框结束时是否显示button。 如果发生错误,button不可见。 使用网格时,会导致1-19047行正确显示,并且不会显示19047年以后的所有行。 有没有人知道这可能是什么原因造成的? 或者有什么想法,我们如何更详细地确定问题?
我们已经在办公室与FireMonkey合作了。 过了一段时间,我们注意到,由于Embarcadero告诉我们,GPU加速并不是那么快。 所以我们build立了一个基本的应用程序来testingFireMonkey的性能。 基本上它是一个窗体底部(alBottom)作为状态栏和所有客户端(alClient)面板。 底部的面板有一个进度条和一个animation。 我们在表单中添加了一个方法,释放所有客户端面板中存在的任何控件,并使用自定义types和“鼠标hover”样式的单元格来完成此操作,并使用有关信息的信息更新animation,进度条和表单标题实现进展。 最重要的信息是所需的时间。 最后,我们将这种方法添加到窗体的OnResize中,运行应用程序并最大化窗体(1280×1024)。 XE2的结果真的很慢。 花了大约11秒。 此外,由于面板被满足,直到应用准备好接收用户input,所以还有约10秒的延迟(如冻结)。 总共21秒。 XE3的情况最糟糕。 对于同样的操作,总共需要25秒(14 + 11秒)。 而传言说XE4将会是XE3中最糟糕的一个。 考虑到应用程序完全相同,使用VCL代替FireMonkey并使用SpeedButtons以获得相同的“鼠标hover效果”仅需1.5秒! 所以这个问题显然存在于一些内部的FireMonkey引擎问题中。 我开了一个QC(#113795)和一张支付embarcadero(支付)的票,但没有任何解决办法。 我真的不明白他们怎么能忽略这么重的问题。 因为我们的企业正在成为一个制表者和一个交易断路器。 我们不能向客户提供性能差的商业软件。 早些时候或之后,我们将被迫移动到另一个平台(顺便说一句:相同的代码delphi棱镜与WPF需要1.5秒作为VCL之一)。 如果有人对如何解决这个问题有任何想法,或试图提高这个testing性能,并想帮助,我会真的很高兴。 先谢谢你。 布鲁诺·弗拉蒂尼 该应用程序是以下一个: 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 […]
这是一个Firemonkey组件,但是我可以看到,大部分的组件基础对于VCL和FMX都是一样的,所以如果你知道在VCL中如何做到这一点,请分享你的知识,最终可以成为我的案例的解决scheme。 我正在使用TPopup作为祖先。 这对我来说很方便,因为它仍然保留在窗体/框架上,我可以使用LiveBindings使用父窗体的相同上下文/结构来连接它,这对我来说非常方便。 我需要它的行为正是TPopup,作为一个容器。 但我需要它看起来更好,并有我的具体button(我已经创build了一些属性和自动化为我的软件在里面) 问题是我创build了一些内部控件,比如TLayouts,Tpanels和Tbuttons,看起来像这样:(空) 里面的黑色区域是我想放置像TEdit和其他控件的地方。 我已经将所有内部创build的控件设置为Store = false,所以它不会被存储在stream式系统上。 这样做,当我删除一个TEdit例如,我得到的是(Tedit与align =顶部我需要这个): 但是我期待这样的: 如果我改变了Store = true,我可以得到正确的效果,但是所有的内部控件都暴露在Structure面板上,每次保存表单并重新打开所有的东西都会被重复。 内部组件暴露对我来说不是问题,但是重复的是,如果我closures并打开组件10次,我会得到整个内部结构复制10次。 我将尝试展示一些与组件devise相关的代码: 类声明: [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; […]
在XCode中,通过将这些方法添加到NSView子类中,可以防止在单击该窗口时该窗口变为活动状态: – (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent { return YES; } – (BOOL)acceptsFirstMouse:(NSEvent )theEvent { return YES; } – (void)mouseDown:(NSEvent )theEvent { [[[NSApp]] preventWindowOrdering]; } 在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); 我怎么能子类NSView,以防止我点击它时,我的FMX TForm变得活跃? 如何在firemonkey中创build“ 不激活 ”窗体?
我在Android的表单上dynamic创build一个TEdit : edit := TEdit.Create(Self); 我想使用edit.Free释放它,但它仍然在表单上。 此代码在win32上正常工作,但在Android上失败。 不仅对于TEdit,而且对于使用Android或iOS的任何组件,似乎也是如此。