是否可以有两个同名的属性?
property Cell [Cl, Rw: Integer]: string read getCell write setCell;
property Cell [ColName: string; Rw: Integer]: string read getCellByCol write setCellByCol;
Run Code Online (Sandbox Code Playgroud)
好吧,我试过了,编译器不会让我这样做,但也许有一个技巧......?
我有一些'小'文本文件,包含大约500000个条目/行.每行还有一个"键"列.我需要在一个大文件中找到这个密钥(8GB,至少2.19亿条目).找到后,我需要将大文件中的'Value'附加到小文件中,在行的末尾作为新列.
像这样的大文件:
KEY VALUE
"WP_000000298.1" "abc"
"WP_000000304.1" "xyz"
"WP_000000307.1" "random"
"WP_000000307.1" "text"
"WP_000000308.1" "stuff"
"WP_000000400.1" "stuffy"
Run Code Online (Sandbox Code Playgroud)
简单地说,我需要在大文件中查找"密钥".
显然我需要在RAM中加载整个表(但这不是我有32GB可用的问题).大文件似乎已经排序了.我得检查一下.
问题是我无法使用类似TDictionary的快速查找,因为正如您所看到的,密钥并不是唯一的.
注意:这可能是一次性计算.我将使用该程序一次,然后扔掉它.因此,它不一定是最佳算法(难以实现).它只需要在适当的时间内完成(如1-2天).PS:我更喜欢没有DB这样做.
我正在考虑这个可能的解决方案:TList.BinarySearch.但似乎TList仅限于134,217,727(MaxInt div 16)项目.所以TList不会工作.
结论:
我选择了Arnaud Bouchez解决方案.他的TDynArray令人印象深刻!如果你需要处理大文件,我完全推荐它.
AlekseyKharlanov提供了另一个不错的解决方案,但TDynArray已经实现.
我终于升级到了Delphi XE.我有一个单元库,我使用字符串来存储普通的ANSI字符(A和U之间的字符).我101%肯定我永远不会在那些地方使用UNICODE字符.
我想将所有其他库转换为Unicode,但对于这个特定的库,我认为坚持使用ANSI会更好.优点是内存要求,因为在某些情况下我加载了非常大的TXT文件(仅包含Ansi字符).缺点可能是当我使这些库与普通(unicode)库交互时,我必须做很多很多的类型转换.
有一些通用指南可以说明何时转换为Unicode以及何时坚持使用Ansi?
在Delphi XE下,是否有ANSI版本的Copy?我正在使用Copy来复制ANSI字符串的各个部分.
我有一个EurekaLog错误报告显示EEncodingError.日志指向TFile.AppendAllText.我打电话TFile.AppendAllText是我的这个程序:
procedure WriteToFile(CONST FileName: string; CONST uString: string; CONST WriteOp: WriteOpperation; ForceFolder: Boolean= FALSE); // Works with UNC paths
begin
if NOT ForceFolder
OR (ForceFolder AND ForceDirectoriesMsg(ExtractFilePath(FileName))) then
if WriteOp= (woOverwrite)
then IOUtils.TFile.WriteAllText (FileName, uString)
else IOUtils.TFile.AppendAllText(FileName, uString);
end;
Run Code Online (Sandbox Code Playgroud)
这是来自EurekaLog的信息.
是什么导致这种情况发生?
[dcc32提示] H2443内联函数'RenameFile'尚未展开,因为在USES列表中未指定单位'Winapi.Windows'
我知道内联函数可以使代码更快.但我只看到了紧张的地方.例如,在一个大循环中调用一个小函数.
但如何内联IO功能可以提高速度?我的意思是通过内联RenameFile你可以获得几微秒.但是如果磁盘忙,执行函数本身可能需要几毫秒,甚至几十毫秒.
更重要的是,如果您使用的是RenameFile,那么您可能正处于执行其他I/O操作的代码块中.因此,这段代码将花费大量时间.所以,现在的收益更加微不足道.
如果在使用表单后调用Form.Release,它将释放所有相关内存但不将表单变量设置为nil.
if not assigned (Form1) then
begin
Application.CreateForm(Tform1, Form1);
try
// Do something
finally
Form1.Release
end;
end;
Run Code Online (Sandbox Code Playgroud)
为了能够再次调用相同的代码,Form1必须在某个时候设置为nil.从发布的描述我做不到
Form1 := nil;
Run Code Online (Sandbox Code Playgroud)
在Release之后,因为Release程序将在被调用之后和实际释放表单之前直接返回.我无法检测Form.Release何时完成将表单var设置为nil.
做这个的最好方式是什么?
我全新的Delphi XE在"结构"面板中显示了数百个错误.它显示错误,如"第130行未声明的FileExists"或"第242行未声明的创建".即使它显示了这些错误,程序编译就好了.
我也看到代码洞察力并不总是有效.当我将光标移到变量上时,光标开始闪烁,不会出现弹出窗口.其他时候,它只是突出显示一些红色单位,它说它找不到它们.
有解决所有这些问题的技巧吗?
更新/伪修复:
我发现重启IDE有一段时间了.
我真的很有帮助,有一天Embarcadero将发布Delphi ST(来自STable).
:)
为什么这段代码不会崩溃?T没有.它是如何可以访问Caption是否T是nil?
procedure Crash;
VAR T: TButton;
begin
T:= NIL;
T.Caption:= ''; <---------- this works
end;
Run Code Online (Sandbox Code Playgroud)