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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2013, 16:33   #1
Dimabara
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 33
По умолчанию Создание одного из классов.

Ребят, написал код в котором происходит процесс вращения лопастей.
Дело в том, что главная цель этой программы это создание одно из классов.
Прошу помочь в решении этой задачи, ибо все попытки создать отдельный класс для работы этой программы были неудачными.
#
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
 {длина стороны квадрата}
  ae,be,ax,ay,dx,dy,
  ax1,ay1,dx1,dy1,
  ax2,ay2,dx2,dy2,
  ax3,ay3,dx3,dy3:integer;{заданные координаты 2х точек}
  a,a1,a2,a3:real;{угол поворота}
  tdx,tdy:integer;{текущие координаты 2х вращающихся точек}
  tdx1,tdy1,tdx2,tdy2,tdx3,tdy3:Integer;
const d=100;
implementation

{$R *.dfm}
procedure Vrash(a:real;var x,y:integer;x0,y0:integer);
var  px:integer;
begin
x:=x-x0;
y:=y-y0;
a:=a*pi/180;
px:=x;
x:=round(x*cos(a)-y*sin(a))+x0;
y:=round(y*cos(a)+px*sin(a))+y0;
end;
procedure Vadr(ax,ay,d:Integer; var dx,dy: Integer);
begin
{начальные координаты}
dx:=ax+d;dy:=ay+d;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
ae:=Image1.width div 2;
be:=Image1.height;
Timer1.Enabled:=true;
Timer1.Interval:=1;
ax:=Image1.Width div 2;
ay:=Image1.Height div 2;
Vadr(ax,ay,d,dx,dy);
a:=0; {начальный угол}
//tdx:=dx+d;tdy:=dy;
Vrash(a,dx,dy,ax,ay);



ax1:=Image1.Width div 2;
ay1:=Image1.Height div 2;
Vadr(ax1,ay1,d,dx1,dy1);
a1:=90; {начальный угол}
tdx1:=dx1;tdy1:=dy1;
Vrash(a1,tdx1,tdy1,ax1,ay1);


ax2:=Image1.Width div 2;
ay2:=Image1.Height div 2;
Vadr(ax2,ay2,d,dx2,dy2);
a2:=180;
tdx2:=dx2;tdy2:=dy2;
Vrash(a2,tdx2,tdy2,ax2,ay2);


ax3:=Image1.Width div 2;
ay3:=Image1.Height div 2;
Vadr(ax3,ay3,d,dx3,dy3);
a3:=270;
tdx3:=dx3;tdy3:=dy3;
Vrash(a3,tdx3,tdy3,ax3,ay3);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=true;
Timer1.Interval:=2;
with Image1.Canvas do{очищаем}
begin
  Brush.Style:=bsSolid;
  FillRect(Rect(0,0,image1.Width,image1.Height));
  Brush.Style:=bsClear;
 end;

a:=a+1; {увеличиваем угол}
{определяем текущие координаты}
tdx:=dx;tdy:=dy;
Vrash(a,tdx,tdy,ax,ay);

a1:=a1+1;
tdx1:=dx1;tdy1:=dy1;
Vrash(a1,tdx1,tdy1,ax1,ay1);

a2:=a2+1;
tdx2:=dx2;tdy2:=dy2;
Vrash(a2,tdx2,tdy2,ax2,ay2);

a3:=a3+1;
tdx3:=dx3;tdy3:=dy3;
Vrash(a3,tdx3,tdy3,ax3,ay3);

with Image1.Canvas do{рисуем}
 begin
  pen.Color:=clBlack;

  Moveto(ae,be);
  LineTo(ax,ay);

  Moveto(ax,ay);
  Lineto(tdx,tdy);

  MoveTo(ax1,ay1);
  Lineto(tdx1,tdy1);

  MoveTo(ax2,ay2);
  Lineto(tdx2,tdy2);

  MoveTo(ax3,ay3);
  Lineto(tdx3,tdy3);
 end;

end;

end.
Вложения
Тип файла: rar Архив WinRAR.rar (168.5 Кб, 13 просмотров)

Последний раз редактировалось Stilet; 11.02.2013 в 09:17.
Dimabara вне форума Ответить с цитированием
Старый 11.02.2013, 06:16   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А это зачем?
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
 begin
 Timer1.Enabled:=true;
 Timer1.Interval:=2;
...
___________________________________ ________________________________
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Image1: TImage;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TLopost = class (TObject)
  private
    FAngle : Real  ;
    FRadius: Real  ;
    FCenter: TPoint;
  protected
  public
    constructor Create (AAngle, ARadius: Real; ACenter: TPoint);

    procedure Rotate (AAngle: Real);
    procedure Draw (ACanvas: TCanvas);

    property Angle : Real   read FAngle  write FAngle ;
    property Radius: Real   read FRadius write FRadius;
    property Center: TPoint read FCenter write FCenter;
  end;

var
  Form1: TForm1;

implementation

const
  LOP_COUNT = 6; // кол-во лопастей
  DELTA_ANGLE = 1 / 180 * pi; // (1 градус) угол поворота за один цикл

var
  LopArr: array of TLopost;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  a, da: Real;
  cp: TPoint;
begin
  Timer1.Enabled := False;
  Timer1.Interval := 50;

  da := Pi*2 / LOP_COUNT;
  a := 0;
  cp.X := Image1.Width  div 2;
  cp.Y := Image1.Height div 2;
  SetLength (LopArr, LOP_COUNT);
  for i := 0 to LOP_COUNT-1 do begin
    LopArr[i] := TLopost.Create (a, 100, cp);
    a := a + da;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to LOP_COUNT-1 do LopArr[i].Free;
  SetLength (LopArr, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
  can: TCanvas;
begin
  can := Image1.Canvas;
  can.Brush.Style := bsSolid;
  can.Brush.Color := clWhite;
  can.FillRect (Rect (0, 0, Image1.Width, Image1.Height));

  for i := 0 to LOP_COUNT-1 do begin
    LopArr[i].Rotate (DELTA_ANGLE);
    LopArr[i].Draw (can);
  end;
end;

{ TLopost }

constructor TLopost.Create (AAngle, ARadius: Real; ACenter: TPoint);
begin
  FAngle  := AAngle ;
  FRadius := ARadius;
  FCenter := ACenter;
end;

procedure TLopost.Draw(ACanvas: TCanvas);
var
  x, y: Integer;
begin
  x := FCenter.X + Round (FRadius * cos(FAngle));
  y := FCenter.Y + Round (FRadius * sin(FAngle));
  ACanvas.MoveTo (FCenter.X, FCenter.Y);
  ACanvas.LineTo (x, y);
end;

procedure TLopost.Rotate(AAngle: Real);
begin
  FAngle := FAngle + AAngle;
end;

end.

Последний раз редактировалось Sibedir; 11.02.2013 в 06:26.
Sibedir вне форума Ответить с цитированием
Старый 11.02.2013, 21:28   #3
Dimabara
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 33
По умолчанию

#
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=true;
Timer1.Interval:=2;
...

это для того чтобы менять скорость кручения
Dimabara вне форума Ответить с цитированием
Старый 11.02.2013, 21:31   #4
Dimabara
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 33
По умолчанию

Sibedir, если не сложно, скинь в архиве, ибо оно что-то не работает
форму выбивает, кнопку нажимаю и никакой реакции.

Последний раз редактировалось Dimabara; 11.02.2013 в 21:40.
Dimabara вне форума Ответить с цитированием
Старый 12.02.2013, 07:21   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
это для того чтобы менять скорость кручения
Всеравно не понял. В самом таймере меняем интервал? Так он никогда не изменится, а всегда будет равен двум. Т.е. каждую 0,002 сек он будет заносить туда 2. Зачем?
И вот это
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
Timer1.Enabled:=true;
Если Timer1Timer выполняется, значит Timer1.Enabled уже равен true. Зачем его снова пытаться сделать true?
----------------------------------------------------------------------------------------------------------------------------------
Цитата:
что-то не работает форму выбивает
Выбивает - это как.
----------------------------------------------------------------------------------------------------------------------------------
Цитата:
Sibedir, если не сложно, скинь в архиве
Dimabara, без обид. Скидывать архив не буду. Лучше опиши что делаешь, а мы постараемся объяснить, что не так.
Sibedir вне форума Ответить с цитированием
Старый 12.02.2013, 15:30   #6
Dimabara
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 33
По умолчанию

Цитата:
без обид. Скидывать архив не буду. Лучше опиши что делаешь, а мы постараемся объяснить, что не так.[/QUOTE]

вбиваю код с классом
запускаю его, нажимаю на кнопку и ничего не работает
Dimabara вне форума Ответить с цитированием
Старый 12.02.2013, 16:56   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
вбиваю код с классом
Это, я так понимаю, просто Ctrl+C Ctrl+V.
Вы ведь, когда первый релиз своей программы создавали, не просто в редакторе код писали, а кидали компоненты на форму и назначали им обработчики (кликали по ним два раза). Вот и сейчас сделайте тоже самое.
Всё, что между
Код:
{$R *.dfm}
...
{ TLopost }
это и есть реализация формы.
При дв. клике на форму автоматически создастся
Код:
procedure TForm1.FormCreate(Sender: TObject);
Тоже самое для
Код:
procedure TForm1.Button1Click(Sender: TObject);
и
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
Для
Код:
procedure TForm1.FormDestroy(Sender: TObject);
нужно кликнуть (1 раз) по форме (выделить её), залезть в инспектор объектов на вкладку События и выбрать там соответствующее событие для формы (дв. клик на нём).
Если вы уже вставили мой код в ваш проект, то все обработчики можно назначить ч/з инспектор, просто выбрав их из списка.
Sibedir вне форума Ответить с цитированием
Старый 12.02.2013, 21:58   #8
Dimabara
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 33
По умолчанию

[QUOTE=Sibedir;1182308]Это, я так понимаю, просто Ctrl+C Ctrl+V.

нет, не Ctrl+C - Ctrl+V

я перенес все на свою форму
и тем не менее, ошибок нет, но сам компонент TImage с крутящимися лопастями не работает
Изображения
Тип файла: jpg Безымянный.jpg (143.6 Кб, 127 просмотров)

Последний раз редактировалось Dimabara; 12.02.2013 в 22:13.
Dimabara вне форума Ответить с цитированием
Старый 13.02.2013, 05:45   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

████ Создайте форму и поместите на неё компоненты.
████ Опишите класс Лопости
████ Создавайте последовательно обработчики событий
████ и пишите их реализацию

████████ - Это должно создаваться автоматически

████████ - только это можно писать или вставлять по Ctrl+V

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Image1: TImage;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TLopost = class (TObject)
  private
    FAngle : Real  ;
    FRadius: Real  ;
    FCenter: TPoint;
  protected
  public
    constructor Create (AAngle, ARadius: Real; ACenter: TPoint);

    procedure Rotate (AAngle: Real);
    procedure Draw (ACanvas: TCanvas);

    property Angle : Real   read FAngle  write FAngle ;
    property Radius: Real   read FRadius write FRadius;
    property Center: TPoint read FCenter write FCenter;
  end;

var
  Form1: TForm1;

implementation

const
  LOP_COUNT = 6; // кол-во лопастей
  DELTA_ANGLE = 1 / 180 * pi; // (1 градус) угол поворота за один цикл

var
  LopArr: array of TLopost;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  a, da: Real;
  cp: TPoint;
begin
  Timer1.Enabled := False;
  Timer1.Interval := 50;

  da := Pi*2 / LOP_COUNT;
  a := 0;
  cp.X := Image1.Width  div 2;
  cp.Y := Image1.Height div 2;
  SetLength (LopArr, LOP_COUNT);
  for i := 0 to LOP_COUNT-1 do begin
    LopArr[i] := TLopost.Create (a, 100, cp);
    a := a + da;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to LOP_COUNT-1 do LopArr[i].Free;
  SetLength (LopArr, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := not Timer1.Enabled;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
  can: TCanvas;
begin
  can := Image1.Canvas;
  can.Brush.Style := bsSolid;
  can.Brush.Color := clWhite;
  can.FillRect (Rect (0, 0, Image1.Width, Image1.Height));

  for i := 0 to LOP_COUNT-1 do begin
    LopArr[i].Rotate (DELTA_ANGLE);
    LopArr[i].Draw (can);
  end;
end;

{ TLopost }

constructor TLopost.Create (AAngle, ARadius: Real; ACenter: TPoint);
begin
  FAngle  := AAngle ;
  FRadius := ARadius;
  FCenter := ACenter;
end;

procedure TLopost.Draw(ACanvas: TCanvas);
var
  x, y: Integer;
begin
  x := FCenter.X + Round (FRadius * cos(FAngle));
  y := FCenter.Y + Round (FRadius * sin(FAngle));
  ACanvas.MoveTo (FCenter.X, FCenter.Y);
  ACanvas.LineTo (x, y);
end;

procedure TLopost.Rotate(AAngle: Real);
begin
  FAngle := FAngle + AAngle;
end;

end.
Пробуем еще раз. Повторения, как говорится, мать муч... учения.
Sibedir вне форума Ответить с цитированием
Старый 15.02.2013, 21:31   #10
Dimabara
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 33
По умолчанию

спасибо, работает
Dimabara вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Красивое создание классов Darkwinged Помощь студентам 8 16.10.2012 14:34
Создание классов в С++ dimok5 Помощь студентам 1 06.12.2011 02:09
создание и наследование классов в С# Pavellavr Помощь студентам 2 25.03.2011 20:37
Создание группы классов WIN32APIist Общие вопросы C/C++ 5 10.01.2011 09:43
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18