小编Vik*_*els的帖子

Delphi中是否存在区分大小写的自然排序功能?

我想订购一个包含不同选项的字符串列表.选项包括:

  1. 按字母顺序排序或逻辑排序
  2. 区分大小写或不区分大小写
  3. 升序或降序

我有所有分支机构除外:

区分大小写,逻辑排序.
(非常多来自php的NatSort)

现在我正在尝试找到一个能够满足我需要的功能.

为了得到一个不区分大小写的逻辑顺序,我实现了对shlwapi.dll中的StrCmpLogicalW-Function的调用

https://docs.microsoft.com/en-us/windows/desktop/api/shlwapi/nf-shlwapi-strcmplogicalw

但是,我找不到与StrCmpLogicalW等效的区分大小写.

我复制了一个看起来很有希望从另一个在线棋盘上玩的功能,并且使用Flags.

原始功能:

  function NatCompareText(const S1, S2: WideString): Integer;
  begin
    SetLastError(0);
    Result:=CompareStringW(LOCALE_USER_DEFAULT,
                           NORM_IGNORECASE or
                           NORM_IGNORENONSPACE or
                           NORM_IGNORESYMBOLS,
                           PWideChar(S1),
                           Length(S1),
                           PWideChar(S2),
                           Length(S2)) - 2;
    case GetLastError of
      0: ;
      //some ErrorCode-Handling
    else
      RaiseLastOSError;
    end;
  end; 
Run Code Online (Sandbox Code Playgroud)

来自:https: //www.delphipraxis.net/29910-natuerliche-sortierungen-von-strings.html

我试图删除Ignore-Case标志,但无济于事.

这就是我想要的结果:http: //php.fnlist.com/array/natsort

   Input:   array("Img12.png", "iMg10.png", "Img2.png", "Img1.png")
   Output:  array("Img1.png", "Img2.png", "Img12.png", "iMg10.png")
Run Code Online (Sandbox Code Playgroud)

而不是:http: //php.fnlist.com/array/natcasesort

   Input:   array("Img12.png", "iMg10.png", "Img2.png", "Img1.png")
   Output:  array("Img1.png", "Img2.png", "iMg10.png", "Img12.png")
Run Code Online (Sandbox Code Playgroud)

更新:

我已经为区分大小写的自然分类完成了第一个非常简单的解决方案.

我这样做的原因是因为我想在多个列上对Stringgrid进行排序,并为每个指定的列提供不同的选项. …

delphi case-sensitive natural-sort delphi-7

6
推荐指数
1
解决办法
408
查看次数

Delphi - 为什么我不能在64Bit中安装我的组件?

我编写了一个自定义组件并试图在我的Delphi 10.1环境中安装它.

我只有一个.Pas文件.

我去了:

组件 - 安装 - 组件,选择我的单元,它位于我桌面上的新文件夹中 - >在同一目录中创建一个新包 - >点击完成

现在,当我在IDE中打开我的包并将平台设置为windows 64Bit时,我可以编译但不能安装我的组件.

我的组件是从TEdit控件派生的,不知道这是否相关.

在我的要求清单中如下:

dbrtl.dcp
rtl.dcp
vcl.dcp
vclactnband.dcp
vcldb.dcp
vclx.dcp
xmlrtl.dcp
Run Code Online (Sandbox Code Playgroud)

我真的很想在32位应用程序和64位应用程序中使用我的组件.

IDE提供的其他VCL控件在64位应用程序中编译没有问题,但是当我将项目设置为64Bit时,我的组件显示为灰色.

我在win8.1 64Bit上.

delphi components 32bit-64bit

4
推荐指数
1
解决办法
2220
查看次数

如何使用TClientdatasets的Filter函数作为日期?

我在Delphi 7中有一个TClientDataSet,我想将一个我输入的过滤器应用到一个简单的TEdit中,所以它看起来像这样:

CDS.Filter:=Edit1.Text;
CDS.Filtered:=True;
Run Code Online (Sandbox Code Playgroud)

现在我查看帮助文件以过滤记录,根据它我也应该能够过滤DateTime-Fields.但每当我写这样的东西到我的编辑:

DAY(EDATUM)=17  
Run Code Online (Sandbox Code Playgroud)

并应用过滤器我得到"表达式中的类型不匹配"-Exception.

我已尝试过上述示例的多种不同格式.

DATE(DAY(EDATUM))=DATE(DAY(17))     //Doesn't work
DAY(EDATUM)='17'                    //Doesn't work
DAY(EDATUM)=DAY(17)                 //Doesn't work   
DAY(EDATUM)=DAY(DATE('17.09.2016'))
...
...
Run Code Online (Sandbox Code Playgroud)

唯一有效的是

EDATUM='17.09.2016'                 //Works
Run Code Online (Sandbox Code Playgroud)

但我想单独过滤几天和几年,而不是将它们放在一起.

我在网上找到的任何东西都没有.

我知道我做错了什么?

Edatum是Firebird 1.5数据库中的TimeStamp.

delphi tclientdataset filter

0
推荐指数
1
解决办法
846
查看次数