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


Автор: jorka 16.11.2008, 12:08
ошибка возникает в конструкторе, я в ООП не силен, подскажите что не так

Код

constructor TPackage.create;
  begin
    inherited;
    SetKind(0);         // <- тут ошибка
    SetColor(clBlack);
    SetR(0);
    SetR2(0);
    .....


ЗЫ TPackage - базовый класс

Автор: Christoph 16.11.2008, 13:33
А если TPackage базовый класс, разве у него может быть предок? ОТ кого наследуются методы? в Базовом классе не может быть inherited

Автор: jorka 16.11.2008, 13:45
Цитата(Christoph @ 16.11.2008,  13:33)
А если TPackage базовый класс, разве у него может быть предок? ОТ кого наследуются методы? в Базовом классе не может быть inherited

убрал inherited, проблема всеравно осталась, на том же поле.

ЗЫ я где-то читал что все базовые классы наследуются от TObject

Автор: SneG0K 16.11.2008, 14:14
Это разбирать надо SetKind(). И не обязательно это от конструктора, может все хорошо создалось, а SetKind() пытается прочитать\записать не созданную переменную или наоборот.

Автор: jorka 16.11.2008, 14:19
Цитата(SneG0K @ 16.11.2008,  14:14)
Это разбирать надо SetKind(). И не обязательно это от конструктора, может все хорошо создалось, а SetKind() пытается прочитать\записать не созданную переменную или наоборот.

SetKind() это процедура того же класса TPackage.

Код

procedure TPackage.SetKind(v: integer);
  begin
    kind :=v;
  end;


я попробовал написать так:

Код

constructor TPackage.create;
  begin
    kind:=0;    // <- тут ошибка
    Color := clBlack;
   ...


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

ЗЫ   kind это переменная класса TPackage.
 private kind: integer;

Автор: THandle 16.11.2008, 14:27
jorka, покажи весь свой код, весь этот класс.


А инициализировать все нулями - незачем. Все это происходит уже в TObject.InitInstance, на сколько я понял:
Код

FillChar(Instance^, InstanceSize, 0);

Автор: Sansa 16.11.2008, 14:28
Хотелось бы видеть полную интерфейсную часть класса

Автор: jorka 16.11.2008, 14:29
Код

type
  TMatrix=array[0..3,0..3] of real;

type
  TVector=array[0..3] of real;

type
  TAA = array[0..31] of TVector;
  
type
  TPackage=class
  private kind: integer;
  private P1: TVector;
  private Color:TColor;

  private P2: TVector;
  private R: double;
  private R2: double;
  private Points: TAA;

  private h: Double;
  private Rx: Single;
  private Ry: Single;
  private Rz: Single;
  private Rot: Boolean;

  public procedure SetKind(v: integer);
  public function GetKind:integer;
  public procedure SetPoint(v:TVector);
  public function GetPoint:TVector;
  public procedure SetPoint2(v:TVector);
  public function GetPoint2:TVector;
  public procedure SetColor(col:TColor);
  public function GetColor:TColor;
  public procedure SetR(vR:double);
  public function GetR:double;
  public procedure SetR2(vR2:double);
  public function GetR2:double;

  public procedure SetX(X:real);
  public function GetX:real;
  public procedure SetY(Y:real);
  public function GetY:real;
  public procedure SetZ(Z:real);
  public function GetZ:real;

  public procedure SetX2(X:real);
  public function GetX2:real;
  public procedure SetY2(Y:real);
  public function GetY2:real;
  public procedure SetZ2(Z:real);
  public function GetZ2:real;
  public procedure SetPoints(poi:TAA);
  public function GetPoints:TAA;

  public procedure SetH(vH:double);
  public function GetH:double;
  public procedure SetRX(vX:double);
  public function GetRX:double;
  public procedure SetRY(vY:double);
  public function GetRY:double;
  public procedure SetRZ(vZ:double);
  public function GetRZ:double;
  public procedure SetRot(vRot:Boolean);
  public function GetRot:Boolean;

  public constructor create;
  public procedure Delete;
end;

implementation

//-------------------------------  TPackage  -----------------------------------

procedure TPackage.SetKind(v: integer);
  begin
    kind :=v;
  end;

function TPackage.GetKind:integer;
  begin
    result:=kind;
  end;

procedure TPackage.SetPoint(v:TVector) ;
  begin
    P1:= v;
  end;

function TPackage.GetPoint:TVector;
  begin
    result:=P1;
  end;

procedure TPackage.SetPoint2(v:TVector) ;
  begin
    P2:= v;
  end;

function TPackage.GetPoint2:TVector;
  begin
    result:=P2;
  end;

procedure TPackage.SetColor(col:TColor);
  begin
    Color := col;
  end;

function TPackage.GetColor:TColor;
  begin
    result:=Color;
  end;

procedure TPackage.SetR(vR:double);
  begin
     R := vR;
  end;

function TPackage.GetR:double;
  begin
    result := R;
  end;

procedure TPackage.SetR2(vR2:double);
  begin
     R2 := vR2;
  end;

function TPackage.GetR2:double;
  begin
    result := R2;
  end;

procedure TPackage.SetX(X:real);
  begin
     P1[0] := X;
  end;

function TPackage.GetX:real;
  begin
    result := P1[0];
  end;

procedure TPackage.SetY(Y:real);
  begin
     P1[1] := Y;
  end;

function TPackage.GetY:real;
  begin
    result := P1[1];
  end;


procedure TPackage.SetZ(Z:real);
  begin
     P1[2] := Z;
  end;

function TPackage.GetZ:real;
  begin
    result := P1[2];
  end;


procedure TPackage.SetX2(X:real);
  begin
     P2[0] := X;
  end;

function TPackage.GetX2:real;
  begin
    result := P2[0];
  end;

procedure TPackage.SetY2(Y:real);
  begin
     P2[1] := Y;
  end;

function TPackage.GetY2:real;
  begin
    result := P2[1];
  end;


procedure TPackage.SetZ2(Z:real);
  begin
     P2[2] := Z;
  end;

function TPackage.GetZ2:real;
  begin
    result := P2[2];
  end;




procedure TPackage.SetPoints(poi:TAA);
  var i:integer;
  begin
     for i := 0 to 31 do
       Points[i]:= poi[i];
  end;

function TPackage.GetPoints:TAA;
  var i:integer;
  begin
     for i := 0 to 31 do
       result[i]:= Points[i];
  end;


 procedure TPackage.SetH(vH:double);
  begin
     H := vH;
  end;

function TPackage.GetH:double;
  begin
    result := H;
  end;

procedure TPackage.SetRX(vX:double);
  begin
     Rx := vX;
  end;

function TPackage.GetRX:double;
  begin
    result := Rx;
  end;


procedure TPackage.SetRY(vY:double);
  begin
     Ry := vY;
  end;

function TPackage.GetRY:double;
  begin
    result := Ry;
  end;

procedure TPackage.SetRZ(vZ:double);
  begin
     Rz := vZ;
  end;

function TPackage.GetRZ:double;
  begin
    result := Rz;
  end;

  procedure TPackage.SetRot(vRot:Boolean);
  begin
     Rot := vRot;
  end;

function TPackage.GetRot:Boolean;
  begin
    result := Rot;
  end;

constructor TPackage.create;
  begin
    //inherited;
    kind:=0;
    Color := clBlack;


    SetKind(0);
    SetColor(clBlack);
    SetR(0);
    SetR2(0);
    SetX(0);
    SetY(0);
    SetZ(0);
    SetX2(0);
    SetY2(0);
    SetZ2(0);
    SetH(0);
    SetRX(0);
    SetRY(0);
    SetRZ(0);
    SetRot(false);
 end;

procedure TPackage.Delete;
  begin
    free;
  end;


Автор: THandle 16.11.2008, 14:39
jorka

1) Зачем столько раз писать type, private, public...?

Код

type
  TMatrix = array[0..3,0..3] of real;
  TVector = array[0..3] of real;
  TAA = array[0..31] of TVector;

  TPackage=class
  private
    kind: integer;
    P1: TVector;
    Color:TColor;
    P2: TVector;
    R: double;
    R2: double;
    Points: TAA;
    h: Double;
    Rx: Single;
    Ry: Single;
    Rz: Single;
    Rot: Boolean;
  public
    procedure SetKind(v: integer);
    function GetKind:integer;
    procedure SetPoint(v:TVector);
    function GetPoint:TVector;
    procedure SetPoint2(v:TVector);
    function GetPoint2:TVector;
    procedure SetColor(col:TColor);
    function GetColor:TColor;
    procedure SetR(vR:double);
    function GetR:double;
    procedure SetR2(vR2:double);
    function GetR2:double;
    procedure SetX(X:real);
    function GetX:real;
    procedure SetY(Y:real);
    function GetY:real;
    procedure SetZ(Z:real);
    function GetZ:real;
    procedure SetX2(X:real);
    function GetX2:real;
    procedure SetY2(Y:real);
    function GetY2:real;
    procedure SetZ2(Z:real);
    function GetZ2:real;
    procedure SetPoints(poi:TAA);
    function GetPoints:TAA;
    procedure SetH(vH:double);
    function GetH:double;
    procedure SetRX(vX:double);
    function GetRX:double;
    procedure SetRY(vY:double);
    function GetRY:double;
    procedure SetRZ(vZ:double);
    function GetRZ:double;
    procedure SetRot(vRot:Boolean);
    function GetRot:Boolean;
    constructor create;
    procedure Delete;
end;


2) Зачем инициализировать нулями?
3) Какая хоть ошибка? У меня все нормально компилируется и создается.
4) Лучше используй свойства.

Автор: jorka 16.11.2008, 14:50
Цитата(THandle @ 16.11.2008,  14:39)
jorka

1) Зачем столько раз писать type, private, public...?
2) Зачем инициализировать нулями?
3) Какая хоть ошибка? У меня все нормально компилируется и создается.
4) Лучше используй свойства.

1) Не освоился еще
2) Не знаю, думал конструктор для этого и нужен
3) Если с классом все нормально, тогда возможно я не правильно его вызываю

Код

  var
    SetPackage: TPackage;
  begin
    SetPackage.create;
    SetPackage.SetKind(1);
    ...

я правильно делаю?

4) Какие свойства?

Автор: THandle 16.11.2008, 14:54
Цитата(jorka @  16.11.2008,  14:50 Найти цитируемый пост)
я правильно делаю?


нет.

Код

SetPackage := TPackage.Create;


Цитата(jorka @  16.11.2008,  14:50 Найти цитируемый пост)
Какие свойства? 


property. Почитай либо в книжке какой либо в интернете/на форуме поищи smile

Автор: jorka 16.11.2008, 15:00
Цитата(THandle @ 16.11.2008,  14:54)
Код

SetPackage := TPackage.Create;


всё зашуршало, работает)

Спасибо.

Автор: Christoph 16.11.2008, 16:20
А вот еще вопрос...так чисто для себя! Вот смотрите чем отличается переменная класса от свойства? То что для свойства устанавливается метод чтения и записи?

P.s THandle Красивей было если бы отдельно были процедуры, отдельно функции  smile 

Автор: jorka 16.11.2008, 20:48
вопрос не по теме:
  есть две формы, вторая show когда на первой нажимается кнопка. почему form2.create происходит после того как выполнится form1.create ?

Автор: Christoph 16.11.2008, 21:34
ну можно создаавать форму вторую по нажатию кнопки, или сразу при запуске проги, создавать две формы!
Имхо без кода тяжело говорить

Автор: jorka 16.11.2008, 22:09
все оказалось намного проще и веселее, все дело в файле проекта, там есть строка

Код

Application.CreateForm(TForm2, Form2);


а если ее удалить, то можно уже и экспериментировать smile 

Автор: SneG0K 16.11.2008, 22:44
А какое отношение форма имеет к твоему классу?

Автор: jorka 16.11.2008, 23:10
Цитата(SneG0K @ 16.11.2008,  22:44)
А какое отношение форма имеет к твоему классу?

никакого smile 

Автор: SneG0K 16.11.2008, 23:16
Цитата(jorka @  16.11.2008,  22:10 Найти цитируемый пост)
никакого

дак че, когда ты убрал инициализацию формы все заработало?

Автор: Christoph 16.11.2008, 23:44
Не понимаю что тут хотят сделать  smile Кста мне так за свойства никто и не ответил  smile 

Автор: jorka 17.11.2008, 10:22
Цитата(SneG0K @ 16.11.2008,  23:16)
Цитата(jorka @  16.11.2008,  22:10 Найти цитируемый пост)
никакого

дак че, когда ты убрал инициализацию формы все заработало?

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

Автор: THandle 17.11.2008, 11:02
Christoph, http://forum.vingrad.ru/articles/topic-157712.html

Тут посмотри про свойства.


jorka, подозрительно это все. Значит ты вручную создаешь форму. А освобождаешь ли ты память? Лучше покажи код, а то утечки там могут быть не маленькие...

Автор: Mariska 24.11.2008, 19:52
Мальчики помогите сдать практику пожалуйста!!!!!!!!!

Добавлено через 1 минуту и 14 секунд
 smile 

Автор: Qu1nt 24.11.2008, 20:07
Mariska, я тебя благословляю!)

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