小编Sve*_*sli的帖子

在比较Delphi表单文件的版本时,如何使Beyond Compare忽略某些差异

我使用Beyond Compare(版本3.1.10)来比较不同版本的Delphi表单文件,但我不希望看到有关ExplicitTop,ExplicitLeft,ExplicitHeight和ExplicitWidth的差异.

细节:这些行总是以许多空白字符开头,然后是"ExplicitXXX ="和一个数字.旧版本的Delphi没有这些行,所以我想忽略这些行添加到最新版本的差异,我也想忽略数字发生变化的差异.

有谁知道如何做到这一点?

编辑:复制(或多或少):

如何配置BeyondCompare忽略评论中的SCM替换文本?

delphi version-control beyondcompare beyondcompare3

57
推荐指数
2
解决办法
6万
查看次数

Delphi组件或库来显示数学表达式

我正在寻找一个在Delphi中显示数学表达式的简单组件.当我开始时,我认为在网上找到一些东西很容易,但事实证明它比预期的要难.有许多组件可以解析数学表达式,但很少(没有?)会显示它们.

理想情况下,我想要一个像TLabel一样简单的组件,在那里我可以将标题设置为某个表达式并且它会正确显示,但是某种类型的库让我将表达式绘制到画布上也足以满足我的需求.

更新:

我不是在谈论绘制函数图或类似的东西.我想显示(例如)

(X ^ 2 + 3)/ X

像这样:

在此输入图像描述

解:

MBo的答案正是我所寻找的.有些人可能因为所有评论和文件都是俄文而被推迟,但不要让这吓到你.它真的很容易使用.

安装:将文件(至少"ExprMake.pas"和"ExprDraw.pas")解压缩到库路径中的目录.而已.

使用:我没有对它进行过广泛的实验,但这些几行表明它是多么容易.

procedure TForm1.Button1Click(Sender: TObject);
var
  vExprC : TExprClass;
  vExprB : TExprBuilder;
begin
  vExprB := TExprBuilder.Create;
  try
    vExprC := vExprB.BuildExpr('(X^2+3)/X');
    vExprC.Canvas := Canvas;
    vExprC.Font.Size := 50;
    vExprC.Draw(10,10,ehLeft,evTop);
  finally
    vExprC.Free;
    vExprB.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

delphi math

18
推荐指数
1
解决办法
4534
查看次数

为什么"for I:= 0 to aList.Count-1 do"可以使用缺少的空间?

我在Delphi(XE)中编写了一个小型控制台应用程序,并错误地写道:

for I := 0to aList.Count-1 do 
Run Code Online (Sandbox Code Playgroud)

注意"0"和"到"之间缺少的空格

在我运行程序之前,我没有注意到这一点,编辑接受了这一点我很惊讶.这可能没什么大不了的,但这让我很好奇.

德尔福为什么接受这个错字?

delphi compiler-errors

17
推荐指数
2
解决办法
521
查看次数

为什么这个Jarvis'March("礼品包装算法")的实现不起作用?

我正在尝试实现Jarvis'算法来找到一组点的凸包,但由于某种原因它不起作用.这是我的实施:

procedure TPointList.ConvexHull(aHull : TPointList); //Return the convex hull of a set of 2D points
var
  vPointOnHull  : TPoint2D;
  vEndpoint     : TPoint2D;
  I             : integer;
begin
  aHull.Clear;
  if Count < 3 then exit;

  vPointOnHull := Self.LeftMostPoint;
  repeat
    aHull.Add(vPointOnHull);
    vEndpoint := Self.Point[0];

    for I := 1 to Self.Count-1 do
      if Orientation(vPointOnHull,vEndpoint,Self.Point[I]) = LeftHandSide then
        vEndpoint := Self.Point[I];

    vPointOnHull := vEndpoint;
  until vEndpoint = aHull.Point[0];
end;
Run Code Online (Sandbox Code Playgroud)

会发生的是该方法开始一遍又一遍地向aHull添加相同的点.在一个测试用例中,我发送了点(200; 200)(300; 100)(200; 50)和(100; 100),算法首先将(100; 100)添加到aHull,这是正确的,但是它开始一遍又一遍地添加(200; 200).

显然我在实施中做错了,但对于我的生活,我看不出是什么.

更新:

Jonathan Dursi让我走上正轨.这条线 …

delphi algorithm geometry

13
推荐指数
1
解决办法
3112
查看次数

在Delphi中:如何将TDateTime四舍五入到最接近的秒,分钟,五分钟等?

在Delphi中是否存在将TDateTime值舍入到最接近的秒,最接近的小时,最接近的5分钟,最接近的半小时等的例程?

更新:

加布尔提供了一个答案.有一些小错误,可能是由于完全缺乏测试;-)

我清理了一下并测试了它,这是最终的(?)版本:

function RoundDateTimeToNearestInterval(vTime : TDateTime; vInterval : TDateTime = 5*60/SecsPerDay) : TDateTime;
var
  vTimeSec,vIntSec,vRoundedSec : int64;
begin
  //Rounds to nearest 5-minute by default
  vTimeSec := round(vTime * SecsPerDay);
  vIntSec := round(vInterval * SecsPerDay);

  if vIntSec = 0 then exit(vTimeSec / SecsPerDay);

  vRoundedSec := round(vTimeSec / vIntSec) * vIntSec;

  Result := vRoundedSec / SecsPerDay;
end;
Run Code Online (Sandbox Code Playgroud)

delphi datetime

13
推荐指数
3
解决办法
6512
查看次数

如何强制链接器在调试期间包含我需要的函数?

我经常使用小方法来协助调试,这些方法在实际程序中没有使用.通常,我的大多数类都有一个AsString方法,我将其添加到手表中.我知道Delphi 2010有可视化工具,但我还在2007年.

考虑这个例子:

program Project1;

{$APPTYPE CONSOLE}

uses SysUtils;

type
  TMyClass = class
    F : integer;
    function AsString : string;
  end;

function TMyClass.AsString: string;
begin
  Result := 'Test: '+IntToStr(F);
end;

function SomeTest(aMC : TMyClass) : boolean;
begin
  //I want to be able to watch aMC.AsString while debugging this complex routine!
  Result := aMC.F > 100; 
end;

var
  X : TMyClass;

begin
  X := TMyClass.Create;
  try
    X.F := 100;
    if SomeTest(X)
      then writeln('OK')
      else writeln('Fail');
  finally
    X.Free;
  end;
  readln;
end.
Run Code Online (Sandbox Code Playgroud)

如果我将X.AsString作为监视添加,我只是得到"要调用的函数,TMyClass.AsString,被链接器删除". …

delphi debugging linker

12
推荐指数
2
解决办法
3277
查看次数

如何让普通用户以图形方式设计布尔表达式

在我们的应用程序中,有一个客户列表和一个关键字列表(以及其他内容).每个客户都可以拥有多个关键字,但这不是强制性的.因此,例如,一个客户可以拥有关键字"零售"和"链",一个可以只有"承包商"而第三个可以根本没有.

我想让用户根据这些关键字选择客户,但不必写 (retail AND chain) or contractor and not wholesale

我想尽可能使用它,并且理想情况下只使用"简单"控件,如复选框,组合框等.

有没有人对如何设计这个有什么建议?或者也许是一些具有类似功能的应用程序示例?

user-interface

12
推荐指数
2
解决办法
1812
查看次数

当我更改属性时,为什么我的自定义组件不会更新?

我已经创建了一个基于TPaintBox的组件TGridPaintBox.它基本上是一个添加了"网格功能"的绘图箱.它不是数据网格.更像是棋盘组件.

在对象资源管理器中,我可以设置某些属性.最重要的是,我可以设置网格尺寸(横跨/向下有多少个单元格),还可以设置与绘图相关的选项.细胞是否应该是正方形,奇数/偶数细胞的颜色等.

我的第一个版本的组件直接在类上有属性,当我更改属性时,立即更新了设计时图.随着组件的增长,我想更好地组织我的属性,并引入了一些"选项属性",如绘图选项,行为选项等.在介绍之后,设计时绘图不再像以前那样更新.更改属性后,我必须单击组件才能更新.谁能告诉我为什么会这样?

这是代码的精简版本.我希望它能解释这种行为:

(PS:这是我的第一个组件,即使我自1997年以来一直使用Delphi,所以如果有人能像我做的那样发现任何愚蠢的东西,请随时告诉我)

unit GridPaintBox;

interface

type
  TGridDrawOption = (gdoSquareCells,gdoCenterCells,gdoDrawCellEdges,gdoDrawFocus);
  TGridDrawOptions = set of TGridDrawOption;

  TGridOptions = class(TPersistent)
  private
    FCellsX : integer;
    FCellsY : integer;
    FDrawOptions : TGridDrawOptions;
  public
    constructor Create(aGridPaintBox : TGridPaintBox);
    procedure Assign(Source : TPersistent); override;
  published
    property CellsX : integer read FCellsX write FCellsX;
    property CellsY : integer read FCellsY write FCellsY;
    property DrawOptions : TGridDrawOptions read FDrawOptions write FDrawOptions;
  end;

  TGridPaintBox = class(TPaintBox)
  private
    FGridOptions : TGridOptions;
    FFocusedX,
    FFocusedY : integer;
    FOnFocusChanged: TNotifyEvent; 
    procedure …
Run Code Online (Sandbox Code Playgroud)

delphi components vcl custom-component

12
推荐指数
1
解决办法
2182
查看次数

在Delphi中快速填充字符串

我试图加速应用程序中的某个例程,我的剖析器AQTime确定了一种方法,特别是作为瓶颈.这种方法已经存在多年了,并且是"misc"单元的一部分:

function cwLeftPad(aString:string; aCharCount:integer; aChar:char): string;
var
  i,vLength:integer;
begin
  Result := aString;
  vLength := Length(aString);
  for I := (vLength + 1) to aCharCount do    
    Result := aChar + Result;
end;
Run Code Online (Sandbox Code Playgroud)

在我正在优化的程序部分中,该方法被称为~35k次,并且它花费了惊人的56%的执行时间!

很容易看出它是一种可怕的方式来左键填充字符串,所以我用它替换它

function cwLeftPad(const aString:string; aCharCount:integer; aChar:char): string; 
begin
  Result := StringOfChar(aChar, aCharCount-length(aString))+aString;
end;
Run Code Online (Sandbox Code Playgroud)

这显着提升了.总运行时间从10,2秒增加到5.4秒.真棒!但是,cwLeftPad仍然占总运行时间的13%左右.有没有一种简单的方法可以进一步优化这种方法?

delphi string algorithm optimization

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

如何修改Levenshteins编辑距离以将"相邻字母交换"计为1次编辑

我正在玩Levenshteins编辑距离算法,我想扩展它来计算换位 - 即相邻字母的交换 - 作为1编辑.未修改的算法计算从另一个字符串到达​​某个字符串所需的插入,删除或替换.例如,从"KITTEN"到"SITTING"的编辑距离是3.这是维基百科的解释:

  1. 小猫→坐着(用's'代替'k')
  2. sitten→sittin(用'i'代替'e')
  3. 坐着→坐着(在结尾插入'g').

按照相同的方法,从"CHIAR"到"CHAIR"的编辑距离为2:

  1. CHIAR→CHAR(删除'我')
  2. CHAR→CHAIR(插入'I')

我想把它算作"1编辑",因为我只交换两个相邻的字母.我该怎么做呢?

string algorithm levenshtein-distance

11
推荐指数
1
解决办法
3713
查看次数