我想订购一个包含不同选项的字符串列表.选项包括:
我有所有分支机构除外:
区分大小写,逻辑排序.
(非常多来自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 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 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.