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 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


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

Наверх

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