Я получал совет от Роба Кеннеди , и одним из его предложений, который значительно увеличил скорость приложения, над которым я работал, было использование SetString
, а затем загрузка его в компонент VCL, который его отображал. .
Я использую Delphi 2009, так что теперь PChar является Unicode,
SetString(OutputString, PChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;
Работает, и я сам изменил его на PChar, но так как перемещаемые данные не всегда являются Unicode, на самом деле это обычно ShortString Data .... так что он фактически дал мне использовать:
SetString(OutputString, PAnsiChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;
Ничего не появляется, но я проверяю в отладчике, и текст, который обычно появлялся так, как я делал это при построении 1 символа за раз в прошлом, был в переменной.
Как ни странно, я не первый раз сталкиваюсь с этим сегодня вечером. Поскольку я пытался придумать другой способ, я воспользовался его советом и вместо того, чтобы встраивать в TCaption VCL, я встроил его в строковую переменную, а затем скопировал, но когда я отправляю его, ничего не отображается. Еще раз в отладчике переменная, в которую встроены данные ... содержит данные.
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, которое отображается в стиле hex-редактора. Мой оригинальный медленный стиль добавления одного символа за раз успешно отображал строки и строки Юникода, в которых не было символов, специфичных для Юникода. Более быстрые методы, даже если они работают, не будут отображать ShortStrings в одну сторону, а другой способ не будет отображать UnicodeStrings, которые не используют не 0-255 символов. Я действительно люблю и могу использовать повышение скорости, но если это означает, что нужно пожертвовать способностью читать строку ... тогда какой смысл в приложении?
EDIT3 - Хорошо, теперь, когда я выяснил, что 0-31 является контрольным символом, а 32 и выше действительным, я думаю, что я попытаюсь отфильтровать символ и заменить недопустимые на a. это то, что я планировал сделать позже, чтобы эмулировать стиль шестнадцатеричного редактора.
Если есть какие-либо другие предложения, я был бы рад услышать о них, но в противном случае я думаю, что смогу создать решение, которое будет быстрее оригинала и в то же время сделает то, что мне нужно.