Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.07.2014, 12:13
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию создание своего классаю и естесственно возникает ошибка

вот мой код. не могу понять почему в процедуре записи при выполнении 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  
Старый 08.07.2014, 16:57
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Не показан код создания TSPS и вызовов его методов read и writetofile
Ответить с цитированием
  #3  
Старый 09.07.2014, 05:56
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

Код:
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  
Старый 09.07.2014, 08:10
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

в выше описанном методе 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  
Старый 10.07.2014, 08:13
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Единственная причина, почему так может происходить, это размер читаемого файла нулевой, тогда понятно, что spsStroka[i] не инициализирована, а вот если файл не нулевой, тогда непонятно появление ошибки.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 28.07.2014, 11:32
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

исправил код. теперь все работает.
Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter