![]() |
| ||
|
|
Новости |
Поиск |
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;
имеют правильные значения.
Если набирать тот же путь к файлу ручками - все фунциклирует.
Что за полтергейст и как с ним бороться?
lamer (2004-06-30 17:51:00) [41]
MS.WriteBuffer(I, SizeOf(Integer));
SizeOf(Integer)-это что за integer?
Digitman (2004-06-30 17:30:00) [42]меня твой TEdit совершенно не парит
мой пример - 100%-но работающий
думай головой, как его присобачить к своему TEdit
romeo (2004-06-30 17:15:00) [43]Есть одно "но":
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:05:00) [44]знать ничего не знаю
ЭТО работает и будет работать во веки веков
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 16:59:00) [45]
> Digitman © (30.06.04 16:57) [5]
Блин, опечатка это! Естественно MS.Write(S[1], I);
Спешу, понимаете-ли...
Digitman (2004-06-30 16:59:00) [46]MS.Read(I, SizeOf(Integer));
SetLength(S, I);
MS.Read(S[1], I);
мда уж ... намек - в пустоту .. горбатого, как знаем, могила исправит
Digitman (2004-06-30 16:57:00) [47]MS.Write(I, SizeOf(Integer));
MS.Write(S[1], I);
romeo (2004-06-30 16:56:00) [48]
> Юрий Зотов © (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;
Юрий Зотов (2004-06-30 16:49:00) [49]1. Зачем такая сложная многоступенчатая запись, если можно просто писать строку прямо в файл?
2. Вероятно, MS.Write, а не просто Write.
3. Код чтения покажите, плз. Там есть SetLength?
romeo (2004-06-30 16:46:00) [50]I>
> Гаврила © (30.06.04 16:44) [1]
Извините, куда пройти?<
Гаврила (2004-06-30 16:44:00) [51]А неужели сложно пройти отладчиком, и посмотреть, почему в файл ничего не пишется ?