Lazarus 2.0.10 + FPC 3.2 TSTrings.SaveToStream

Вопросы программирования и использования среды Lazarus.

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

Ответить
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Lazarus 2.0.10 + FPC 3.2 TSTrings.SaveToStream

Сообщение *Rik* »

Поставил Lazarus 2.0.10 + FPC 3.2 версия 64351M на Linux (ставил через fpcdelux как стабильную) и версия 63526 на Windows ставил инсталлятором с официальной раздачи на SourceForge.
Собрал свои проекты и обнаружил что все вызовы procedure TSTrings.SaveToStream(S: TStream) приводят к AccessViolation
Сам TSTrings.SaveToStream(S: TStream) вызывает procedure TStrings.SaveToStream(Stream: TStream; IgnoreEncoding: Boolean); Где IgnoreEncoding передается как False, Если IgnoreEncoding заменить на True то всё работает.
То же самое с TSTring.LoadFromFile.

Чё ито? Кто то столкнулся ещё с этим?
Мне надо принять какое то решение, то ли на предыдущем Lazarus и FPC оставаться, то ли как то бороться с этим.
Awkward
новенький
Сообщения: 53
Зарегистрирован: 18.01.2017 23:06:47

Сообщение Awkward »

Ну, для начала, я б посоветовал не использовать TStrings метод напрямую, а только через TStringList. Во-вторых, если считаете это ошибкой, пишите багрепорт.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

TStrings же никогда нельзя было напрямую использовать?
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

На самом деле используется TStringList, при этом попытался создать тестовый проект новый, самый простетский, в нем всё работает, а в старом большом проекте такая вот фигня, при чем в предыдущей версии Lazarus и FPC, вообще ни каких проблем. проблема началась с перехода на FPC 3.2 и Lazarus 2.0.10.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Это бага в программе. Дебажиш, выясняеш где падает и почему. Емнип чтоб подебажить внутри TStringList - надо собрать fpc с отладочной инфой.
хрустальные шары мне шепчут что ты гдето установил для своего TSTrings Encoding или DefaultEncoding, потом убил их и пытаешся читатьписать убитым EncodingDefaultEncoding

Добавлено спустя 4 минуты 19 секунд:
>>Мне надо принять какое то решение, то ли на предыдущем Lazarus и FPC оставаться, то ли как то бороться с этим.
Что тут принимать, конечно переходишь на актуальную версию, правишь вскрывшиеся баги и адаптируешь под новые реалии
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

zub писал(а):Это бага в программе. Дебажиш, выясняеш где падает и почему. Емнип чтоб подебажить внутри TStringList - надо собрать fpc с отладочной инфой.
хрустальные шары мне шепчут что ты гдето установил для своего TSTrings Encoding или DefaultEncoding, потом убил их и пытаешся читатьписать убитым EncodingDefaultEncoding

Добавлено спустя 4 минуты 19 секунд:
>>Мне надо принять какое то решение, то ли на предыдущем Lazarus и FPC оставаться, то ли как то бороться с этим.
Что тут принимать, конечно переходишь на актуальную версию, правишь вскрывшиеся баги и адаптируешь под новые реалии

Проблема в DefaultEncoding, я его точно ни где не убивал, вообще только сейчас узнал что такое свойство появилось. Оно почему то = nil, если его указать явно, все работает. По какой то причине оно изначально не создается именно в большом старом проекте. Все вызовы TSTring.SaveToStream, TStrings.LoadFromStream, везде, включая все сторонние компоненты приводят к AV.

Код: Выделить всё

var
  SL: TStringList;
  F: TFileStream;
begin
  SL := TStringList.Create;
  if SL.DefaultEncoding = nil then
  begin
     ShowMessage('nil');
     SL.DefaultEncoding = SL.Encoding.UTF8;
  end;
 
  F := TFileStream.Create(GetUserDir + DirectorySeparator + 'test.txt', fmCreate);
  try
    SL.Add('ыаыаыа);
    SL.SaveToStream(F);
  finally
    SL.Free;
    F.Free;
  end;
end


Добавлено спустя 1 час 57 минут 19 секунд:
Переустановил всё по новой, почистил лишние файлы, проблема пропала. Походу глюк был...
Ответить