Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при попытке прочитать файл [D7]


Женя ©   (2012-04-20 22:35:00) 

При попытке открыть файл .dat  выдаёт ошибку  "Project C:...путь...project1.exe faulted with message:'access violation at 0x3332c30: read of adress 0x3332c30...
Подскажите пожалуйста в чём проблема...
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, Menus;

type
 TForm1 = class(TForm)
   MainMenu1: TMainMenu;
   PopupMenu1: TPopupMenu;
   N1: TMenuItem;
   N2: TMenuItem;
   N3: TMenuItem;
   N4: TMenuItem;
   N5: TMenuItem;
   N10: TMenuItem;
   N11: TMenuItem;
   N6: TMenuItem;
   N7: TMenuItem;
   N8: TMenuItem;
   N9: TMenuItem;
   N12: TMenuItem;
   N13: TMenuItem;
   GroupBox1: TGroupBox;
   GroupBox2: TGroupBox;
   Panel1: TPanel;
   Edit2: TEdit;
   Edit3: TEdit;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit1: TEdit;
   Label4: TLabel;
   Label3: TLabel;
   Label2: TLabel;
   Label1: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Label8: TLabel;
   ListBox1: TListBox;
   Button1: TButton;
   Button2: TButton;
   OpenDialog1: TOpenDialog;
   SaveDialog1: TSaveDialog;
   FontDialog1: TFontDialog;
   procedure Button1Click(Sender: TObject);
   procedure ListBox1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure N2Click(Sender: TObject);
   procedure N4Click(Sender: TObject);
   procedure N5Click(Sender: TObject);
   procedure N12Click(Sender: TObject);
   procedure N11Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
const MaxRec=10;
Type TSteel=record
Name:string[10];
C:real;
Mn:real;
Si:real;
Cr:real;
end;
var
 Form1: TForm1;
Steel:array [1.. MaxRec] of TSteel;
Fr:file of TSteel; //файловая переменная и ее тип
FileRecName:string;
NumRecord:integer;
implementation

{$R *.dfm}
Function ViewRecord(k:integer):string;
begin
with Steel[k] do
begin
ViewRecord:=Name+' - C:'+FloatToStr(C)
+'% Mn:'+FloatToStr(Mn)
+'% Si:'+FloatToStr(Si)
+'% Cr:'+FloatToStr(Cr)+'%';
end;
end;
Procedure ClearAll;
begin
Form1.Edit1.Text:='';
Form1.Edit2.Text:='';
Form1.Edit3.Text:='';
Form1.Edit4.Text:='';
Form1.Edit5.Text:='';
NumRecord:=0;
Form1.Label6.Caption:='';
Form1.Label8.Caption:='';
Form1.ListBox1.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
NumRecord:=NumRecord+1;
if NumRecord>MaxRec then
MessageDlg('Количество записей больше '+IntToStr
(MaxRec),mtError,[mbOk],0)
else begin
with Steel[NumRecord] do
begin
Name:=Edit1.Text;
C:=StrToFloat(Edit2.Text);
Mn:=StrToFloat(Edit3.Text);
Si:=StrToFloat(Edit4.Text);
Cr:=StrToFloat(Edit5.Text);
ListBox1.Items.Add(ViewRecord(NumRecord));
end;
Label6.Caption:=IntToStr(NumRecord);
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Edit5.Text:='';
end; end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
with Steel[ListBox1.ItemIndex+1] do
begin
Edit1.Text:=Name;
Edit2.Text:=FloatToStr(C);
Edit3.Text:=FloatToStr(Mn);
Edit4.Text:=FloatToStr(Si);
Edit5.Text:=FloatToStr(Cr);
end;
Label8.Caption:=IntToStr(ListBox1.ItemIndex+1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if NumRecord >=1 then
begin
with Steel[ListBox1.ItemIndex+1] do
begin
Name:=Edit1.Text;
C:=StrToFloat(Edit2.Text);
Mn:=StrToFloat(Edit3.Text);
Si:=StrToFloat(Edit4.Text);
Cr:=StrToFloat(Edit5.Text);
end;
ListBox1.Items[ListBox1.ItemIndex]:=
ViewRecord(ListBox1.ItemIndex+1);
end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
ClearAll;
end;

procedure TForm1.N4Click(Sender: TObject);
var i:integer;
begin
if OpenDialog1.Execute then
begin
ClearAll;
FileRecName:=OpenDialog1.FileName;
AssignFile(Fr,FileRecName);
Reset(Fr);
NumRecord:=0;
While not Eof(Fr) do
begin
NumRecord:=NumRecord+1;
read(fr,Steel[NumRecord]);
ListBox1.Items.Add(ViewRecord(NumRecord));
end;
CloseFile(Fr);
Label6.Caption:=IntToStr(NumRecord);
MessageDlg('Файл '+FileRecName+' открыт.',
mtInformation,[mbOk],0);
end;
end;

procedure TForm1.N5Click(Sender: TObject);
var i:integer;
begin
if SaveDialog1.Execute then
begin
FileRecName:=SaveDialog1.FileName;
AssignFile(Fr,FileRecName);
Rewrite(Fr);
for i:=1 to NumRecord do write(Fr,Steel[i]);
CloseFile(Fr);
MessageDlg('Файл '+FileRecName+' сохранен.',
mtInformation,[mbOk],0);
end;
end;

procedure TForm1.N12Click(Sender: TObject);
begin
if FontDialog1.Execute then
ListBox1.Font.Assign(FontDialog1.Font);
end;

procedure TForm1.N11Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ClearAll;
end;

end.


Dimka Maslov   (2012-04-25 13:31:00) [1]

Корень зла:
1. Steel : array [1..MaxRec] of TSteel
2. While not Eof(Fr) do

Подумай что здесь не так и почему так нельзя.


Нанятый программист   (2012-04-21 15:22:00) [2]

> Плохиш ©   (21.04.12 11:23) [8]
> Значит надо нанять программиста.

:)


Плохиш   (2012-04-21 11:23:00) [3]


> Женя   (21.04.12 00:17) [3]
> Оно выдаёт не на строки, а уже при запуске программы, когда
> я выбираю какой файл загрузить... в некоторых случаях ошибку
> пишет, а в некоторых загружает файл, но эффекта ноль

Значит надо нанять программиста.
Кстати, чем "начинающим" не угодила?


Cobalt   (2012-04-21 11:11:00) [4]

Запускай программу из среды разработки - при возникновении исключительной ситуации (исключения) - встроенный отладчик укажет тебе, в какой строке кода это случилось.


Германн   (2012-04-21 01:45:00) [5]


> Так в том то и дело, что я экспериментирую и просто пишу
> разные данные, чтобы понять как должно быть правильно.

Ну вот ты экспериментируешь и записываешь файл, а он при чтении даёт ошибку. Так ты дай этот файл нам для проверки. Уточню. Сами данные о значениях Name, C, Mn, Si, Cr меня не интересуют. Интересует только сам файл (а точнее его размеры).


Женя   (2012-04-21 01:18:00) [6]

Так в том то и дело, что я экспериментирую и просто пишу разные данные, чтобы понять как должно быть правильно.


Германн   (2012-04-21 00:57:00) [7]


> в некоторых случаях ошибку пишет, а в некоторых загружает
> файл, но эффекта ноль

Стандартное поведение для таких ошибок. Можешь выложить куда-нибудь файл, который при загрузке "в некоторых случаях ошибку пишет, а в некоторых загружается, но эффекта ноль"?


Женя   (2012-04-21 00:17:00) [8]

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


Германн   (2012-04-21 00:02:00) [9]


> NumRecord:=NumRecord+1;
> if NumRecord>MaxRec then
> MessageDlg('Количество записей больше '+IntToStr
> (MaxRec),mtError,[mbOk],0)
>

Если нажать кнопку Button1 раз двадцать, то каким будет NumRecord?


Плохиш   (2012-04-20 23:53:00) [10]

На какой строке выдаёт?


Наверх

Титульная страница Поиск, карта сайта Написать письмо