Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Творится какая-то странная хренотень с записью строки в поток.   Найти похожие ветки 

 
romeo   (2004-06-30 16:37) [0]

Вкратце такие дела: есть 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;


имеют правильные значения.
Если набирать тот же путь к файлу ручками - все фунциклирует.
Что за полтергейст и как с ним бороться?


 
Гаврила ©   (2004-06-30 16:44) [1]

А неужели сложно пройти отладчиком, и посмотреть, почему в файл ничего не пишется ?


 
romeo   (2004-06-30 16:46) [2]

I>
> Гаврила ©   (30.06.04 16:44) [1]

Извините, куда пройти?<


 
Юрий Зотов ©   (2004-06-30 16:49) [3]

1. Зачем такая сложная многоступенчатая запись, если можно просто писать строку прямо в файл?
2. Вероятно, MS.Write, а не просто Write.
3. Код чтения покажите, плз. Там есть SetLength?


 
romeo   (2004-06-30 16:56) [4]


> Юрий Зотов ©   (30.06.04 16:49) [3]

Там вес есть :-)
Я же говорю, что разница только в том, как данные попадают в TEdit - ручками или как результат результат

if OPenDialog1.Execute
then edPath.Text := ExtractFilePath(OPenDialog1.FileName);


А... Ладно вот код чтения:
var
I: Integer;
begin
   MS.Read(I, SizeOf(Integer));
   SetLength(S, I);
   Read(S[1], I);
end;


 
Digitman ©   (2004-06-30 16:57) [5]

MS.Write(I, SizeOf(Integer));
  MS.Write(S[1], I);


 
Digitman ©   (2004-06-30 16:59) [6]

MS.Read(I, SizeOf(Integer));
  SetLength(S, I);
  MS.Read(S[1], I);

мда уж ... намек - в пустоту .. горбатого, как знаем, могила исправит


 
romeo   (2004-06-30 16:59) [7]


> Digitman ©   (30.06.04 16:57) [5]

Блин, опечатка это! Естественно MS.Write(S[1], I);

Спешу, понимаете-ли...


 
Digitman ©   (2004-06-30 17:05) [8]

знать ничего не знаю
ЭТО работает и будет работать во веки веков

var i: Integer
   s: string;
..
 s := "Что-то там";
..

 showmessage("Перед записью : " + s);
 MS.WriteBuffer(I, SizeOf(Integer));
 MS.WriteBuffer(S[1], I);

..
 MS.Position := 0;
..

 MS.ReadBuffer(I, SizeOf(Integer));
 SetLength(S, I);
 MS.ReadBuffer(S[1], I);
 showmessage("После чтения : " + s);


 
romeo   (2004-06-30 17:15) [9]

Есть одно "но":

var i: Integer
  s: string;
..
s := "Что-то там";
..

showmessage("Перед записью : " + s);
MS.WriteBuffer(I, SizeOf(Integer));
MS.WriteBuffer(S[1], I);

..
 MS.SaveToFile("MyFile.ext");
 MS.Free;
..
 MS := TMemoryStream.Create;
 MS.LoadFromFile("MyFile.ext");


..
MS.Position := 0;
..

MS.ReadBuffer(I, SizeOf(Integer));
SetLength(S, I);
MS.ReadBuffer(S[1], I);
showmessage("После чтения : " + s);

Я же ведь говорю: если меняем текст в TEdit ручками - все работат как надо. Если заполняем программно при помощи OpenDialod"a - не фурычит. Кто не верит - могу выслать исходники.


 
Digitman ©   (2004-06-30 17:30) [10]

меня твой TEdit совершенно не парит
мой пример - 100%-но работающий
думай головой, как его присобачить к своему TEdit


 
lamer   (2004-06-30 17:51) [11]

MS.WriteBuffer(I, SizeOf(Integer));
SizeOf(Integer)-это что за integer?


 
Digitman ©   (2004-06-30 17:55) [12]


> lamer   (30.06.04 17:51) [11]


> SizeOf(Integer)-это что за integer?


LMD


 
lamer   (2004-06-30 18:01) [13]

Да все ламеры, просто в разной степени и если смотреть с разных точек зрения, и я пока жить хочу :)


 
Digitman ©   (2004-06-30 18:04) [14]


> пока жить хочу


жить хочешь ? не задавай дурацких вопросов "что за integer" - проживешь еще сто лет


 
lamer   (2004-06-30 18:05) [15]


> > пока жить хочу
>
>
> жить хочешь ? не задавай дурацких вопросов "что за integer"
> - проживешь еще сто лет

ступил, я сначала принял за переменую... бывает


 
Гаврила ©   (2004-06-30 21:49) [16]

автору ветки

1. код чтения\записи правильный .следовательно дело не в этом.
2. Следовательно, дело в том куске кода. который ты тут не привел.
3. Поскольку мы имеем пункт 1, и не имеем записи в файл, то следовательно, возможны две причины.
3.1 не вызывается процедура записи строки в MemoryStream
3.2 не вызывается процедура записи MemoryStream в файл.

Отсюда вывод - ошибка кроется в логике программы. Например, что-то происходит на событие нажатия клавиши в Edit1, и не происходит при программном присвоении значения Edit1.text.
Поскольку эта ситуация посторяема на 100 процентов, нет ничего проще, чем понять ее причину. Для этого существует интегрированный в IDE отладчик. Ставим точку останова на событии нажатия кнопки, и идем по щагам.

>>Digitman ©   (30.06.04 17:55) [12]
Для данного случая - явный перебор с раздачей направо и налево LMD. Даже не ИМХО


 
romeo   (2004-07-01 11:22) [17]


> Гаврила ©   (30.06.04 21:49) [16]

Ох, проходил я весь этот код в отладчике раз ..дцать.
Ничего подозрительного не видел ниразу.

> Поскольку эта ситуация посторяема на 100 процентов, нет
> ничего проще, чем понять ее причину.

Если мыслить логически, то утверждение верно. Но что-то не срастается. Говорил ведь: если не верится, могу выслать исходники. Там не много.


 
Digitman ©   (2004-07-01 11:26) [18]


> Гаврила ©   (30.06.04 21:49) [16]


ник-то автору [11] не я выбирал, заметь


 
Reindeer Moss Eater ©   (2004-07-01 11:31) [19]

Берем пост № 1.

Видим, что в первом куске кода фигурирует edPath.Text, а во втором переменная S.

Догадываемся, что инициализация S повешена на OnChange у edPath.

Анализируем симптомы странного поведения программы и вспоминаем, что OnChange не генерируется при edPath.Text := ExtractFilePath(OPenDialog1.FileName);


 
romeo   (2004-07-01 11:48) [20]

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. Опять вы неправы.


 
Гаврила ©   (2004-07-01 11:52) [21]

ставь точку останова на момент записи в MemoryStream, и на момент записи в файл


 
Reindeer Moss Eater ©   (2004-07-01 11:54) [22]

Берeм пост № 1 и видим, что значение в переменную записывается
при нажатии на кнопку, т.е.

procedure TForm1.Button1Click(Sender: TObject)
begin
  S := edPath.Text;
end;


Во первых, в кодах поста этого не видно.
А во вторых, это значит, что кнопка эта никем не нажимается.


 
Digitman ©   (2004-07-01 11:54) [23]


> попадаем на этот BreakPoint


замечательно, попали на брейкойнт .. ну так и поехали дальше ? по F8 хотя бы ? что говорит результат трассировки с этого момента ?


 
Reindeer Moss Eater ©   (2004-07-01 11:55) [24]

Чудеса конечно бывают, но не в программах на Delphi


 
romeo   (2004-07-01 12:10) [25]


> Reindeer Moss Eater ©   (01.07.04 11:54) [22]
>  
> Во первых, в кодах поста этого не видно.
> А во вторых, это значит, что кнопка эта никем не нажимается.

Блин! Вот ведь..
Если бы не нажали на кнопку, переменная осталась бы = "", и в файл записалось бы "". Обновление файла не происходит вообще.

> Гаврила ©   (01.07.04 11:52) [21]
> ставь точку останова на момент записи в MemoryStream, и
> на момент записи в файл

Ставил, смотрел. Все проходит как надо, но файл не обновляется.


> Чудеса конечно бывают, но не в программах на Delphi

Сам фигею...


 
Reindeer Moss Eater ©   (2004-07-01 12:12) [26]

Если с ручным вводом работает, а не с ручным нет, и все остальное одинаковое, то виноватым может быть только отсутствие OnChange в котором реализована какая-то логика.


 
Reindeer Moss Eater ©   (2004-07-01 12:15) [27]

Если бы не нажали на кнопку, переменная осталась бы = "", и в файл записалось бы "". Обновление файла не происходит вообще.

Откуда мы про это можем знать имея только код поста №1?

{I - Integer, MS - TMemoryStream, S - String}
begin
  I := Length(S);
  MS.Write(I, SizeOf(Integer));
  Write(S[1], I);
end;


Это вообще откуда вызывается?  По мановению волшебной палочки?


 
Smithson ©   (2004-07-01 12:16) [28]

Судя по симптомам, похоже, что TMemoryStream не пишеться в файл. Вот это и проверь под отладчиком.


 
Reindeer Moss Eater ©   (2004-07-01 12:17) [29]

Что бы узнать почему не работает твоя программа, надо приводить код твоей программы, а не программы похожей на твою.


 
romeo   (2004-07-01 12:17) [30]

В он OnChange только делается включеной или выключенной кнопка с надписью "Apply". И все.


 
Reindeer Moss Eater ©   (2004-07-01 12:21) [31]

Вот отсюда и пляши.


 
wisekaa ©   (2004-07-01 12:23) [32]

ДА без кода разобраться тяжело, если можешь вышли свой пример на wisekaapost@mail.ru


 
romeo   (2004-07-01 12:27) [33]

Дело не в интерфейсе и обработке событий.

Повторюсь: в этом месте
I := Length(S);
  MS.Write(I, SizeOf(Integer));
  MS.Write(S[1], I);


при отладке видно, что S = "C:\Мои документы\... и т.д."
И если текстовое поле, окуда бралось значение для S заполнялось вручную, то все нормально, а если при помощи OpenDialog"a - хрень.


 
Reindeer Moss Eater ©   (2004-07-01 12:31) [34]

Повторюсь: в этом месте
I := Length(S);
 MS.Write(I, SizeOf(Integer));
 MS.Write(S[1], I);


Откуда и кем вызывается этот код?
Он вызывается если edit руками не трогали?
MS валидный объект?


 
romeo   (2004-07-01 12:44) [35]


> wisekaa ©   (01.07.04 12:23) [32]


Выслал


 
Digitman ©   (2004-07-01 12:44) [36]


> romeo   (01.07.04 12:27) [33]


> если текстовое поле, окуда бралось значение для S заполнялось
> вручную, то все нормально, а если при помощи OpenDialog"a
> - хрень.


что значит "хрень" ? в S "хрень" ? в файле "хрень" ?

та самая "хрень", что имеется в S на момент ПЕРЕД I := Length(S), прямиком и без искажений попадает в стрим, судя по коду... и откуда она там в S взялась - разбирайся... уж явно не в этом коде проблема... а если в S не "хрень", а то что нужно, но при  этом содержимое файла не соответствует ожидаемому, значит, ты сформированный стрим как-то криво в файл сохраняешь


 
Reindeer Moss Eater ©   (2004-07-01 12:48) [37]

Он утверждает, что в файл не просто пишется пустая строка, он утверждает что и пустая строка в файл не пишется если в едит руками не трогали.


 
Reindeer Moss Eater ©   (2004-07-01 12:49) [38]

Если бы не нажали на кнопку, переменная осталась бы = "", и в файл записалось бы "". Обновление файла не происходит вообще.

У него правильный кусок кода со словами Write вообще не вызывается.


 
romeo   (2004-07-01 12:51) [39]


> Digitman ©   (01.07.04 12:44) [36]

В "S" - то, что нужно.

Сохранияю просто: MS.SaveToFile("MyFile.Ext"), ничего кривого нет. Если было бы криво, то не работало бы вообще, а не через раз, имхо.


 
Digitman ©   (2004-07-01 12:52) [40]


> Reindeer Moss Eater ©   (01.07.04 12:48) [37]


приведенные огрызки (иначе не скажешь !) кода вряд ли прояснят ситуацию ... автор упирается и не желает привести ПОЛНЫЙ код



Страницы: 1 2 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.025 c
1-1088940701
zep
2004-07-04 15:31
2004.07.18
stringgrid


6-1084894484
Slider
2004-05-18 19:34
2004.07.18
Закрытие порта


1-1088859580
BBoost
2004-07-03 16:59
2004.07.18
После запятой...


1-1089051854
xman
2004-07-05 22:24
2004.07.18
memo или richedit


1-1088697879
ancara
2004-07-01 20:04
2004.07.18
Как бинарный файл в ресурсы засунуть?