我想知道什么样的操作符重载是可能的(以及什么版本的Delphi)?感谢Hallvard对运算符重载的精彩描述,我知道:
但是,我不知道的是'=','<=','<','<>','>'和'> ='运算符的名称.这些存在,我可以使用Delphi版本吗?
PS:我现在仍然使用Delphi 2009,所以如果2010年提供这些,我会有另一个强大的升级论据;-)
在D2010中不推荐使用TThread的简历方法.所以,我认为现在应该这样工作:
TMyThread = class (TThread)
protected
Execute; override;
public
constructor Create;
end;
...
TMyThread.Create;
begin
inherited Create (True);
...
Start;
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到一个例外"无法在正在运行或已经上线的线程上调用start"...考虑到文档告诉我应该在以挂起模式创建的线程上调用Start这一事实,这对我来说似乎很奇怪.
我在这里错过了什么?
由于我昨天提出的问题可能并不完全清楚,而且我没有得到我想要的答案,我将尝试以更一般的方式制定它:
有没有办法基于实例化的泛型类型的实际类型实现特殊行为,使用明确的条件语句或使用某种特化?伪代码:
TGenericType <T> = class
function Func : Integer;
end;
...
function TGenericType <T>.Func : Integer;
begin
if (T = String) then Exit (0);
if (T is class) then Exit (1);
end;
...
function TGenericType <T : class>.Func : Integer;
begin
Result := 1;
end;
function TGenericType <String>.Func : Integer;
begin
Result := 0;
end;
Run Code Online (Sandbox Code Playgroud) 我用
DirectoryExists (const PathName : String);
Run Code Online (Sandbox Code Playgroud)
检查是否可以从计算机访问目录.但是如果目录不存在且路径名是网络路径,即
\\computer1\Data
Run Code Online (Sandbox Code Playgroud)
该方法需要很长时间才能返回.
必须有一种更快的方法来确定无法访问网络文件夹.或者我可以配置DirectoryExists在内部使用的一些超时参数(我查看了源代码,但它只是委托给kernel32中定义的GetFileAttributes)?
有任何想法吗?
在这篇关于delphiXtreme的有趣博客文章中,我读到了关于DUnit的内置GUI测试功能(基本上是TGUITestCase在单元GUITesting中定义的替代测试用例类,其具有用于在GUI中调用动作的若干实用程序功能).我很满意它,直到我发现它不适用于模态形式.例如,如果第一个按钮显示模态配置表单,则以下序列将不起作用:
Click ('OpenConfigButton');
Click ('OkButton');
Run Code Online (Sandbox Code Playgroud)
第二个Click只在模态窗体关闭时执行,我必须手动完成.
我不太了解模态表单在后台如何工作,但必须有一些方法来规避这种行为.天真地,我想以某种方式执行ShowModal"在一个线程中",以便"主线程"保持响应.现在我知道ShowModal在线程中运行可能会搞砸一切.还有其他选择吗?任何方式来规避一个阻止性质 ShowModal?有没有人在Delphi中进行GUI测试的经验?
我了解外部工具(来自QA或其他人),我们使用这些工具,但这个问题是关于IDE中的GUI测试.
谢谢!
我必须以TDateTime字符串格式存储日期值().做这个的最好方式是什么?我考虑了以下方法:
FloatToStr :丢失精度,取决于区域设置
带有格式设置的`FloatToStr':失去精度
DateTimeToStr :取决于区域设置
DateTimeToStr 格式设置:?
还有其他选择吗?他们如何比较
这是
try
DoSomethingThatMightThrowAnException;
except
on E : ESyntaxError do
begin
if (E.ErrorCode = errMissingBracket) then
HandleError
else
raise;
end;
end;
Run Code Online (Sandbox Code Playgroud)
比这慢?
try
DoSomethingThatMightThrowAnException;
except
on E : EMissingBracketSyntaxError do
begin
HandleError;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有什么不同的预期?有关系吗?请注意,这可能会通过调用堆栈多次发生.
我经常使用以下代码:
function GetNumber(Handle : THandle) : Integer;
begin
FLock.BeginRead;
try
if FMap.TryGetValue(Handle, Object) then
raise EArgumentException.Create('Invalid handle');
Result := Object.Number;
finally
FLock.EndRead;
end;
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是编译器给了我所有这些方法的警告:
[DCC Warning] Unit.pas(1012): W1035 Return value of function 'GetNumber' might be undefined
Run Code Online (Sandbox Code Playgroud)
我知道这个警告,但在这种情况下,我根本看不出任何理由.或者是否存在我遗漏的情况会导致未定义的结果值?在这种情况下,我理解警告,try..except但对try..finally我来说没有意义.
问题:
Result := Object.Number线移出锁定不是一个选项,我想避免Result := 0在每个函数的顶部写一个完全不必要的行)谢谢!
我刚看了一下Firemonkey的网格实现,结果发现它是一个非常简单的实现(只有1800行,对于网格实现来说似乎并不多).它几乎没有自定义绘画,而是聚合了许多其他控件 - 这似乎是Firemonkey的做事方式.
例如,每列保留一组控件 - 每个单元一个.对于具有1,000,000行的普通文本列,网格将在内存中保留1,000,000个编辑控件 - 这对我来说似乎有点疯狂.(编辑:现在不太确定,如果这个假设是正确的.它似乎考虑了细胞的可见性,这可能意味着它确实提供了类似虚拟模式的东西,但我不太确定......)
我的问题:毫无疑问,Firemonkey的这种组件聚合设计看起来简单而优雅,但是它真的可以很好地扩展到必须在网格中显示的数据量吗?我无法想象它在大量行中表现良好.什么是Firemonkey处理大量数据的方式?
感谢您的任何意见.
我需要计算具有许多行的列的宽度(列AutoSize功能).使用Canvas.TextWidth太慢了.
当前解决方案:我当前的解决方案使用文本测量器类,该类为固定字母表构建一次查找表,然后通过累加从查找表中检索的字符宽度来非常快速地计算给定字符串的宽度.对于未包含在查找表中的字符,使用平均字符宽度(也计算一次).
问题:这适用于欧洲语言,但不适用于亚洲语言.
问题:解决这个问题的最佳方法是什么?如何在没有相对较慢的Canvas功能且不依赖于特定字母的情况下实现这样的AutoSize功能?
谢谢你的帮助.
delphi ×10
delphi-xe ×5
delphi-2009 ×2
date ×1
date-format ×1
delphi-2010 ×1
delphi-xe2 ×1
firemonkey ×1
generics ×1
gui-testing ×1
networking ×1
testing ×1
types ×1