Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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]


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



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

Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.034 c
3-1087992836
Vit
2004-06-23 16:13
2004.07.18
Программное изменение типа поля из Alpha в Int


4-1086538728
^GENTLY^
2004-06-06 20:18
2004.07.18
Вопрос по SetWindowLong(FindWindow(nil,Pchar(ListBox1.Items[listb


3-1087896834
stas
2004-06-22 13:33
2004.07.18
AdoConnection и процессы на сервере


1-1089064918
PoweR
2004-07-06 02:01
2004.07.18
установка компонент


1-1089064657
CyberSpy
2004-07-06 01:57
2004.07.18
Перемещение в Treeview





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский