我正在使用Delphi 2007,并想知道是否有一种简单的方法来计算字符串在另一个字符串中出现的次数.我可以使用任何内置函数?
例子:
我已经做了大约18个月的裸机TCP/IP,所以我想知道目前的技术水平是多少.
我正在寻找正面和负面两个方面,开发服务器和客户端软件.
我将做一个需要坚如磐石的TCP/IP层的项目,所以对我来说这是一个重要的方面:)
为了成为一个社区维基,我正在寻找更广泛的答案,而不仅仅是'坚如磐石'.因此,例如关于特征宽度的信息也是值得赞赏的.
我将使用答案中的相关方面更新问题,以获得具有这些库的平衡概述的Wiki条目.
例如,请参阅下面我的回答以及我过去与Indy的经历我对Indy中的异常处理和反冻结感到矛盾,虽然我已经习惯了它,但仍感觉有点不自然.
现在我用Delphi 2007(非Unicode)和XE(Unicode)开发,所以我考虑的库应该至少支持那两个Delphi版本.
我使用TWebBrowser来显示Google地图.问题是它在加载地图时会阻塞主ui线程.是否可以在单独的线程中更新地图?
编辑: RRUZ你是对的TWebBrowser有URL的异步加载.但是我发现了阻止呼叫的问题:
if WaitWhileProcessing and (MapQueryResult.Count > 0) then
Result := MapQueryResult[0] as TMapQuery;
Run Code Online (Sandbox Code Playgroud)
和方法:
function TMapItemCollection.WaitWhileProcessing: Boolean;
var
vMaxSleepCnt: Integer;
begin
Result := True;
vMaxSleepCnt := 0;
while Processing or Loading do
begin
inc(vMaxSleepCnt);
Application.ProcessMessages;
Sleep(100);
if vMaxSleepCnt = 100 then
begin
Result := False;
Break;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
所以它似乎解决了这个代码应该重构.但这不是这个问题的范围.
下面的代码无法启动文档.我收到错误193(%1不是有效的Win32应用程序).启动可执行文件工作正常.文件已正确关联,双击时会启动相应的应用程序.我在SO和其他地方搜索过错误消息,createprocess stuff等等.(例如,为什么CreateProcess在Windows Server 2003 64位中失败? 我知道引用命令行.
这是Win7 64位VMWare VM中的Delphi XE2(Update 4)Win32应用程序.
代码也在主机(Win7 64位)和具有32位XP的Virtual PC VM中失败.
应该在Win7 VM(Excel 2003和Crimson Editor)中启动的应用程序是32位.
从IDE启动或独立运行测试应用程序时都会发生故障
它曾经是Delphi2007代码,这个代码来自的编译D2007应用程序无处不在.
代码有什么问题?这几乎就像我忽略了一些非常明显的东西......
提前致谢,
一月
procedure StartProcess(WorkDir, Filename: string; Arguments : string = '');
var
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
lCmd : string;
lOK : Boolean;
LastErrorCode: Integer;
begin
FillChar( StartupInfo, SizeOf( TStartupInfo ), 0 );
StartupInfo.cb := SizeOf( TStartupInfo );
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := sw_Normal;
FillChar( ProcessInfo, SizeOf( TProcessInformation ), 0 );
lCmd := '"' + WorkDir …Run Code Online (Sandbox Code Playgroud) 我想要一个按钮作为进度条.
+
= ........
例如,随着任务的进行,填充绿色背景的按钮.
我知道我可以创造自己的,但如果有一些现成的东西,我很乐意使用它.
有没有人知道适合该法案的免费或商业组件?
我更喜欢它在Delphi-2007中工作,但如果它只在XE2中可用,那也没关系.
更新
TMS具有glassbutton允许透明度的.如果你将一个Shape(带圆角)放在深绿色的下面,它看起来就像我想要的效果.
只需增加形状的宽度以匹配进度,您就可以开展业务.
当我有时间的时候,我会制作一个填充颜色的按钮,并建立一个链接.
刚刚从Windows 8.1更新到Windows 10,现在当我尝试在Delphi 2007上打开任何项目时,我得到了他的错误:
无法加载项目xxxxx未找到导入的项目"c:\ Windows\Microsft.NET ...\Borland.Delphi.Targets".确认路径声明是否正确,并且该文件存在于磁盘上
任何提示来解决它?
背景 我在一个由7名开发人员和2名测试人员组成的团队中工作,这些团队负责物流系统.我们使用Delphi 2007和模拟驱动开发与Bold for Delphi作为框架.该系统现已投入生产约7年,拥有约1,700万行代码.我们在4-5周后发布到生产,几乎每次发布后我们都要为我们没有找到的bug做一些补丁.这对我们和客户来说当然都很烦人.
当前测试 解决方案当然是更自动化的测试.目前我们有手动测试.一个Testdbgenerator,以空数据库开头,并从建模方法中添加数据.我们还有Testcomplete,它运行一些非常基本的脚本来测试GUI.缺乏时间阻止我们添加更多测试,但脚本对应用程序中的更改也很敏感.几年前我真的尝试用DUnit进行单元测试,但是几天后我放弃了.这些单位的联系太紧.
单元测试前提条件 我认为我知道单元测试的一些前提条件:
使用的框架 我们可能会升级到Delphi XE2,主要是因为64位编译器.我看了一下Spring,但这需要D2007的更新,现在不会发生.或许明年.
问题 大多数代码仍然没有自动测试.那么提高旧代码可测试性的最佳途径是什么?或者也许最好只开始为新方法编写测试?我不确定增加自动测试的最佳方法是什么,欢迎提出意见.我们现在可以使用D2007 + DUnit,然后轻松更改为Delphi XE2 + Spring吗?
编辑:关于手动测试的当前测试方法只是"敲打它并尝试打破它" 克里斯称之为.
制作delphi应用程序(delphi 2007 for win32)的最佳方法是全屏显示,删除应用程序边框并覆盖windows任务栏?
我正在寻找类似于当你点击F11时IE所做的事情.
我希望这对于用户来说是一个运行时选项,而不是我自己的设计时间决定.
正如在接受的答案中提到的那样
BorderStyle := bsNone;
Run Code Online (Sandbox Code Playgroud)
是这样做的一部分.奇怪的是,我E2010 Incompatible types: 'TFormBorderStyle' and 'TBackGroundSymbol'在使用该行时仍然遇到错误(已bsNone定义了另一种类型).
为了克服这个问题,我不得不使用:
BorderStyle := Forms.bsNone;
Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 2007应用程序,它具有一个带有FindFile Common AVI的TAnimate控件.当应用程序在Windows XP上运行时,它可以正常工作,但在Windows 7上没有任何内容.我听说它现在需要自己的线程,但我不确定.
有谁知道如何让TAnimate的Common AVI控件在Windows 7(或Vista)上运行?
这是一个非常特殊的Delphi问题(甚至可能是Delphi 2007特有的).我目前正在为实习字符串编写一个简单的StringPool类.作为一个优秀的小编码器,我还添加了单元测试,发现了令我困惑的东西.
这是实习的代码:
function TStringPool.Intern(const _s: string): string;
var
Idx: Integer;
begin
if FList.Find(_s, Idx) then
Result := FList[Idx]
else begin
Result := _s;
if FMakeStringsUnique then
UniqueString(Result);
FList.Add(Result);
end;
end;
Run Code Online (Sandbox Code Playgroud)
没有什么真正的花哨:FList是一个排序的TStringList,所以所有的代码都在查找列表中的字符串,如果它已经在那里它返回现有的字符串.如果它尚未出现在列表中,它将首先调用UniqueString以确保引用计数为1,然后将其添加到列表中.(我检查了结果的引用计数,并且在'hallo'被添加两次之后它是3,如预期的那样.)
现在来测试代码:
procedure TestStringPool.TestUnique;
var
s1: string;
s2: string;
begin
s1 := FPool.Intern('hallo');
CheckEquals(2, GetStringReferenceCount(s1));
s2 := s1;
CheckEquals(3, GetStringReferenceCount(s1));
CheckEquals(3, GetStringReferenceCount(s2));
UniqueString(s2);
CheckEquals(1, GetStringReferenceCount(s2));
s2 := FPool.Intern(s2);
CheckEquals(Integer(Pointer(s1)), Integer(Pointer(s2)));
CheckEquals(3, GetStringReferenceCount(s2));
end;
Run Code Online (Sandbox Code Playgroud)
这会将字符串'hallo'添加到字符串池两次并检查字符串的引用计数,并且s1和s2确实指向相同的字符串描述符.
每个CheckEquals都按预期工作,但最后一个.它失败,错误"预期:<3>但是:<4>".
那么,为什么引用计数为4?我原以为3:
这是Delphi 2007,因此字符串是AnsiStrings.
哦,是的,函数StringReferenceCount实现为:
function GetStringReferenceCount(const _s: AnsiString): integer;
var
ptr: …Run Code Online (Sandbox Code Playgroud) delphi string reference-counting delphi-2007 string-interning
delphi ×10
delphi-2007 ×10
string ×2
bold-delphi ×1
delphi-xe ×1
delphi-xe2 ×1
dunit ×1
tcp ×1
twebbrowser ×1
unit-testing ×1
wiki ×1
winapi ×1
windows ×1
windows-10 ×1