![]() |
| ||
|
|
Новости |
Поиск |
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 12:21:00) [21]Вот отсюда и пляши.
romeo (2004-07-01 12:17:00) [22]В он OnChange только делается включеной или выключенной кнопка с надписью 'Apply'. И все.
Reindeer Moss Eater (2004-07-01 12:17:00) [23]Что бы узнать почему не работает твоя программа, надо приводить код твоей программы, а не программы похожей на твою.
Smithson (2004-07-01 12:16:00) [24]Судя по симптомам, похоже, что TMemoryStream не пишеться в файл. Вот это и проверь под отладчиком.
Reindeer Moss Eater (2004-07-01 12:15:00) [25]Если бы не нажали на кнопку, переменная осталась бы = '', и в файл записалось бы ''. Обновление файла не происходит вообще.
Откуда мы про это можем знать имея только код поста №1?
{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 12:12:00) [26]Если с ручным вводом работает, а не с ручным нет, и все остальное одинаковое, то виноватым может быть только отсутствие OnChange в котором реализована какая-то логика.
romeo (2004-07-01 12:10:00) [27]
> Reindeer Moss Eater © (01.07.04 11:54) [22]
>
> Во первых, в кодах поста этого не видно.
> А во вторых, это значит, что кнопка эта никем не нажимается.
Блин! Вот ведь..
Если бы не нажали на кнопку, переменная осталась бы = '', и в файл записалось бы ''. Обновление файла не происходит вообще.
> Гаврила © (01.07.04 11:52) [21]
> ставь точку останова на момент записи в MemoryStream, и
> на момент записи в файл
Ставил, смотрел. Все проходит как надо, но файл не обновляется.
> Чудеса конечно бывают, но не в программах на Delphi
Сам фигею...
Reindeer Moss Eater (2004-07-01 11:55:00) [28]Чудеса конечно бывают, но не в программах на Delphi
Digitman (2004-07-01 11:54:00) [29]
> попадаем на этот BreakPoint
замечательно, попали на брейкойнт .. ну так и поехали дальше ? по F8 хотя бы ? что говорит результат трассировки с этого момента ?
Reindeer Moss Eater (2004-07-01 11:54:00) [30]Берeм пост № 1 и видим, что значение в переменную записывается
при нажатии на кнопку, т.е.
procedure TForm1.Button1Click(Sender: TObject)
begin
S := edPath.Text;
end;
Во первых, в кодах поста этого не видно.
А во вторых, это значит, что кнопка эта никем не нажимается.
Гаврила (2004-07-01 11:52:00) [31]ставь точку останова на момент записи в MemoryStream, и на момент записи в файл
romeo (2004-07-01 11:48:00) [32]Reindeer Moss Eater © (01.07.04 11:31) [19]
Берeм пост № 1 и видим, что значение в переменную записывается
при нажатии на кнопку, т.е.
procedure TForm1.Button1Click(Sender: TObject)
begin
S := edPath.Text;
end;
Далее. Запускаем отладчик. Ставим точку останова внутри OnChange, делаем
edPath.Text := ExtractFilePath(OPenDialog1.FileName);
попадаем на этот BreakPoint. Опять вы неправы.
Reindeer Moss Eater (2004-07-01 11:31:00) [33]Берем пост № 1.
Видим, что в первом куске кода фигурирует edPath.Text, а во втором переменная S.
Догадываемся, что инициализация S повешена на OnChange у edPath.
Анализируем симптомы странного поведения программы и вспоминаем, что OnChange не генерируется при edPath.Text := ExtractFilePath(OPenDialog1.FileName);
Digitman (2004-07-01 11:26:00) [34]
> Гаврила © (30.06.04 21:49) [16]
ник-то автору [11] не я выбирал, заметь
romeo (2004-07-01 11:22:00) [35]
> Гаврила © (30.06.04 21:49) [16]
Ох, проходил я весь этот код в отладчике раз ..дцать.
Ничего подозрительного не видел ниразу.
> Поскольку эта ситуация посторяема на 100 процентов, нет
> ничего проще, чем понять ее причину.
Если мыслить логически, то утверждение верно. Но что-то не срастается. Говорил ведь: если не верится, могу выслать исходники. Там не много.
Гаврила (2004-06-30 21:49:00) [36]автору ветки
1. код чтения\записи правильный .следовательно дело не в этом.
2. Следовательно, дело в том куске кода. который ты тут не привел.
3. Поскольку мы имеем пункт 1, и не имеем записи в файл, то следовательно, возможны две причины.
3.1 не вызывается процедура записи строки в MemoryStream
3.2 не вызывается процедура записи MemoryStream в файл.
Отсюда вывод - ошибка кроется в логике программы. Например, что-то происходит на событие нажатия клавиши в Edit1, и не происходит при программном присвоении значения Edit1.text.
Поскольку эта ситуация посторяема на 100 процентов, нет ничего проще, чем понять ее причину. Для этого существует интегрированный в IDE отладчик. Ставим точку останова на событии нажатия кнопки, и идем по щагам.
>>Digitman © (30.06.04 17:55) [12]
Для данного случая - явный перебор с раздачей направо и налево LMD. Даже не ИМХО
lamer (2004-06-30 18:05:00) [37]
> > пока жить хочу
>
>
> жить хочешь ? не задавай дурацких вопросов "что за integer"
> - проживешь еще сто лет
ступил, я сначала принял за переменую... бывает
Digitman (2004-06-30 18:04:00) [38]
> пока жить хочу
жить хочешь ? не задавай дурацких вопросов "что за integer" - проживешь еще сто лет
lamer (2004-06-30 18:01:00) [39]Да все ламеры, просто в разной степени и если смотреть с разных точек зрения, и я пока жить хочу :)
Digitman (2004-06-30 17:55:00) [40]
> lamer (30.06.04 17:51) [11]
> SizeOf(Integer)-это что за integer?
LMD