【发布时间】:2023-03-19 00:13:02
【问题描述】:
我收到了advice from Rob Kennedy,他的一项建议是使用SetString,然后将其加载到显示它的 VCL 组件中,从而大大提高了我正在开发的应用程序的速度。
我使用的是 Delphi 2009,所以现在 PChar 是 Unicode,
SetString(OutputString, PChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;
有效,我自己将其更改为 PChar,但由于被移动的数据并不总是 Unicode,实际上它通常是 ShortString 数据....所以到他实际给我使用的内容:
SetString(OutputString, PAnsiChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;
什么都没有显示,但我检查了调试器,并且通常以我过去一次构建 1 个字符的方式出现的文本在变量中。
奇怪的是,这不是我今晚第一次遇到这种情况。因为我试图想出另一种方法,所以我接受了他的部分建议,而不是构建到 VCL 的 TCaption 中,而是将其构建到字符串变量中,然后复制它,但是当我发送它时,什么都没有显示。再次在调试器中构建数据的变量...具有数据。
for I := 0 to OutputLength.Value - 1 do
begin
OutputString := OutputString + Char(OutputData^[I]);
end;
edtString.Text := OutputString;
上述方法不起作用,但旧的慢速方法工作得很好......
for I := 0 to OutputLength.Value - 1 do
begin
edtString.Text := edtString.Text + Char(OutputData^[I]);
end;
我尝试将变量设为 ShortString、String 和 TCaption,但没有显示任何内容。我还发现有趣的是,当我将我的十六进制数据从同一个数组构建到 Richedit 中时,它非常快,而在文本数据的编辑中执行它非常非常慢。这就是为什么我没有费心尝试更改 Richedit 的代码,因为它的运行速度非常快。
编辑添加 - 我想我找到了问题,但我没有解决方案。如果我在调试器中编辑值以删除任何无法显示的内容(旧方法过去只是不显示...不会失败),那么会显示我剩下的内容。因此,如果只是摆脱被转换为垃圾字符的字节的问题,我该如何解决呢?
我基本上有来自 SCSI 设备的传入原始数据,这些数据以十六进制编辑器样式显示。我最初一次添加一个字符的慢速风格成功地显示了字符串和其中没有 Unicode 特定字符的 Unicode 字符串。更快的方法即使工作也不会以一种方式显示 ShortStrings,而另一种方式不会显示不使用非 0-255 字符的 UnicodeStrings。我真的很喜欢并且可以使用速度提升,但如果这意味着牺牲读取字符串的能力......那么应用程序的意义何在?
EDIT3 - 好吧,现在我发现 0-31 是控制字符,32 及以上是有效的,我想我会尝试过滤 char 并用 .这是我打算稍后做的事情来模拟十六进制编辑器样式。
如果有任何其他建议,我很乐意听到,但除此之外,我认为我可以制定一个比原始解决方案更快的解决方案,同时满足我的需要。
【问题讨论】:
标签: delphi string pointers char ansi