![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
вот мой код. не могу понять почему в процедуре записи при выполнении showmessage возникает ошибка accessViolation. судя по всему класс не инициализировался, но почему?
Код:
type
TspsStrka=class
Npr:Real;
constructor create();
procedure read(str:string);
end;
TSPS=class
name:string;
spsStroka:array[0..99999] of TspsStrka;
constructor create(openname:string);
procedure read;
procedure writetofile(savename:string);
end;
constructor TspsStrka.create();
begin
Npr:=0;
Npk:=0;
X:=0;
Y:=0;
end;
constructor TSPS.create(openname:string);
begin
name:=openname;
end;
procedure TspsStrka.read(str:string);
begin
Npr:=strtofloat(copy(str,2,16));
end;
procedure tsps.read;
var
t:TStringList;
i:Cardinal;
begin
t:=TStringList.Create;
t.LoadFromFile(name);
for i:=0 to t.Count-1 do begin
spsStroka[i]:=TspsStrka.create();
spsStroka[i].read(t[i]);
end;
t.Free;
end;
procedure TSPS.writetofile(savename:string);
begin
ShowMessage(FloatToStr(spsStroka[0].Npr));
end;
end. |
|
#2
|
|||
|
|||
|
Не показан код создания TSPS и вызовов его методов read и writetofile
|
|
#3
|
|||
|
|||
|
Код:
procedure TForm1.btspsClick(Sender: TObject);
var
SPS:TSPS;
openname:string;
begin
if Open.Execute then
SPS:=TSPS.create(Open.FileName) else Exit;
SPS.read;
if Save.Execute then
SPS.writetofile(Save.FileName) else begin sps.free; Exit; end;
SPS.Free;
end; |
|
#4
|
|||
|
|||
|
в выше описанном методе tsps.read если поставить shomessage внутрь цикла создания и чтения строк - то он показывает значение. а если поставить после цикла, то ошибка доступа, какой бы элемент я не выводил
Код:
procedure tsps.read;
var
t:TStringList;
i:Cardinal;
begin
t:=TStringList.Create;
t.LoadFromFile(name);
for i:=0 to t.Count-1 do begin
spsStroka[i]:=TspsStrka.create();
spsStroka[i].read(t[i]);
showmessage(FloatToStr(spsStroka[i].Npr)); // - работает
end;
//а если поставить здесь
showmessage(FloatToStr(spsStroka[i].Npr)); // то ошибка accesviolaion
t.Free;
end; |
|
#5
|
||||
|
||||
|
Единственная причина, почему так может происходить, это размер читаемого файла нулевой, тогда понятно, что spsStroka[i] не инициализирована, а вот если файл не нулевой, тогда непонятно появление ошибки.
|
|
#6
|
|||
|
|||
|
исправил код. теперь все работает.
Код:
unit USPS;
interface
uses
Windows, Messages, SysUtils, Classes, Forms;
type
TspsStroka=class
Npr, Npk, X, Y:{array of }Real;
constructor create();
procedure read(str:string);
end;
TSPS=class
name:string;
SpsStrokaCount:Cardinal;
SizeOfmas:Cardinal;
spsStroki:array {[0..99999]} of TspsStroka;
constructor create(openname:string);
procedure read({str:string}openname:string);
procedure writetofile(savename:string);
end;
implementation
constructor TspsStroka.create();
begin
Npr:=0;
Npk:=0;
X:=0;
Y:=0;
end;
constructor TSPS.create(openname:string);
var
t:TStringList;
i:Integer;
str:string;
begin
name:=openname;
SpsStrokaCount:=0;
t:=TStringList.Create;
t.LoadFromFile(openname);
SizeOfmas:=0;
for i:=0 to t.Count-1 do begin
Application.ProcessMessages();
str:=t[i];
if str[1]='H' then Continue;
inc(SizeOfmas);
end;
SetLength(spsStroki,SizeOfmas);
t.Free;
end;
procedure TspsStroka.read(str:string);
begin
Npr:=strtofloat(copy(str,2,16));
Npk:=strtofloat(copy(str,18,8));
X:=strtofloat(copy(str,47,9));
Y:=strtofloat(copy(str,56,10));
end;
procedure tsps.read({str:string}openname:string);
var
i:Cardinal;
str:string;
t:TStringList;
begin
t:=TStringList.Create;
t.LoadFromFile(openname);
for i:=0 to t.Count-1 do begin
Application.ProcessMessages();
str:=t[i];
if str[1]='H' then Continue;
spsStroki[SpsStrokaCount]:=TspsStroka.create();
spsStroki[SpsStrokaCount].read(str);
Inc(SpsStrokaCount);
end;
t.Free;
end;
procedure TSPS.writetofile(savename:string);
var
ft:TStringList;
i:Integer;
str:string;
begin
ft:=TStringList.Create;
for i:=0 to SizeOfmas-1 do begin
Application.ProcessMessages();
str:=floatToStr(spsStroki[i].Npr)+#9+floatToStr(spsStroki[i].Npk)+#9+floatToStr(spsStroki[i].X)+#9+floatToStr(spsStroki[i].Y);
ft.Add(str);
str:='';
end;
ft.SaveToFile(savename);
ft.Free;
end;
end. |