![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Творится какая-то странная хренотень с записью строки в поток. [D5, WinXP]
romeo © (2004-06-30 16:37:00)Вкратце такие дела: есть TEdit (содержит путь к файлу), по нажатию кнопки его ".Text" записывается в переменную S: String, которая затем записывается в TMemoryStream, а оттуда все переписывается в файл и прога закрывается. При очередном открытии проги делаем обратную операцию и получаем считанное из файла значение переменной в наш TEdit. До тех пор как значение в TEdit заносится ручками (или копируется из текстового редактора и т.п.) все фунциклирует замечательно в обе стороны.
НО!!!!!!!
Стоит только попытаться упростить себе жисть следующим способом:
if OPenDialog1.Execute
then edPath.Text := ExtractFilePath(OPenDialog1.FileName);
и попытать проделать уже описаную выше процедуру, то начинается та самая хренотень. А именно: программа завершается как надо, без каких либо ошибок, но при повторном открытии из файла считывается старое значение (как показало вскрытие - вообще не происходит записи в файл), хотя даже при пошаговом выполнении все переменные в этом куске
{I - Integer, MS - TMemoryStream, S - String}
begin
I := Length(S);
MS.Write(I, SizeOf(Integer));
Write(S[1], I);
end;
имеют правильные значения.
Если набирать тот же путь к файлу ручками - все фунциклирует.
Что за полтергейст и как с ним бороться?
Reindeer Moss Eater (2004-07-01 13:48:00) [1]Мышлаевский конечно же.
Reindeer Moss Eater (2004-07-01 13:47:00) [2]"Достигается тренировкой" /Поручик Мышлаевсий/
Гаврила (2004-07-01 13:46:00) [3]>>Reindeer Moss Eater ©
Экстрасенс, однако :-)
romeo (2004-07-01 13:33:00) [4]
> Reindeer Moss Eater © (01.07.04 12:55) [43]
Понял, спасибо, все заработало.
Reindeer Moss Eater (2004-07-01 13:00:00) [5]> Сохранияю просто: MS.SaveToFile('MyFile.Ext'),
После этого :
ShowMessage('Ищи записанные изменения в файле ' + ExpandFileName('MyFile.Ext'));
Digitman (2004-07-01 12:56:00) [6]
> romeo (01.07.04 12:51) [39]
> Сохранияю просто: MS.SaveToFile('MyFile.Ext'),
опять же - отладчик !!
брейкпойнт на строку MS.SaveToFile(), ловишь, смотришь куда кажет MS.Memory, что там в реальности по этому адресу
Reindeer Moss Eater (2004-07-01 12:56:00) [7]Разумеется вызывается.
Теперь верю.
romeo (2004-07-01 12:55:00) [8]I>
> Reindeer Moss Eater © (01.07.04 12:49) [38]
Вызвается, проверял в отладчике...
Reindeer Moss Eater (2004-07-01 12:55:00) [9]Комбинация из невзведенной опции "nochangedir", текущий каталог процесса и относительное имя файла, а так же вера в чудеса.
Тимохов (2004-07-01 12:53:00) [10]
> Digitman © (01.07.04 12:52) [40]
а был ли мальчик?
Reindeer Moss Eater (2004-07-01 12:53:00) [11]Все понял.
Он смотрит изменения НЕ В ТОМ ФАЙЛЕ в который пишет.
Digitman (2004-07-01 12:52:00) [12]
> Reindeer Moss Eater © (01.07.04 12:48) [37]
приведенные огрызки (иначе не скажешь !) кода вряд ли прояснят ситуацию ... автор упирается и не желает привести ПОЛНЫЙ код
romeo (2004-07-01 12:51:00) [13]
> Digitman © (01.07.04 12:44) [36]
В 'S' - то, что нужно.
Сохранияю просто: MS.SaveToFile('MyFile.Ext'), ничего кривого нет. Если было бы криво, то не работало бы вообще, а не через раз, имхо.
Reindeer Moss Eater (2004-07-01 12:49:00) [14]Если бы не нажали на кнопку, переменная осталась бы = '', и в файл записалось бы ''. Обновление файла не происходит вообще.
У него правильный кусок кода со словами Write вообще не вызывается.
Reindeer Moss Eater (2004-07-01 12:48:00) [15]Он утверждает, что в файл не просто пишется пустая строка, он утверждает что и пустая строка в файл не пишется если в едит руками не трогали.
Digitman (2004-07-01 12:44:00) [16]
> romeo (01.07.04 12:27) [33]
> если текстовое поле, окуда бралось значение для S заполнялось
> вручную, то все нормально, а если при помощи OpenDialog'a
> - хрень.
что значит "хрень" ? в S "хрень" ? в файле "хрень" ?
та самая "хрень", что имеется в S на момент ПЕРЕД I := Length(S), прямиком и без искажений попадает в стрим, судя по коду... и откуда она там в S взялась - разбирайся... уж явно не в этом коде проблема... а если в S не "хрень", а то что нужно, но при этом содержимое файла не соответствует ожидаемому, значит, ты сформированный стрим как-то криво в файл сохраняешь
romeo (2004-07-01 12:44:00) [17]
> wisekaa © (01.07.04 12:23) [32]
Выслал
Reindeer Moss Eater (2004-07-01 12:31:00) [18]Повторюсь: в этом месте
I := Length(S);
MS.Write(I, SizeOf(Integer));
MS.Write(S[1], I);
Откуда и кем вызывается этот код?
Он вызывается если edit руками не трогали?
MS валидный объект?
romeo (2004-07-01 12:27:00) [19]Дело не в интерфейсе и обработке событий.
Повторюсь: в этом месте
I := Length(S);
MS.Write(I, SizeOf(Integer));
MS.Write(S[1], I);
при отладке видно, что S = 'C:\Мои документы\... и т.д.'
И если текстовое поле, окуда бралось значение для S заполнялось вручную, то все нормально, а если при помощи OpenDialog'a - хрень.
wisekaa (2004-07-01 12:23:00) [20]ДА без кода разобраться тяжело, если можешь вышли свой пример на wisekaapost@mail.ru