TStrings.Add vs TStrings.AddObject

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

TStrings.Add vs TStrings.AddObject

Сообщение Troublemaker » 29.05.2008 17:30:03

Не могу уловить смысл - в документации об этом как-то туманно. Прошу подтвердить или опровергнуть догадку: AddObject создает И строку И привязанный к ней объект?

И как тогда привязать объект к уже добавленной через .Add строке? Только удалением ее и пересозданием через .AddObject?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TStrings.Add vs TStrings.AddObject

Сообщение B4rr4cuda » 29.05.2008 18:58:13

Troublemaker писал(а):AddObject создает И строку И привязанный к ней объект?

Ага. А простой Add это аналог AddObject(str,nil);

Troublemaker писал(а):И как тогда привязать объект к уже добавленной через .Add строке? Только удалением ее и пересозданием через .AddObject?

StringList.objects[i]:=TLabel.create(form1);
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: TStrings.Add vs TStrings.AddObject

Сообщение *vmr » 29.05.2008 19:11:23

Troublemaker писал(а):Не могу уловить смысл - в документации об этом как-то туманно. Прошу подтвердить или опровергнуть догадку: AddObject создает И строку И привязанный к ней объект?

Код: Выделить всё
function TStringList.Add(const S: string): Integer;
begin
  Result := AddObject(S, nil);
end;

Исходники -- самая лучшая документация
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: TStrings.Add vs TStrings.AddObject

Сообщение Troublemaker » 29.05.2008 19:48:47

B4rr4cuda, *vmr, спасибо. Теперь понятнее.

Еще бы понять, как ОДНУ строку из 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);
Но вместо ожидаемых строки и числа в квадратных и фигурных скобках получаю в файле какой-то мусор, в котором нет даже скобок, хотя строки в Items присутствуют и после items.SaveToStream выглядят так, как и должны.

Что я не учел?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TStrings.Add vs TStrings.AddObject

Сообщение Сергей Смирнов » 29.05.2008 20:20:57

TStream.Write вроде буфер пишет, а не строку. Надо бы другой метод поискать, типа WriteString. И это зависит от того, какой конкретно Stream используется, потому как TStream -- это абстракция какая-то сплошная.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Re: TStrings.Add vs TStrings.AddObject

Сообщение Troublemaker » 29.05.2008 20:32:21

Сергей Смирнов писал(а):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 и так передается по ссылке.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TStrings.Add vs TStrings.AddObject

Сообщение Сергей Смирнов » 29.05.2008 20:38:50

ИМХО, лучше сюда подглядеть:

Код: Выделить всё
procedure TStringStream.WriteString(const AString: string);
begin
  Write (PChar(Astring)[0],Length(AString));
end;
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Re: TStrings.Add vs TStrings.AddObject

Сообщение Troublemaker » 29.05.2008 20:48:40

Troublemaker писал(а):Pointer(S)^
Сергей Смирнов писал(а):PChar(Astring)[0]
Кажется, это одно и то же. Но - спасибо, пригодится.

Добавлено спустя 28 секунд:
Результаты - точно одинаковые
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TStrings.Add vs TStrings.AddObject

Сообщение *vmr » 29.05.2008 20:55:16

А еще можно
Код: Выделить всё
Write (Astring[1],Length(AString));

:lol: :lol: :lol:
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Re: TStrings.Add vs TStrings.AddObject

Сообщение Troublemaker » 29.05.2008 21:11:25

*vmr писал(а):А еще можно

Да, прокатило:
Код: Выделить всё
WriteBuffer(CBLModules.Items.Strings[i][1],Length(CBLModules.Items.Strings[i]))


Я ж чувствовал, что раз ansistring передается по ссылке, то должна быть пойнтером или чем-то в этом роде.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TStrings.Add vs TStrings.AddObject

Сообщение Vadim » 30.05.2008 05:17:46

Troublemaker писал(а):Что я не учел?

Если строка длиной не более 255 символов, то тип ShortString будет самое то, т.к. он, в отличие от AnsiString, не указатель. :)
Тогда Ваш код будет работать.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TStrings.Add vs TStrings.AddObject

Сообщение Troublemaker » 30.05.2008 08:12:00

Vadim писал(а):Если строка длиной не более 255 символов

Речь идет именно о TSTrings, которые есть TCheckListBox.Items со всеми вытекающими...
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: TStrings.Add vs TStrings.AddObject

Сообщение Vadim » 30.05.2008 10:11:38

Troublemaker писал(а):var ZhopA,PopA:string;
...
TempStream.Write(ZhopA,100);
...

Речь, как раз шла о string...
Вот если бы было написано:
Код: Выделить всё
TempStream.Write(TCheckListBox.Items[трали-вали],100);

тогда Ваше возражение было бы обосновано.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru