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

Вниз

Ошибка I/O error 102. Что за ошибка и как убрать?   Найти похожие ветки 

 
Guitar ©   (2004-12-24 21:09) [0]

Я использую компонент SaveDialog1 для сохранения набора данных из ADOQuery1. Когда выполняется SaveDialog1.Execute то появляется стандартный диалог с пользователем. И если нажать "Отмена" то появляется это ошика. Что это значит и как её обработать?


 
olookin ©   (2004-12-24 21:15) [1]

Полагаю, что где-то в обработчике сохранения в файл есть что-то подобное:

 if SaveDialog1.Execute then begin
   AssignFile(f,SaveDialog1.FileName);
   ...
   ...
 end else showmessage("Aborted");
 CloseFile(f);

Ну вы понимаете, да?


 
begin...end ©   (2004-12-24 21:15) [2]

> Guitar ©   (24.12.04 21:09)

См. I/O errors в справке Delphi.


 
VMcL ©   (2004-12-24 21:16) [3]

>>Guitar ©  (24.12.04 21:09)

>Что это значит

>* 102
* File not assigned
* Reported by Reset, Rewrite, Append, Rename, or Eraseif the file variable has not been assigned a name through a call to Assign or AssignFile.


>как её обработать?

Для начала поискать ошибку в своей программе.


 
olookin ©   (2004-12-24 21:23) [4]

[3] VMcL ©   (24.12.04 21:16)
* File not assigned
* Reported by Reset, Rewrite, Append, Rename, or Eraseif the file variable has not been assigned a name through a call to Assign or AssignFile.

Вот опять я ошибся...


 
Guitar ©   (2004-12-24 21:29) [5]

4 olookin ©   (24.12.04 21:15) [1]

Да именненно такой код и есть.
Дело в нём?


 
Guitar ©   (2004-12-24 21:31) [6]

В своей программе ошибку я искал и ищу. Не нашёл. (((


 
begin...end ©   (2004-12-24 21:36) [7]

> [6] Guitar ©   (24.12.04 21:31)

А всё-таки покажите СВОЙ код.


 
olookin ©   (2004-12-24 21:42) [8]

Но ведь если судить по моему приблизительному примеру и по [3], то я неправ в корне - 102 не возникает при использовании CloseFile?


 
Guitar ©   (2004-12-24 21:55) [9]

procedure TForm1.Button6Click(Sender: TObject);
var
fname,Str :string;
f: textfile;
i: integer;
begin
fname:=edit6.text;
savedialog1.filename:=fname;
if SaveDialog1.Execute then begin
AssignFile(f,SaveDialog1.FileName);
 try
 ADOQuery1.First;
  except
 messagedlg("Ошибка", mtinformation, [mbok], 0);
 exit;
end;

Rewrite(f);
while not ADOQuery1.eof do
 begin
    Str:="";
    for i:=0 to ADOQuery1.FieldCount-1 do
      Str:=Str+"|"+ADOQuery1.Fields[i].AsString;
    WriteLn(f,Str);
    ADOQuery1.Next;
 end;
end else showmessage("Отменено");
CloseFile(f);
end;


 
olookin ©   (2004-12-24 21:57) [10]

procedure TForm1.Button6Click(Sender: TObject);
var
fname,Str :string;
f: textfile;
i: integer;
begin
fname:=edit6.text;
savedialog1.filename:=fname;
if SaveDialog1.Execute then begin
AssignFile(f,SaveDialog1.FileName);
try
ADOQuery1.First;
 except
messagedlg("Ошибка", mtinformation, [mbok], 0);
exit;
end;

Rewrite(f);
while not ADOQuery1.eof do
begin
   Str:="";
   for i:=0 to ADOQuery1.FieldCount-1 do
     Str:=Str+"|"+ADOQuery1.Fields[i].AsString;
   WriteLn(f,Str);
   ADOQuery1.Next;
end;
end else showmessage("Отменено");
CloseFile(f);
end;

Я правильно понимаю, что в случае ошибки происходит выход из процедуры? А при этом файл уже открыт, но не закрыт...


 
aus   (2004-12-24 22:03) [11]

Assign() у тебя выполняется только если Execute, а CloseFile - в любом случае. Так вот при отмене в диалоговом окне Assign не выполняется, но файл закрыть ты пытаешься в конце процедуры. Отсюда ошибка.


 
begin...end ©   (2004-12-24 22:04) [12]

> [9] Guitar ©   (24.12.04 21:55)

Ну вот видите, как просто. Если Вы нажимаете в диалоге кнопку "Отмена", то SaveDialog1.Execute возвращает False. Файловая переменная f не связывается с маршрутом доступа к файлу. И происходит выполнение строки Rewrite(f). КАКОЙ файл прикажете открывать для записи?


 
olookin ©   (2004-12-24 22:05) [13]

[11] aus   (24.12.04 22:03)

Точно!


 
Guitar ©   (2004-12-24 22:08) [14]

Я изменил. Но ничего не получилось.

procedure TForm1.Button6Click(Sender: TObject);
var
fname,Str :string;
f: textfile;
i: integer;
begin
fname:=edit6.text;
savedialog1.filename:=fname;
if SaveDialog1.Execute then begin
AssignFile(f,SaveDialog1.FileName);
 try
 ADOQuery1.First;
  except
 messagedlg("Îøèáêà", mtinformation, [mbok], 0);
 CloseFile(f);
 exit;

end;

Rewrite(f);
while not ADOQuery1.eof do
 begin
    Str:="";
    for i:=0 to ADOQuery1.FieldCount-1 do
      Str:=Str+"|"+ADOQuery1.Fields[i].AsString;
    WriteLn(f,Str);
    ADOQuery1.Next;
 end;
end else showmessage("Îòìåíåíî");
CloseFile(f);
end;


 
olookin ©   (2004-12-24 22:09) [15]

[14] Guitar ©   (24.12.04 22:08)

Но последний CloseFile тоже надо убрать....


 
begin...end ©   (2004-12-24 22:11) [16]

> [14] Guitar ©   (24.12.04 22:08)

Конечно, ничего не изменилось. А что должно было измениться-то? Ситуация, которую я описал в [12], осталась. Вы по-прежнему пытаетесь открыть для записи файл, с которым не связан путь с помощью AssignFile.


 
Guitar ©   (2004-12-24 22:11) [17]

[11] aus   (24.12.04 22:03)

Вы ПРАВЫ!!!

Тема закрыта.


 
Guitar ©   (2004-12-24 22:14) [18]

А нет не прошло, сейчас по другой причине вылазит.

4 begin...end ©   (24.12.04 22:11) [16]

Сейчас попробую исправить.


 
begin...end ©   (2004-12-24 22:21) [19]

> Guitar

Приношу извинения. В [12] и [16] я НЕ ПРАВ. Ошибка в чём-то другом.
Запутался в end"ах.
Ещё раз - извините.


 
olookin ©   (2004-12-24 22:25) [20]

Э... А если exception не срабатывет, то все остальное работает отлично, да?


 
Guitar ©   (2004-12-24 22:27) [21]

КОроче я сам запутался. )))))))))ХА ХА)))
Буду искать.   )))


 
olookin ©   (2004-12-24 22:28) [22]

Но хотя бы отладчик где отсанавливается?


 
Zeqfreed ©   (2004-12-24 22:36) [23]

Так должно работать:

procedure TForm1.Button6Click(Sender: TObject);
var
fname, Str : string;
f : TextFile;
i : Integer;
begin
fname := edit6.text;
SaveDialog1.Filename := fname;

if SaveDialog1.Execute then begin
 AssignFile(f, SaveDialog1.FileName);

 try
  ADOQuery1.First;
 except
  messagedlg("Error?", mtinformation, [mbok], 0);
  CloseFile(f);
  Exit;
 end;

 Rewrite(f);

 while not ADOQuery1.EOF do begin
  Str := "";

  for i := 0 to ADOQuery1.FieldCount - 1 do begin
   Str := Str + "|" + ADOQuery1.Fields[i].AsString;
   WriteLn(f, Str);
   ADOQuery1.Next;
  end;
 end;

 CloseFile(f);
end else showmessage("Cancel");
end;


 
Guitar ©   (2004-12-24 22:36) [24]

Вот такой вопрос. Это я плохо поимаю. В коде
try
ADOQuery1.First;
 except
messagedlg("Îøèáêà", mtinformation, [mbok], 0);
CloseFile(f);
exit;
end;


Когда срабатывает exit , то программы выходит из процедуры procedure TForm1.Button6Click(Sender: TObject); или какой то её части?


 
Zeqfreed ©   (2004-12-24 22:40) [25]

Выходит из процедуры...


 
Guitar ©   (2004-12-24 22:43) [26]

4 Zeqfreed

А что изменилось. И зачем?


 
Zeqfreed ©   (2004-12-24 22:49) [27]

Много чего вообщето

procedure TForm1.Button6Click(Sender: TObject);
var
fname, Str : string;
f : TextFile;
i : Integer;
begin
fname := edit6.text;
SaveDialog1.Filename := fname;

if SaveDialog1.Execute then begin
AssignFile(f, SaveDialog1.FileName);

try
 ADOQuery1.First;
except
 messagedlg("Error?", mtinformation, [mbok], 0);
 CloseFile(f);
 Exit;
end; //Закончить обработку исключительной ситуации надо?

Rewrite(f);

while not ADOQuery1.EOF do begin
 Str := "";

 for i := 0 to ADOQuery1.FieldCount - 1 do begin
  Str := Str + "|" + ADOQuery1.Fields[i].AsString;
  WriteLn(f, Str);
  ADOQuery1.Next;
 end; //чтобы все 3 строки выполнялись в цикле
end;

CloseFile(f);
end else showmessage("Cancel");
end;


Ещё что-то вроде менял, не помню
Ты попробовал? не работает?


 
Zeqfreed ©   (2004-12-24 22:50) [28]

хм, сорри, вроде энд там и был, запутался ) сорри


 
Zeqfreed ©   (2004-12-24 22:51) [29]

блин, ваще все нафиг перепутал я там ))
спать видимо пора


 
Guitar ©   (2004-12-24 22:53) [30]

Сейчас ошибка стала появляться в результате другого события. Если в ADOQuery нет данных. А пользователь всё-равно пытается сохранить файл.

Может это о чём-то кому-то скажет...


 
Guitar ©   (2004-12-24 22:55) [31]

Эта ошибка появляется после моего сообщения "Ошибка".

try
ADOQuery1.First;
 except
messagedlg("Îøèáêà", mtinformation, [mbok], 0);
CloseFile(f);
exit;
end;


 
Zeqfreed ©   (2004-12-24 22:55) [32]

а может попробовать назначить файл после ADO...First?


 
Zeqfreed ©   (2004-12-24 22:56) [33]

какая именно ошибка? EDatabaseError?


 
Guitar ©   (2004-12-24 23:01) [34]

Не, её то как раз я пытался обработать этим кодом, что выше. А после моего сообщения вылазит системная ошибка
Project1:I/O error 102


 
Guitar ©   (2004-12-24 23:10) [35]

Всё. Сделал. ))) Тема закрыта.



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

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

Наверх




Память: 0.55 MB
Время: 0.027 c
14-1104238026
Vadim X
2004-12-28 15:47
2005.01.16
Где бы взять mfc42.lib ?


1-1104053154
гость
2004-12-26 12:25
2005.01.16
запись в файл


6-1098622309
Ded Moroz
2004-10-24 16:51
2005.01.16
Блокировка


1-1104147932
vic_774N
2004-12-27 14:45
2005.01.16
Сменить операционку ?


1-1103873682
Dima
2004-12-24 10:34
2005.01.16
Проблема со вставкой в AutoCad