|
|
Регистрация | << Правила форума >> | 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. |