我试图根据包含非英文字符的unicode字符串值对数组/列表/任何数据进行排序,我希望它们按字母顺序正确排序.
我写了很多代码(D2010,win XP),我认为这对于未来的国际化非常可靠,但事实并非如此.它全部使用unicodestring(string)数据类型,到目前为止我刚刚将英文字符放入unicode字符串中.
我似乎不得不承担起非常严重的unicode错误.我跟我的德国朋友聊了一下,尝试了一些德语ß,(ß是's',应该在S之后和T之前的字母表中)和ö等(注意变音符号),我的排序算法都不再适用了.结果非常混乱.垃圾.
从那以后,我一直在广泛阅读并学习了很多关于unicode整理的不愉快的事情.事情看起来很严峻,比我想象的要严重得多,我已经严重搞砸了.我希望我错过了一些东西,事情实际上并不像现在看起来那么严峻.我一直在修补Windows api调用(RtlCompareUnicodeString)没有成功(保护错误),我无法让它工作.我学到的API调用的问题是,他们在各种较新的Windows平台上进行了更改,并且很快就会使用delphi进行交叉平台,随后使用linux,我的应用程序是客户端服务器所以我需要关注这一点,但是这种情况是什么是不是(糟糕)我会感激任何前进的进步,即赢得api具体.
使用win api函数RtlCompareUnicodeString来明显解决方案吗?如果是这样的话,我应该再次尝试,但是我已经对unicode整理所涉及的所有问题感到吃惊,我不知道我应该采取什么方式来比较这些字符串.
我了解了IBM ICU c ++开源项目,虽然是旧版本的ICU,但它有一个delphi包装器.这似乎是一个非常全面的解决方案,它是独立于平台的.当然,我不能为此创建一个delphi包装器(或更新现有的包装器)以获得unicode整理的良好解决方案?
我很高兴听到两个层面的建议: -
A)Windows特定的非便携式解决方案,我很高兴此刻,忘记了客户端服务器的后果!B)一个更便携的解决方案,不受各种unicode api功能的各种XP/vista/win7变种的影响,因此使我在XE2 mac支持和未来的Linux支持方面处于有利地位,更不用说客户端服务器的复杂性了.
顺便说一句我真的不想做'make-do'解决方案,在比较之前扫描字符串并替换某些棘手的字符等,我已经读过了.我给出了上面的德语示例,这只是一个例子,我想让它适用于所有(或至少大多数,远东,俄语)语言,我不想为特定语言或两个语言做变通办法.我也不需要任何关于排序算法的建议,它们很好,它只是字符串比较位错了.
我希望我失踪/做一些愚蠢的事情,这一切看起来都很头疼.
谢谢.
编辑,鲁迪,这是我试图调用RtlCompareUnicodeString的方式.对不起,我已经度过了一段可怕的时光.
program Project26
{$APPTYPE CONSOLE}
uses
SysUtils;
var
a,b:ansistring;
k,l:string;
x,y:widestring;
r:integer;
procedure RtlInitUnicodeString(
DestinationString:pstring;
SourceString:pwidechar) stdcall; external 'NTDLL';
function RtlCompareUnicodeString(
String1:pstring;
String2:pstring;
CaseInSensitive:boolean
):integer stdcall; external 'NTDLL';
begin
x:='wef';
y:='fsd';
RtlInitUnicodeString(@k, pwidechar(x));
RtlInitUnicodeString(@l, pwidechar(y));
r:=RtlCompareUnicodeString(@k,@l,false);
writeln(r);
readln;
end.
Run Code Online (Sandbox Code Playgroud)
我意识到这很可能是错的,我不习惯直接调用api notctions,这是我最好的猜测.
关于StringCompareEx api函数.这看起来真的很好,但只对Vista +有用,我正在使用XP.StringCompare是在XP上,但那不是Unicode!
回顾一下,基本任务是比较两个字符串,并根据当前Windows语言环境中指定的字符排序顺序进行比较.
任何人都可以肯定地说ansicomparetext是否应该这样做?它对我不起作用,但是其他人已经说过应该这样,而我读过的其他内容也表明应该这样做.
这是我在德语语言环境中使用AnsiCompareText时得到的31个测试字符串(空格分隔 - 没有字符串包含空格): -
编辑2.
我仍然希望听到我是否应该期待AnsiCompareText使用区域设置信息,就像lkessler所说的那样,并且lkessler之前也发布了关于这些主题的内容,并且之前似乎已经完成了这些.
然而,根据Rudy的建议,我也一直在检查CompareStringW - 它与CompareString共享相同的文档,所以它不是我之前说过的非unicode.
即使AnsiCompareText无法工作,虽然我认为应该如此,但win32api函数CompareStringW确实可以工作.现在我已经定义了我的API函数,我可以调用它,我得到一个结果,没有错误......但是无论输入字符串如何,我每次都得到相同的结果!它每次返回1 - …
当然,即使我能做到这一点......
var
testarray : array of string;
setlength(testarray, 5);
Run Code Online (Sandbox Code Playgroud)
但是如果我想变得聪明并且有一个程序我通过这样的referance传递数组我无法做到!
procedure DoStuffWithArray(var passedarray : array of string);
begin
setlength(passedarray, 5);
end;
Run Code Online (Sandbox Code Playgroud)
编译器在我的proc中的单行代码中说"不兼容的类型".
如果我在调用proc之前执行setlength,我可以在数组上执行其他内容,例如set set element values,但是我不能在proc中执行setlength,这就是我想要做的.
非常感谢任何帮助,谢谢大家.
我完全无法在Delphi 2010中获得类声明.我已经阅读了文档,在网上阅读,也许我是一个白痴,但我无法得到任何编译.任何帮助都将受到大力赞赏!
我敲了这两个米老鼠班.当然,我知道他们需要构造函数等来实际工作,它只是我正在解决的问题的演示.
我有MyParent类,其中包含我的其他类MyChild的TList.没关系.但是在MyChild中我希望能够设置对其父对象的引用,而不是TList而是MyParent类.
unit ForwardClassDeclarationTest;
interface
uses generics.collections;
type
MyChild = Class
private
ParentObect:MyParent; <--I need to be able to make this accessable
public
End;
type
MyParent = Class
public
tlChildren:TList<MyChild>;
End;
implementation
end.
Run Code Online (Sandbox Code Playgroud)
我需要在这两个类之前创建一个前向声明,但我完全无法得到任何结果.提前感谢任何倾向于帮助我的人.
我只是冒险在Delphi 2010中编写我的第一个基于套接字的程序.我尝试使用Indy,没有成功,甚至只编写一个可以发送数据包的简单客户端和服务器.然后我使用TTCPServer和TTCPClient,使用以下"简单得到"演示相同的结果: -
我为客户端和服务器应用程序启动了2个IDE实例.我非常有信心避免发布与基于套接字的'helloworld'版本相关的问题的耻辱,我只花了2天时间尝试所有内容.
好吧,我刚刚决定把毛巾扔进去,请你帮忙,在我做之前,我只是从IDE外面运行exes ...是的,他们工作了!他们一直在工作,但不是从IDE内部工作.
我可以在IDE中成功运行这些程序吗?谢谢.
我在D2010,我必须坚持到64位出来.
使用泛型,不支持指向泛型类型的指针,我发现它们确实非常有用.我在其他地方读过SO(2009年的帖子)巴里凯利爵士认为这可能会在未来发生变化.有谁知道XE是否支持这个?
如果没有,我真的希望他们进入XE2.
谢谢.
我正冒险在Delphi中制作自己的组件.我很难开始组件开发.
我想制作复合控件,即由几个其他控件组成的控件,例如地址表单或类似的控件.
我是从TWinControl下降的.这会被认为是正确的选择吗?
最重要的是,我看不到在D2010中可视化设计组件的方法.这可能吗?例如,将一些文本框放到组件上,就像使用表单一样.我希望我不必将所有视觉方面的代码都交给我自己的组件.
此外,delphi组件开发的任何好链接都将非常受欢迎 - 尤其是复合控件.文件不是A1,它是一场斗争.我已经搜索了很多,我仍然无处可去.
从TCustomGrid下载一个新控件的最低限度是什么,并在IDE中的表单上获取它而不会在IDE中出现"抽象错误"?
我已经尝试了几天,但我有点像德尔福noob atm,TCustomGrid零成功率:(
如果有人可以帮助我只是获得TCustomGrid的基本后代,除了实现基本的TCustomGrid之外什么都不做,那将是非常值得赞赏的.谢谢.
编辑 - 我知道如何创建控件的基础知识,我只能用TCustomGrid来做