小编jon*_*ndy的帖子

需要一个例程来检测相似但不相同的字符串

我有一个字符串列表,其中一些字符串自我之前的版本以来已被修改过.一些变化是微不足道的(间隔,一个字等).我想检测只有"轻微"差异的字符串,这样我就可以尝试使用旧的翻译.

"微小差异"是什么意思?在我开始使用数据库之前,我不会知道.

你知道任何可调节的例程,它们将指示两个字符串何时相似但不相同?任何会返回一个数字的例程,表示两个字符串的不同之处?

delphi string

11
推荐指数
1
解决办法
949
查看次数

Delphi例程以任意语言显示任意编码的任意字节

我有一些字节流,可能编码也可能不编码为1)扩展ASCII,2)UTF-8或3)UTF-16.它们可能是英文,法文或中文.我想编写一个简单的程序,允许用户输入一个字节流,然后选择其中一个编码和一种语言,看看字符串在以这种方式解释时会是什么样子.或者简单地以9种可能的方式解释每个字符串并将它们全部显示出来.我想避免重复切换区域化.我正在使用Delphi 2007.我正在尝试做什么甚至可能?

delphi utf-8 delphi-2007

3
推荐指数
1
解决办法
475
查看次数

Delphi DLL没有卸载,可能是由于仍然分配了GDI

我们编写了一个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)

delphi dll delphi-2007

2
推荐指数
1
解决办法
1157
查看次数

使用临时变量格式化输出

在保留一些代码时,我遇到了这样的声明:

 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)

delphi delphi-2007

2
推荐指数
1
解决办法
92
查看次数

标签 统计

delphi ×4

delphi-2007 ×3

dll ×1

string ×1

utf-8 ×1