我使用Beyond Compare(版本3.1.10)来比较不同版本的Delphi表单文件,但我不希望看到有关ExplicitTop,ExplicitLeft,ExplicitHeight和ExplicitWidth的差异.
细节:这些行总是以许多空白字符开头,然后是"ExplicitXXX ="和一个数字.旧版本的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(XE)中编写了一个小型控制台应用程序,并错误地写道:
for I := 0to aList.Count-1 do
Run Code Online (Sandbox Code Playgroud)
注意"0"和"到"之间缺少的空格
在我运行程序之前,我没有注意到这一点,编辑接受了这一点我很惊讶.这可能没什么大不了的,但这让我很好奇.
德尔福为什么接受这个错字?
我正在尝试实现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中是否存在将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) 我经常使用小方法来协助调试,这些方法在实际程序中没有使用.通常,我的大多数类都有一个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,被链接器删除". …
在我们的应用程序中,有一个客户列表和一个关键字列表(以及其他内容).每个客户都可以拥有多个关键字,但这不是强制性的.因此,例如,一个客户可以拥有关键字"零售"和"链",一个可以只有"承包商"而第三个可以根本没有.
我想让用户根据这些关键字选择客户,但不必写 (retail AND chain) or contractor and not wholesale
我想尽可能使用它,并且理想情况下只使用"简单"控件,如复选框,组合框等.
有没有人对如何设计这个有什么建议?或者也许是一些具有类似功能的应用程序示例?
我已经创建了一个基于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) 我试图加速应用程序中的某个例程,我的剖析器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%左右.有没有一种简单的方法可以进一步优化这种方法?
我正在玩Levenshteins编辑距离算法,我想扩展它来计算换位 - 即相邻字母的交换 - 作为1编辑.未修改的算法计算从另一个字符串到达某个字符串所需的插入,删除或替换.例如,从"KITTEN"到"SITTING"的编辑距离是3.这是维基百科的解释:
按照相同的方法,从"CHIAR"到"CHAIR"的编辑距离为2:
我想把它算作"1编辑",因为我只交换两个相邻的字母.我该怎么做呢?