TStrings.Add vs TStrings.AddObject
Модератор: Модераторы
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
TStrings.Add vs TStrings.AddObject
Не могу уловить смысл - в документации об этом как-то туманно. Прошу подтвердить или опровергнуть догадку: AddObject создает И строку И привязанный к ней объект?
И как тогда привязать объект к уже добавленной через .Add строке? Только удалением ее и пересозданием через .AddObject?
И как тогда привязать объект к уже добавленной через .Add строке? Только удалением ее и пересозданием через .AddObject?
Troublemaker писал(а):AddObject создает И строку И привязанный к ней объект?
Ага. А простой Add это аналог AddObject(str,nil);
Troublemaker писал(а):И как тогда привязать объект к уже добавленной через .Add строке? Только удалением ее и пересозданием через .AddObject?
StringList.objects[i]:=TLabel.create(form1);
- *vmr
- постоялец
- Сообщения: 168
- Зарегистрирован: 08.01.2007 00:46:07
- Откуда: Киев
- Контактная информация:
Troublemaker писал(а):Не могу уловить смысл - в документации об этом как-то туманно. Прошу подтвердить или опровергнуть догадку: AddObject создает И строку И привязанный к ней объект?
Код: Выделить всё
function TStringList.Add(const S: string): Integer;
begin
Result := AddObject(S, nil);
end;Исходники -- самая лучшая документация
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
B4rr4cuda, *vmr, спасибо. Теперь понятнее.
Еще бы понять, как ОДНУ строку из TStrings скинуть в стрим.
Пишу:
Но вместо ожидаемых строки и числа в квадратных и фигурных скобках получаю в файле какой-то мусор, в котором нет даже скобок, хотя строки в Items присутствуют и после items.SaveToStream выглядят так, как и должны.
Что я не учел?
Еще бы понять, как ОДНУ строку из TStrings скинуть в стрим.
Пишу:
Код: Выделить всё
var ZhopA,PopA:string;
CLBModules:TCheckListBox;
...
ZhopA:='['+CBLModules.Items.Strings[i]+']';
TempStream.Write(ZhopA,100);
PopA:='{'+IntToStr(Length(ZhopA))+'}';
TempStream.Write(PopA,Length(PopA));
...
TempStream.SaveToFile(filename);
Что я не учел?
- Сергей Смирнов
- энтузиаст
- Сообщения: 595
- Зарегистрирован: 28.04.2005 13:23:25
- Откуда: Москва
- Контактная информация:
TStream.Write вроде буфер пишет, а не строку. Надо бы другой метод поискать, типа WriteString. И это зависит от того, какой конкретно Stream используется, потому как TStream -- это абстракция какая-то сплошная.
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
если верить документации, вообще не поддерживается и возвращает эксепшн, ибо этим должен заниматься потомок.Сергей Смирнов писал(а):TStream.Write
Забыл упомянуть: TempStream:TMemoryStream;
Буфер пишет .WriteBuffer, вызывающая для своей работы ту самую .Write.
Если верить исходникам, то
Код: Выделить всё
Procedure TStrings.SaveToStream(Stream: TStream);
Var
S : String;
begin
S:=Text;
Stream.WriteBuffer(Pointer(S)^,Length(S));
end;
Добавлено спустя 4 минуты 47 секунд:
Ага, так сработало... Но как-то грустно, раз уж string и так передается по ссылке.
- Сергей Смирнов
- энтузиаст
- Сообщения: 595
- Зарегистрирован: 28.04.2005 13:23:25
- Откуда: Москва
- Контактная информация:
ИМХО, лучше сюда подглядеть:
Код: Выделить всё
procedure TStringStream.WriteString(const AString: string);
begin
Write (PChar(Astring)[0],Length(AString));
end;
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Troublemaker писал(а):Pointer(S)^
Кажется, это одно и то же. Но - спасибо, пригодится.Сергей Смирнов писал(а):PChar(Astring)[0]
Добавлено спустя 28 секунд:
Результаты - точно одинаковые
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
*vmr писал(а):А еще можно
Да, прокатило:
Код: Выделить всё
WriteBuffer(CBLModules.Items.Strings[i][1],Length(CBLModules.Items.Strings[i]))Я ж чувствовал, что раз ansistring передается по ссылке, то должна быть пойнтером или чем-то в этом роде.
Troublemaker писал(а):Что я не учел?
Если строка длиной не более 255 символов, то тип ShortString будет самое то, т.к. он, в отличие от AnsiString, не указатель.
Тогда Ваш код будет работать.
- Troublemaker
- постоялец
- Сообщения: 292
- Зарегистрирован: 16.04.2008 13:00:44
- Откуда: Биробиджан, Дальний Восток
- Контактная информация:
Vadim писал(а):Если строка длиной не более 255 символов
Речь идет именно о TSTrings, которые есть TCheckListBox.Items со всеми вытекающими...
Troublemaker писал(а):var ZhopA,PopA:string;
...
TempStream.Write(ZhopA,100);
...
Речь, как раз шла о string...
Вот если бы было написано:
Код: Выделить всё
TempStream.Write(TCheckListBox.Items[трали-вали],100);тогда Ваше возражение было бы обосновано.
