小编Wou*_*ick的帖子

为什么画一条小于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
查看次数

在Delphi中将TDateTime声明为Const

据我所知,没有办法做到这一点,但我会问,以防其他人知道如何做到这一点.如何在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)

所以让我知道这是一个功能请求,还是我错过了如何做到这一点(是的,我知道这似乎是一件奇怪的事情......)

delphi const date operator-overloading tdatetime

29
推荐指数
5
解决办法
9471
查看次数

用于编辑具有多对多关系的数据的GUI模式

我经常遇到一种情况,我需要提出一个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添加了一个新行并刷新了网格.

缺点:

  • 你只能将table3项添加到table1,而不是相反;
  • 您只能浏览table1项目并查看相关的table3项目;
  • 我需要有一个table3项的过滤网格,以及一个类似的选择新项目;

我的问题:

有没有人知道一种更好的方式来直观地浏览和编辑具有:m关系的数据?或者我可以从现有软件包"窃取"的任何好模式?

language-agnostic user-interface many-to-many

27
推荐指数
1
解决办法
8465
查看次数

为什么默认情况下禁用DoubleBuffered?

创建新表单后,我通常会执行此仪式:

  1. 将名称更改为有意义的名称;
  2. 输入Caption;
  3. 更改位置属性(DefaultPosOnly几乎不是用户期望的);
  4. 设置ShowHinttrue;
  5. 设置DoubleBufferedtrue ;

我一直想知道为什么默认值为'False'.对我来说,它只是看起来低技术和蹩脚,在我的新机器上,我没有注意到性能上的任何差异.

在旧机器,VNC,远程桌面或虚拟机中双重缓冲是否有问题?

你把它打开还是关闭?有什么建议?

delphi doublebuffered delphi-2009

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

在ReturnData中``在Delphi中是什么意思?

在浏览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;.但系统单元充满了对它的引用.

所以我想知道的是:

  1. 什么是ReturnAddress
  2. 到底是Raise Exception.Create ... at ReturnAddress做什么的?

如果你可以给出一个真实世界的例子,说明这将是一个有用的结构,或者你可以建议不要使用它.

delphi exception

25
推荐指数
2
解决办法
1822
查看次数

为什么这么难创建64位Delphi?

互联网上满是要求64位Delphi的开发人员,以及要求64个版本的Delphi软件用户.

  • delphi 32bit:1.470.000页
  • delphi 64bit:2.540.000页:-)

这就是为什么我一直想知道为什么Embarcadero仍然不提供这样的版本.

如果它很容易做到,我相信它已经很久以前就已经完成了.那么Embarcedero需要克服的技术难题到底是什么?

  • 它是编译器,RTL/VCL还是IDE/Debugger?
  • 为什么从32位到64位的切换比Borland从16位切换到32位更复杂?
  • FPC团队在增加64位支持时是否面临类似的问题?
  • 当我认为创建64位Delphi应该比Kylix或Delphi.Net更容易时,我是否在监督重要的事情?

delphi compiler-construction 64-bit

21
推荐指数
5
解决办法
1582
查看次数

在Visual Studio中更改EOL字符

如果这对你来说是一个微不足道的问题,我很抱歉.

有没有办法在Visual Studio 2010中更改行结束字符(EOL)字符?我想将其从Windows('\n \n \n')格式更改为UNIX('\n')格式.

谢谢

visual-studio-2010

19
推荐指数
1
解决办法
9137
查看次数

如何处理(Delphi)Android应用程序中的后退按钮?

如何让我的Android应用程序对后退按钮作出反应?

有没有什么东西可以作为高级VCL的TApplicationEvents来处理它,或者我是否需要深入研究低级Android特定的东西?

现在,大多数演示应用程序都有一个屏幕后退按钮,可以返回上一个屏幕.按下psysical按钮似乎总是退出应用程序,在某些情况下会导致访问冲突.

delphi android back-button delphi-xe5

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

在Delphi中:如何在调试时跳过代码段?

在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应该引入像跳过点(而不是断点)的东西:-)

delphi debugging

14
推荐指数
3
解决办法
5513
查看次数

我怎样才能看到谁在Delphi中触发了一个动作?

当一个动作甚至触发时,"发送者"总是动作本身.通常这是最有用的,但是在某种程度上可以找出谁触发了行动的onexecute事件?

假设您有一个包含以下内容的表单:

  • 2个按钮,叫做Button1Button2
  • 1 TATION叫 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 taction

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