Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Динамический массив в классе


Автор: Staraus 15.9.2009, 00:42
Всем привет, в классе объявил динамический массив, и при попытке установить длину динамического массива вылетает с ошибкой EAccessViolation with message 'Access violation at address 00404c1c in module 'Project2.exe'. Read of address 00000004. process stopped. Use Strp or Run to continue. В чем проблема, и как можно использовать динамический массив в классе?

Код

  TCredit = class
     Day: array of Integer;
  end;

var
  Form1: TForm1;
  Credit: TCredit;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(Credit.Day, 100);
end;

Автор: NightmareZ 15.9.2009, 04:18
Credit у тебя случайно не nil?

Автор: Frees 15.9.2009, 07:06
Код

  SetLength(Self.Day, 100);

Автор: Staraus 15.9.2009, 09:21
Да credit = nil

Автор: pseud 15.9.2009, 09:32
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  Credit := TCredit.Create;
  SetLength(Credit.Day, 100);
end;

Автор: Staraus 15.9.2009, 09:54
А как использовать динамический массив в классе, чтобы не выдавало ошибки??

Автор: pseud 15.9.2009, 09:54
а вообще создание дин. массива надо бы делать в конструкторе класса, им владеющем, удялять - в деструкторе.
должно быть что-то типа:
[исправленное]
Код

type
  TArrayOfInteger = array of Integer;

type
  TCredit = class
  public
    FDay: TArrayOfInteger;
    constructor Create(ALength: Integer = 0); reintroduce;
    destructor Destroy; override;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    FCredit: TCredit;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TCredit }

constructor TCredit.Create(ALength: Integer = 0);
begin
  if ALength >= 0 then
    SetLength(FDay, ALength)
  else
    raise Exception.Create('Айайай');
end;

destructor TCredit.Destroy;
begin
  SetLength(FDay, 0);
end;

{TForm1}

procedure TForm1.Button1Click(Sender: TObject);
begin
  FCredit := TCredit.Create(100);
  try
    {работаем с FCredit}
  finally
    FCredit.Free;
  end;
end;


Автор: NightmareZ 15.9.2009, 11:24
Цитата(Staraus @ 15.9.2009,  09:21)
Да credit = nil

Ну вот потому и падает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)