我正在玩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) 据我所知,没有办法做到这一点,但我会问,以防其他人知道如何做到这一点.如何在Delphi中将日期声明为const?
我发现的唯一解决方案是使用数字等价物,这是一种难以维护,因为它不是人类可读的.
const
Expire : TDateTime = 39895; // Is actually 3/23/2009
Run Code Online (Sandbox Code Playgroud)
我希望能做的是这样的:
const
Expire : TDateTime = TDateTime ('3/23/2009');
Run Code Online (Sandbox Code Playgroud)
要么
const
Expire : TDateTime = StrToDate('3/23/2009');
Run Code Online (Sandbox Code Playgroud)
所以让我知道这是一个功能请求,还是我错过了如何做到这一点(是的,我知道这似乎是一件奇怪的事情......)
我经常遇到一种情况,我需要提出一个GUI来编辑具有:m关系的数据.我正在寻找用户友好的GUI想法.
[table1]
|
/|\
[table2]
\|/
|
[table3]
Run Code Online (Sandbox Code Playgroud)
通常,GUI类似于以下内容:
Grid that shows all items from table1
Add table3 item... (显示带有table3项的模态窗口)
Grid that shows all items from table3
在用户选择了table3项之后,我向table2添加了一个新行并刷新了网格.
缺点:
我的问题:
有没有人知道一种更好的方式来直观地浏览和编辑具有:m关系的数据?或者我可以从现有软件包"窃取"的任何好模式?
创建新表单后,我通常会执行此仪式:
Caption;ShowHint到true;DoubleBuffered到true ; 我一直想知道为什么默认值为'False'.对我来说,它只是看起来低技术和蹩脚,在我的新机器上,我没有注意到性能上的任何差异.
在旧机器,VNC,远程桌面或虚拟机中双重缓冲是否有问题?
你把它打开还是关闭?有什么建议?
在浏览System.Zip(Delphi XE2)以查看其工作原理时,我发现了这个功能:
procedure VerifyWrite(Stream: TStream; var Buffer; Count: Integer);
begin
if Stream.Write(Buffer, Count) <> Count then
raise EZipException.CreateRes(@SZipErrorWrite) at ReturnAddress;
end;
Run Code Online (Sandbox Code Playgroud)
at ReturnAddress这是让我困惑的部分.
我不知道这at是一个有效的关键字(语法高亮显示器似乎也没有识别它).
根据IDE声明它System.ReturnAddress,但我只能在(asm)代码中的某处找到它声明为标签procedure _HandleAnyException;.但系统单元充满了对它的引用.
所以我想知道的是:
ReturnAddress?Raise Exception.Create ... at ReturnAddress做什么的?如果你可以给出一个真实世界的例子,说明这将是一个有用的结构,或者你可以建议不要使用它.
互联网上满是要求64位Delphi的开发人员,以及要求64个版本的Delphi软件用户.
这就是为什么我一直想知道为什么Embarcadero仍然不提供这样的版本.
如果它很容易做到,我相信它已经很久以前就已经完成了.那么Embarcedero需要克服的技术难题到底是什么?
如果这对你来说是一个微不足道的问题,我很抱歉.
有没有办法在Visual Studio 2010中更改行结束字符(EOL)字符?我想将其从Windows('\n \n \n')格式更改为UNIX('\n')格式.
谢谢
如何让我的Android应用程序对后退按钮作出反应?
有没有什么东西可以作为高级VCL的TApplicationEvents来处理它,或者我是否需要深入研究低级Android特定的东西?
现在,大多数演示应用程序都有一个屏幕后退按钮,可以返回上一个屏幕.按下psysical按钮似乎总是退出应用程序,在某些情况下会导致访问冲突.
在Delphi中进行调试时,我经常会意外地进入我不感兴趣的代码.
让我们首先说我知道你可以用F8跳过,并且你可以用f4跑到某一行.
例:
function TMyClass.DoStuff():Integer;
begin
// do some stuff
bla();
end;
procedure TMyClass.Foo()
begin
if DoStuff()=0 then // press F7 when entering this line
beep;
end;
Run Code Online (Sandbox Code Playgroud)
示例:我想通过按F7进入方法DoStuff(),但是我没有去那里,而是首先进入FastMM4.FastGetMem(),这是一个庞大的汇编代码,显然我对它不感兴趣.时刻.
有几种方法可以解决这个问题,我不喜欢它们中的任何一种:
在" bla " 上添加一个断点(如果你只想在特殊情况下进入DoStuff,几乎没用,比如迭代23498938);
而不是按F7,手动将光标移动到" bla ",然后按F4(Works为这个简单的例子.实际上,它没有);
在FastMM的情况下:暂时禁用fastmm;
有没有办法提示IDE我从来没有兴趣进入某个代码块,或者我是否总是要设置额外的断点或使用F4来避免这种情况?
我希望有一些神奇的编译器指令,如{$ NODEBUG BEGIN/END}或类似的东西.
在大多数情况下,能够排除整个单元对我来说足够精细,但能够避免某些方法或甚至代码行会更好.
更新:也许codegear应该引入像跳过点(而不是断点)的东西:-)
当一个动作甚至触发时,"发送者"总是动作本身.通常这是最有用的,但是在某种程度上可以找出谁触发了行动的onexecute事件?
例
假设您有一个包含以下内容的表单:
Button1和Button2 actDoStuff两个按钮分配相同的操作.是否可以显示我点击了哪个按钮?
Example.dfm
object Form1: TForm1
object Button1: TButton
Action = actDoStuff
end
object Button2: TButton
Action = actDoStuff
Left = 100
end
object actDoStuff: TAction
Caption = 'Do Stuff'
OnExecute = actDoStuffExecute
end
end
Run Code Online (Sandbox Code Playgroud)
Example.pas
unit Example;
interface
uses Windows, Classes, Forms, Dialogs, Controls, ActnList, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
actDoStuff: TAction;
procedure actDoStuffExecute(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.actDoStuffExecute(Sender: TObject);
begin …Run Code Online (Sandbox Code Playgroud) delphi ×8
64-bit ×1
android ×1
back-button ×1
const ×1
date ×1
debugging ×1
delphi-2009 ×1
delphi-xe5 ×1
exception ×1
firemonkey ×1
graphics ×1
line ×1
many-to-many ×1
performance ×1
taction ×1
tdatetime ×1