我有一个字符串列表,其中一些字符串自我之前的版本以来已被修改过.一些变化是微不足道的(间隔,一个字等).我想检测只有"轻微"差异的字符串,这样我就可以尝试使用旧的翻译.
"微小差异"是什么意思?在我开始使用数据库之前,我不会知道.
你知道任何可调节的例程,它们将指示两个字符串何时相似但不相同?任何会返回一个数字的例程,表示两个字符串的不同之处?
我有一些字节流,可能编码也可能不编码为1)扩展ASCII,2)UTF-8或3)UTF-16.它们可能是英文,法文或中文.我想编写一个简单的程序,允许用户输入一个字节流,然后选择其中一个编码和一种语言,看看字符串在以这种方式解释时会是什么样子.或者简单地以9种可能的方式解释每个字符串并将它们全部显示出来.我想避免重复切换区域化.我正在使用Delphi 2007.我正在尝试做什么甚至可能?
我们编写了一个DLL来执行所有打印功能.它允许我们进行打印预览,打印,还可以生成PDF.
我们现在有一个特定的使用此DLL的模式,之后DLL无法正确卸载.结果是,当我们退出主程序时,它会消失但不会终止,我们必须手动终止该过程.
我想,罪魁祸首是一些GDI资源没有被正确地"封闭"(当我这样说时,我从GDI的无知深处说出来).我们不直接处理GDI资源,而是在使用各种Delphi组件时使用GDI资源.
有关如何找到并解决此类问题的任何提示?在我们尝试终止程序之后,我们使用GDIView确认某些GID资源仍然存在,但我不知道如何将这些Windows/Kernel句柄与底层Delphi代码相关联.我可以在程序执行期间的不同时间提供GIDView列表.
谢谢!
乔恩(德尔福2007)
我回复了所提出的建议,但没有人回复我的回复.最终,我放弃了.我最终编写了一个自杀程序,它不仅杀死了我自己的进程,而且还杀死了其他具有相同名称的进程,以解决问题.荒谬的矫枉过正,但我似乎别无选择.我正在使用我在某处找到的免费软件ProcessInfo工具.
procedure KillNamedProcesses(pName : String);
// used to clean up programs that hang as a result of DLLs not unloading
var
ProcessInfo : TProcessInfo;
ProcessName : String;
i : INTEGER;
currentPID : cardinal;
BEGIN
currentPID := GetCurrentProcessID;
pName := UpperCase(pName);
ProcessInfo := TProcessInfo.Create(nil);
// kill all old processes (not our process)
for i := 0 to ProcessInfo.RunningProcesses.Count - 1 do begin
ProcessName := ProcessInfo.RunningProcesses[i].ExeFile;
IF (UpperCase(ProcessName) <> pName) THEN CONTINUE;
IF (currentPID <> ProcessInfo.RunningProcesses[i].ProcessID) …
Run Code Online (Sandbox Code Playgroud) 在保留一些代码时,我遇到了这样的声明:
sActDiln := Format('%.*f',[tdDigits.ndd, Fields[itd].AsFloat * rfc / 100]);
Run Code Online (Sandbox Code Playgroud)
为了看看发生了什么,我添加了一个DOUBLE类型的临时变量(actDiln),并修改了如下代码:
actDiln := Fields[itd].AsFloat * rfc / 100;
sActDiln := Format('%.*f',[tdDigits.ndd, actDiln]);
Run Code Online (Sandbox Code Playgroud)
当"Fields [itd] .AsString"为35且"rfc"为109时,计算值从38.15变为38.14999999.当小数位数为1时,则将计算值从38.2更改为38.1.这引起了其他问题.
我没想到使用这个临时变量会导致这样的问题.谁能解释一下这里发生了什么?为避免这种情况,未来的最佳做法是什么?
这证明了这个问题:
Uses DB, DBISAMTb;
procedure TForm1.FormShow(Sender: TObject);
var
t : TDBISAMTable;
actDiln, rfc : double;
actDilnE : extended;
sActDiln1, sActDiln2, sActDiln3 : string;
begin
t := TDBISAMTable.Create(Application);
WITH t DO BEGIN
TableName := 'xxx';
DataBaseName := 'Study';
Active := False;
Exclusive := False;
IF Exists THEN DeleteTable;
WITH FieldDefs DO BEGIN
Clear;
Add('fld', ftString, 10, …
Run Code Online (Sandbox Code Playgroud)