Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
ВнизТворится какая-то странная хренотень с записью строки в поток. Найти похожие ветки
← →
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]
приведенные огрызки (иначе не скажешь !) кода вряд ли прояснят ситуацию ... автор упирается и не желает привести ПОЛНЫЙ код
← →
Reindeer Moss Eater © (2004-07-01 12:53) [41]Все понял.
Он смотрит изменения НЕ В ТОМ ФАЙЛЕ в который пишет.
← →
Тимохов © (2004-07-01 12:53) [42]
> Digitman © (01.07.04 12:52) [40]
а был ли мальчик?
← →
Reindeer Moss Eater © (2004-07-01 12:55) [43]Комбинация из невзведенной опции "nochangedir", текущий каталог процесса и относительное имя файла, а так же вера в чудеса.
← →
romeo (2004-07-01 12:55) [44]I>
> Reindeer Moss Eater © (01.07.04 12:49) [38]
Вызвается, проверял в отладчике...
← →
Reindeer Moss Eater © (2004-07-01 12:56) [45]Разумеется вызывается.
Теперь верю.
← →
Digitman © (2004-07-01 12:56) [46]
> romeo (01.07.04 12:51) [39]
> Сохранияю просто: MS.SaveToFile("MyFile.Ext"),
опять же - отладчик !!
брейкпойнт на строку MS.SaveToFile(), ловишь, смотришь куда кажет MS.Memory, что там в реальности по этому адресу
← →
Reindeer Moss Eater © (2004-07-01 13:00) [47]> Сохранияю просто: MS.SaveToFile("MyFile.Ext"),
После этого :
ShowMessage("Ищи записанные изменения в файле " + ExpandFileName("MyFile.Ext"));
← →
romeo (2004-07-01 13:33) [48]
> Reindeer Moss Eater © (01.07.04 12:55) [43]
Понял, спасибо, все заработало.
← →
Гаврила © (2004-07-01 13:46) [49]>>Reindeer Moss Eater ©
Экстрасенс, однако :-)
← →
Reindeer Moss Eater © (2004-07-01 13:47) [50]"Достигается тренировкой" /Поручик Мышлаевсий/
← →
Reindeer Moss Eater © (2004-07-01 13:48) [51]Мышлаевский конечно же.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.035 c