Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2009, 10:10   #1
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию Создание своего класса, наследование от предка

Сталкиваюсь чес говоря впервые, нужно создать 2 класса, соответственно 2 обьекта, грубо говоря свойства обьектов, методы прорисовки и т.п. должны наследоваться от еще одного класса. Соответственно классов должно быть 3: предок и 2 потомка. Все бы ничего, но как корректно написать конструктор и деструктор каждого из потомков? Выдает либо ошибку переполнения стека, либо еще херь какую-то...
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 01.05.2009, 10:33   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

То что выполнялось в конструкторе предка, выполнится и в конструкторе потомка. А деструктор высвобождает память, занятую объектом + то что вы напишете там. Что происходит у вас по этим событиям?
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 01.05.2009, 10:43   #3
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

В потомках идет прорисовка 2-х фигур, в предке, как я уже говорил, методы рисования, контроля границ и т.п. .. Фигуры отрисовываются на пейнтбоксе, чтобы между ними переключиться, должно быть 2 радиобаттона.. Допустим, если ончеккед = истина 1-го радиобаттона, тогда вызывается конструктор 1-й фигуры, деструктор 2-й, соответственно истина 2-го - деструктор первой и конструктор 2-й.
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 01.05.2009, 11:11   #4
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

А зачем каждый раз пересоздавать объект? Легче по-моему сделать какое-нибудь свойство, например Visible, которое определяет, рисуется ли фигура.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 01.05.2009, 11:17   #5
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Понимаю что легче, но по заданию необходима инициализация в конструкторе класса фигуры, и уничтожение через деструктор..
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 01.05.2009, 11:23   #6
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Тогда можно в предке прописать очистку от любой фигуры, а в наследниках только прорисовку, тогда по деструктору любого наследника будет очищаться поле рисования.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 01.05.2009, 11:30   #7
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Код:

 type TFigure = class
   private
     function control(x_,y_,r_:integer):boolean;
     function krest2(x,y:integer):boolean;
     procedure Move(x_,y_:integer);
 end;


 var
  Form1: TForm1;
  Figure1: TFigure;
  x,y,r:integer;
  cf,ct:TColor;
  dt:TDatetime;
  a:string;
  p: array[1..13] of TPoint;
implementation

uses Proghelp;

//uses Unit2;

//usesUnit1;

{$R *.dfm}

function TFigure.control(x_,y_,r_:integer):boolean;
begin
result:=false;
 if ((x-(2*(r+r_)+m+x_) < Form1.PaintBox1.left)and (x_ < 0))or((x+(2*(r+r_)+m+x_) > Form1.PaintBox1.Width+Form1.PaintBox1.left)and (x_ > 0))or
    ((y-(2*(r+r_)+m+y_) < Form1.PaintBox1.Top)and (y_ < 0))or((y+(2*(r+r_)+m+y_) > Form1.PaintBox1.Height+Form1.PaintBox1.Top)and (y_ > 0))then
    result:=true;

end;

procedure TFigure.move(x_,y_:integer);
begin
 if figure1.control(x_,y_,0) = false then
 begin
  with form1 do
  begin
  paintbox1.canvas.pen.color:=cf;
  paintbox1.canvas.brush.color:=cf;
  krest2(x,y);
  paintbox1.canvas.pen.color:=clBlack;
  paintbox1.canvas.brush.color:=ct;
  end;
  x:=x+x_; y:=y+y_;
  Figure1.krest2(x,y);
 end;
end;

procedure TForm1.krest(x,y:integer);
begin
  with form1.paintbox1.canvas do
   begin
      p[1].X:=x+r;           p[1].Y:=y-r;
      p[2].X:=x+r;           p[2].Y:=y-(6*r);
      p[3].X:=x-r;           p[3].Y:=y-(6*r);
      p[4].X:=x-r;           p[4].Y:=y-r;
      p[5].x:=x-(6*r);       p[5].y:=y-r;
      p[6].X:=x-(6*r);       p[6].y:=y+r;
      p[7].X:=x-r;           p[7].Y:=y+r;
      p[8].x:=x-r;           p[8].y:=y+(6*r);
      p[9].X:=x+r;           p[9].Y:=y+(6*r);
      p[10].x:=x+r;          p[10].y:=y+r;
      p[11].x:=x+(6*r);      p[11].Y:=y+r;
      p[12].X:=x+(6*r);      p[12].Y:=y-r;
      p[13].X:=x+r;          p[13].y:=y-r;
      polygon(p);
  end;
end;

function TFigure.krest2(x,y:integer):boolean;
begin
 result:=false;
  with form1.paintbox1.canvas do
   begin
      p[1].X:=x-(2*r);           p[1].Y:=y-(2*r);
      p[2].X:=x-(3*r);           p[2].Y:=y-(3*r);
      p[3].X:=x-(4*r);           p[3].Y:=y-(2*r);
      p[4].X:=x-(4*r);           p[4].Y:=y+(2*r);
      p[5].x:=x-(3*r);           p[5].y:=y+(3*r);
      p[6].X:=x-(2*r);           p[6].y:=y+(2*r);
      p[7].X:=x+(2*r);           p[7].Y:=y+(2*r);
      p[8].x:=x+(3*r);           p[8].y:=y+(3*r);
      p[9].X:=x+(4*r);           p[9].Y:=y+(2*r);
      p[10].x:=x+(4*r);          p[10].y:=y-(2*r);
      p[11].x:=x+(3*r);          p[11].Y:=y-(3*r);
      p[12].X:=x+(2*r);          p[12].Y:=y-(2*r);
      p[13].X:=x-(2*r);          p[13].y:=y-(2*r);
      polygon(p);
      result:=true;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
 dt:=now;
 memo1.Lines.Clear;
 form1.Memo1.Lines.Add('Сегодня '+datetostr(dt));
 ct:=clgreen;
 cf:=clblue;
 x:=200;
 y:=200;
 r:=10;
 TrackBar1.Position:=r;
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
Form1.Canvas.pen.color:=cf;
Form1.Canvas.Brush.Color:=cf;
form1.Canvas.Rectangle(Form1.PaintBox1.Left,Form1.PaintBox1.Top,Form1.PaintBox1.Width,Form1.PaintBox1.Height);
paintbox1.canvas.pen.color:=clBlack;
paintbox1.canvas.brush.color:=ct;
figure1.krest2(x,y);
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 if (r > TrackBar1.Position)or((figure1.control(1,0,1) = false)and
 (figure1.control(0,1,1) = false)and(figure1.control(0,-1,1) = false)and
 (figure1.control(-1,0,1) = false)) then
 begin
  s_r.Caption:=inttostr(TrackBar1.Position);
  dt:=now;
  if trackbar1.position <> 10 then
  memo1.Lines.add(timetostr(dt)+'  Масштаб фигуры = '+inttostr(Trackbar1.Position));
  paintbox1.canvas.pen.color:=cf;
  paintbox1.canvas.brush.color:=cf;
  figure1.krest2(x,y);
  r:=TrackBar1.Position;
  figure1.move(0,0);
 end else TrackBar1.Position:=r;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
free;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
dt:=now;
 figure1.move(0,-m);
 memo1.Lines.Add(timetostr(dt)+' Движение вверх, x= '+inttostr(x)+' , y= '+inttostr(y));
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
 dt:=now;
 figure1.move(+m,0);
 memo1.Lines.Add(timetostr(dt)+' Движение вправо, x= '+inttostr(x)+' , y= '+inttostr(y));
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
 dt:=now;
 figure1.move(-m,0);
 memo1.Lines.Add(timetostr(dt)+' Движение влево, x= '+inttostr(x)+' , y= '+inttostr(y));
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
 dt:=now;
 figure1.move(0,+m);
 memo1.Lines.Add(timetostr(dt)+' Движение вниз, x= '+inttostr(x)+' , y= '+inttostr(y));
end;

end.
Вот мой корявый, слегка обрезанный, код.
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 01.05.2009, 11:31   #8
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

Грубо говоря, создам еще 2 потомка, описанный в коде класс оставлю предком. Как корректно прописань конструктор, вот что понять не могу. Ну и деструктор соответственно
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Старый 01.05.2009, 11:37   #9
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Можно сделать наследование метода TFigure.Krest2, где происходит рисование, тогда обратившись к наследнику как к TFigure (TFigure(NextObject).Krest2) вы сможете вызвать переписанный метод рисования для уже следующего класса. Я так понимаю что в конструкторе вам следует просто поместить вызов процедуры рисования krest2 , предварительно описав её в классе.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 01.05.2009, 11:50   #10
Krechet
Пользователь
 
Аватар для Krechet
 
Регистрация: 03.12.2008
Сообщений: 76
По умолчанию

это будет выглядеть как,

Код:
Tfigure = class
public
procedure krest2(x,y:integer);
end;

...
var
figure:TFigure;
...

constructor figure.create;
krest2(x,y);
end;
так примерно?
При установке Линукс не пострадало ни одного пингвина... Зато пострадало много дятлов..
Krechet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание своего класса в Delphi 7 - фигуры для шахматной доски electric Компоненты Delphi 18 24.10.2013 15:06
создание своего архиватора kuzmich Общие вопросы Delphi 9 08.01.2009 06:17
Создание своего класса AlexandrSid Общие вопросы Delphi 3 19.05.2008 13:28
Создание своего формата AnaSha Microsoft Office Excel 1 09.01.2007 16:20