Это просто быстрое обновление
RemObjects добавил классную новую инфраструктуру VCL, которую можно использовать как для .net, так и для их новых собственных целей. Это также влияет на строки.
Строки вне .net или VCL не являются изменяемыми . Вот почему их можно только уменьшить (String.Substring), что вы испытываете в своем вопросе.
Однако довольно легко создать собственный метод setlength ().
Это не красиво и очень олдскул , но для немедленного решения, оно делает свою работу.
Я использую справочную таблицу, чтобы мы увеличивали строки в 16 раз. Напоминание (менее 16) также использует справочную таблицу. LLVM агрессивно оптимизирует подобный код. Это может быть ужасно, но это работает. Надеюсь это поможет. Просто переименуйте, как считаете нужным:
var str_growth_LUT: array[1..16] of String
= [' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' '];
class procedure QTXString.SetLength(var Text: String; NewLength: Integer);
begin
var lCurrent := length(Text);
if NewLength < lCurrent then
Text := Text.Substring(1, NewLength)
else
if NewLength > lCurrent then
begin
var diff := NewLength - lCurrent;
var temp: String;
// Calculate parts of 16
var major := diff mod 16;
var minor := diff - (major * 16);
// grow by chunks of 16
while major > 0 do
begin
temp := temp + str_growth_LUT[16];
dec(major);
end;
// Add reminder (less than 16)
if minor > 0 then
temp := temp + str_growth_LUT[minor];
Text := temp;
end;
end;