Вверх ↑
Ответов: 4663
Рейтинг: 767
#1: 2015-03-30 11:04:03 ЛС | профиль | цитата
nesco писал(а):
Если написать просто s := ReadString(_Data, _data_Str, _prop_Str), то дополнительная память выделяться не будет и в s просто запишется указатель на строку, которая хранится в TData
Поскольку у нас не ShortString, а AnsiString, то мне кажется, это не имеет значения: такие строки обладают, если я правильно понимаю, copy-on-write semantic. Как ты считаешь, что должен показать этот код:
#pas
var
s1, s2: string;
begin
s1 := ReadString(_Data, _data_Str, _prop_Str);
s2 := s1;
SetLength(s2, 0);
_debug(s1);
end;
nesco писал(а):
Мы уже не раз на это попадали
Хотелось бы пример.

Tad писал(а):
Интересно, каким кодом ты решишь предложенные методы doCopyFirst(Count), doCopyLast(Count)?
doCopyFirst(Count) - также, как и ты. doCopyLast(Count) - стандартным system.copy().
Не совсем понял, почему
Tad писал(а):
Copy(str,1,n) - это For i:=1 to n do s:=s+str[i];

Я думаю, Copy(str,1,n) - это
Tad писал(а):
SetLength(Result, n);
For i:=1 to n do Result[i] := str[i];
Здесь память выделяется один раз в отличие от s:=s+str[i] (я сомневаюсь, что компилятор может угадать размер будущей строки, максимум, выделить с запасом)

Tad писал(а):
Т.е. их нужно просто заполнить пробелами
Если этот компонент - это возврат к теме дополнения строки, то в какой-то компонент (либо создать новый) нужно добавить методы doPadLeft, doPadRight с выбором символа-заполнителя, и не запутывать пользователя "установкой длины строки".
карма: 26

0