在Delphi 2009或更高版本(Unicode)中,是否有任何内置函数或小程序在某处编写,可以进行合理有效的全字搜索,其中提供定义单词的分隔符,例如:
function ContainsWord(Word, Str: string): boolean;
const { Delim holds the delimiters that are on either side of the word }
Delim = ' .;,:(){}"/\<>!?[]'#$91#$92#$93#$94'-+*='#$A0#$84;
Run Code Online (Sandbox Code Playgroud)
哪里:
Word: string; { is the Unicode string to search for }
Str: string; { is the Unicode string to be searched }
Run Code Online (Sandbox Code Playgroud)
如果"Word"在字符串中,我只需要它返回true或false值.
在某个地方必定有这样的东西,因为标准的查找对话框具有"仅匹配整个单词"作为其中一个选项.
这通常(或最好)如何实施?
结论:
RRUZ的答案很完美.SearchBuf例程正是我所需要的.我甚至可以进入StrUtils例程,提取代码,并根据我的要求进行修改.
我很惊讶地发现SearchBuf不首先搜索该单词然后检查分隔符.相反,它一次查找字符串的字符,寻找分隔符.如果找到一个,则检查字符串和另一个分隔符.如果找不到,则查找另一个分隔符.为了效率,这非常聪明!
我在Delphi 2009中有以下结构:
type
IndiReportIndi = record
IndiName: string;
NameNum: integer;
ReportIndiName: string;
end;
var
XRefList: array of IndiReportIndi;
Run Code Online (Sandbox Code Playgroud)
其中XRefList是动态数组.
我想将XRefList保存到FileStream.我该怎么做并包括所有IndiName和ReportIndiName字符串,以便以后从FileStream加载时它们都可以再次检索?
我的程序中有一个"查找文件"功能,可以找到我的程序读取的带有.ged后缀的文本文件.我在类似于资源管理器的窗口中显示找到的结果,如下所示:

我使用标准的FindFirst/FindNext方法,这非常有效.上面显示的584个文件可在几秒钟内找到并显示.
我现在要做的是在显示屏上添加两列,显示每个文件中包含的"Source"和"Version".此信息通常位于每个文件的前10行内,如下所示:
1 SOUR FTM
2 VERS Family Tree Maker (20.0.0.368)
Run Code Online (Sandbox Code Playgroud)
现在我自己解析这个问题没有问题,这不是我要问的问题.
我需要帮助的只是如何最快速地从这些文件加载前10行,以便我可以解析它们.
我试图做一个StringList.LoadFromFile,但加载大文件需要花费太多时间,例如1 MB以上的文件.
由于我只需要前10行左右,我最好如何获得它们?
我正在使用Delphi 2009,我的输入文件可能是也可能不是Unicode,所以这需要适用于任何编码.
跟进:谢谢Antonio,
我最终做了这个工作正常:
var
CurFileStream: TStream;
Buffer: TBytes;
Value: string;
Encoding: TEncoding;
try
CurFileStream := TFileStream.Create(folder + FileName, fmOpenRead);
SetLength(Buffer, 256);
CurFileStream.Read(Buffer[0], 256);
TEncoding.GetBufferEncoding(Buffer, Encoding);
Value := Encoding.GetString(Buffer);
...
(parse through Value to get what I want)
...
finally
CurFileStream.Free;
end;
Run Code Online (Sandbox Code Playgroud) 为了将我的VCL项目迁移到FireMonkey,我将不得不更换几个第三方组件.特别是,我正在寻找替换WYSIWYG编辑器,AdvancedGrid,TreeView和Office功能区.
是否有可用列出可用或正在开发的第三方FireMonkey组件的目录?
我最近升级到Delphi 2009,并且发现我无法轻易地将一个VCL组件替换为另一个VCL组件而感到失望.最好的答案是GExperts可以用来做到这一点.
是否值得请求Embarcadero将GExperts的部分或全部功能整合到Delphi中?您最常使用哪些"专家"并希望在Delphi中看到?
或者GExperts最好留下社区开源插件?
这是一个简单的(我认为).
是否有一个内置函数的系统,或某人创建的可以从Delphi调用的函数,它将显示一些字节(例如文件大小),Windows在文件的属性框中显示的方式?
例如,这是Windows属性框显示各种大小的方式:
539 bytes (539 bytes)
35.1 KB (35,974 bytes)
317 MB (332,531,365 bytes)
2.07 GB (2,224,617,077 bytes)
Run Code Online (Sandbox Code Playgroud)
显示屏使用字节,KB,MB或GB非常智能,并且仅显示KB,MB和GB的3位有效数字.然后通过用逗号分隔数千个括号显示括号中的确切字节数.这是一个非常好的显示,经过深思熟虑.
有谁知道这样的功能?
编辑:我很惊讶没有这个功能.
谢谢你的有用的想法.我想出了这个,这似乎有效:
function BytesToDisplay(A:int64): string;
var
A1, A2, A3: double;
begin
A1 := A / 1024;
A2 := A1 / 1024;
A3 := A2 / 1024;
if A1 < 1 then Result := floattostrf(A, ffNumber, 15, 0) + ' bytes'
else if A1 < 10 then Result := floattostrf(A1, ffNumber, 15, 2) + ' KB'
else if A1 < …Run Code Online (Sandbox Code Playgroud) 我已根据Windows的要求在注册表中为我的程序设置了文件扩展名.
在注册表中,在shell/open/command下,我有:
"C:\MyProgramPath\MyProgram.exe" "%1"
Run Code Online (Sandbox Code Playgroud)
这对我来说很好.当有人点击与我的应用程序关联的一个或多个文件时,我的应用程序正确打开文件,但每个文件都在一个单独的程序实例中打开.
有什么方法可以做到这一点并打开一个程序实例中的所有文件?
在Delphi 2009中,我做了一个简单的事情:
FindDialog.Execute;
Run Code Online (Sandbox Code Playgroud)
FindDialog窗口保持在程序主窗口的顶部.
但是,如果我在我自己的程序窗口中打开来自其他程序的另一个窗口,则FindDialog窗口仍然位于另一个窗口的顶部.
如果我尝试使用其他程序(例如记事本)的FindDialog,则不会发生这种情况.在记事本和其FindDialog上打开另一个程序的窗口将覆盖Notepad和FindDialog窗口.这似乎是正确和预期的行为.
这是我做错了还是Delphi实现FindDialog的问题?有什么我可以做到使记事本的方式工作?
谢谢大家的评论.您无法重现我的问题的事实已经是一个线索,它是导致这种情况的其他原因.这将有助于我追踪它.当我发现一些东西时,我会再研究一下并发布更多信息.
很有意思.我的PrintDialog不会保持最佳状态.仍然不知道为什么我的FindDialog会这样做.还在研究......
我将调用更改为:FindDialog.Execute(Handle); 还是排在最前面.
我在我的主窗体中添加了另一个FindDialog(这次是FindDialog1),并在程序启动时执行它.它具有相同的保持最佳行为.这至少表明它与我的FindDialog或我用它做的自定义没有任何关系.所以它必须是我主要形式的设置.
看起来我不是唯一一个遇到过这种情况的人.请参阅:资源调优器:版本历史似乎是一个Delphi应用程序,在版本1.99下它指出:"修正:切换到另一个应用程序时,(搜索)对话框预览窗口保持在顶部." 我可能会尝试联系他们,看看他们是否记得他们的修复方法.
我在表单中添加了一些新的对话框,并将这些调用放在一个地方:
FindDialog1.Execute();
PrintDialog1.Execute();
ReplaceDialog1.Execute();
FontDialog1.Execute();
Run Code Online (Sandbox Code Playgroud)
FindDialog和ReplaceDialog保持在其他窗口的顶部.PrintDialog和FontDialog不会保持最佳状态并且可以正常工作.
那么两组对话框之间的区别是什么让前两个对话框出错?
此外,这个问题发生在我的程序的旧版本,使用Delphi 4编译.哎呀.现在我发现在我使用Delphi 4的旧版本中没有发生这个问题.
并且是用户报告了这个问题.他使用Windows XP,我正在开发Vista,所以它发生在不同的操作系统下.
确认:是的,我创建了一个新表单并在其上添加了FindDialog.FindDialog没有问题.这表明我的程序中的某些东西导致FindDialog保持在最顶层.现在,我必须找出那是什么.还有什么想法吗?如果有人给我一个答案,甚至给我一个帮助我解决这个问题的线索,那么他们将得到接受的答案.
解决方案:Sertac对他的回答的编辑给了我解决方法:
Application.NormalizeTopMosts;
FindDialog.Execute();
Application.RestoreTopMosts;
Run Code Online (Sandbox Code Playgroud)
这样做可以防止FindDialog在应用程序不是TopMost时成为TopMost.
...但我仍然真的不理解这一点(Delphi帮助NormalizeTopMosts)非常混乱,并没有表明它应该这样做.
希望这个"修复"不会引起其他问题.
我几天前发了一个问题,答案告诉我要创建自己的课程.
我是OOP之前的老派程序员,我的编程结构合理,高效且有条理,但除了使用Delphi和第三方对象之外,缺少任何自定义OOPing.
当我开始使用Delphi 2时,我已经看过Delphi的面向对象类是如何工作的,但它们对我的编程背景来说似乎很陌生.我理解他们是如何并且非常适合开发人员在用户界面上设计组件和可视化控件.但我从未发现需要在程序本身的编码中使用它们.
所以现在我再看看15年后的Delphi课程和OOPing.例如,如果我采用的结构如下:
type
TPeopleIncluded = record
IndiPtr: pointer;
Relationship: string;
end;
var
PeopleIncluded: TList<TPeopleIncluded>;
Run Code Online (Sandbox Code Playgroud)
然后一个OOP倡导者可能会告诉我把它变成一个类.从逻辑上讲,我认为这将是一个继承自通用TList的类.我猜这会是这样的:
TPeopleIncluded<T: class> = class(TList<T>)
Run Code Online (Sandbox Code Playgroud)
但那就是我陷入困境的地方,并没有很好的指示如何做其余的事情.
当我看一下Delphi在Generics.Collections单元中作为示例的一些类时,我看到:
TObjectList<T: class> = class(TList<T>)
private
FOwnsObjects: Boolean;
protected
procedure Notify(const Value: T; Action: TCollectionNotification); override;
public
constructor Create(AOwnsObjects: Boolean = True); overload;
constructor Create(const AComparer: IComparer<T>; AOwnsObjects: Boolean = True); overload;
constructor Create(Collection: TEnumerable<T>; AOwnsObjects: Boolean = True); overload;
property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects;
end;
Run Code Online (Sandbox Code Playgroud)
然后他们对构造函数和过程的定义是:
{ TObjectList<T> }
constructor TObjectList<T>.Create(AOwnsObjects: Boolean); …Run Code Online (Sandbox Code Playgroud) delphi ×9
associations ×1
class ×1
components ×1
delimiter ×1
delphi-xe2 ×1
dialog ×1
file-io ×1
filesize ×1
filestream ×1
firemonkey ×1
formatting ×1
function ×1
gexperts ×1
large-files ×1
oop ×1
r ×1
registry ×1
sas ×1
shell ×1
statistics ×1
stayontop ×1
unicode ×1
windows ×1