Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Творится какая-то странная хренотень с записью строки в поток. [D5, WinXP]


Страницы:   1 2 3

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо