Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 10
1

C++ Builder - Orbita

10.07.2015, 15:05. Показов 2978. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, нужна помощь. Есть программа, ниже прикреплю, мне надо сделать такую же, пробовал декомпилятором, но понял, что легче самому написать. Видел примерный образец кода, но там остается след шарика. Пробовал писать что-то свое, шарик стоит на месте! Не совсем понимаю как задать движение шарика и куда его писать в TTimer или в Form1Create помогите пожалуйста.
Вложения
Тип файла: rar Orbita.rar (219.0 Кб, 31 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2015, 15:05
Ответы с готовыми решениями:

Как использовать компоненты скомпилированные для C++ Builder 2007 в C++ Builder 2010?
Народ! Такая проблема... Есть набор компонентов т.н. Dicom VCL. Сайт производителя -...

Можно ли использовать C++ Builder v11 если купить Embarcadero C++Builder XE8
День добрый! Есть старый проект С++. Он компилируется на CodeGear™ C++Builder Version 11. Но на...

Как заставить проект Builder 6 загруженный в Builder 2007 отображать новые кнопки
Люди добрые, кто нибудь встречался с такой проблемой: Я установил Builder 2007, загрузил в него...

Какой компилятор C++ Builder использовать? Rad Studio 2009 глючит. C++ Builder 6 старый
Много раз замечал непонятки с компилятором. Масла в огонь подлил Какой посоветуете?

6
случайный прохожий
3031 / 2062 / 626
Регистрация: 20.07.2013
Сообщений: 5,548
10.07.2015, 20:54 2
Лучший ответ Сообщение было отмечено coolllbox как решение

Решение

В исходной программе мерцания вообще нет, в моей есть, особенно при разворачивании формы на весь экран (про DoubleBuffered знаю). Как исправить этот минус - не знаю, может был использован поворот всей части изображения:
Повернуть Image
Вращение фигуры
или еще какой способ.

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

cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const default_size = 400, scale = 10;
int margin = 1. * default_size / scale;
float koef = 0.01;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  ClientWidth = default_size;
  ClientHeight = default_size;
  Canvas->Pen->Color = clTeal;
  Canvas->Brush->Color = clTeal;
  SpinEditSpeed->Value = 10;
  Timer1->Interval = 100. / SpinEditSpeed->Value;
  Timer1->Enabled = 1;
  DoubleBuffered = 1;
  SpinEditSpeed->EditorEnabled = 0;
  CheckBoxClockwise->Checked = 1;
}
//---------------------------------------------------------------------------
float TForm1::size()
{
  return 1. * (ClientWidth < ClientHeight ? ClientWidth : ClientHeight);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Refresh();
 
  Timer1->Interval = 100. / SpinEditSpeed->Value;
 
  int half_size = size() / 2;
 
  Canvas->Brush->Style = bsSolid;
  Canvas->Brush->Color = clTeal;
  margin = 1. * size() / scale;
  int radius = (size() - 2. * margin) / scale / 2;
  static double angle = 0;
  Canvas->Ellipse(ClientWidth / 2 + (half_size - margin) * cos(angle) - radius, ClientHeight / 2 + (half_size - margin) * sin(angle) - radius, ClientWidth / 2 + (half_size - margin) * cos(angle) + radius, ClientHeight / 2 + (half_size - margin) * sin(angle) + radius);
  if (CheckBoxClockwise->Checked)
    angle += koef;
  else
    angle -= koef;
 
  Canvas->Brush->Style = bsClear;
  Canvas->Ellipse(ClientWidth / 2 - half_size + margin, ClientHeight / 2 - half_size + margin, ClientWidth / 2 + half_size - margin, ClientHeight / 2 + half_size - margin);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
  if (ClientWidth < 2 * margin)
    ClientWidth = 2* margin;
  if (ClientHeight < 2 * margin)
    ClientHeight = 2* margin;
 
  Timer1->OnTimer;
}
//---------------------------------------------------------------------------
h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.Samples.Spin.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TTimer *Timer1;
    TCheckBox *CheckBoxClockwise;
    TSpinEdit *SpinEditSpeed;
    TLabel *LabelSpeed;
    void __fastcall Timer1Timer(TObject *Sender);
    void __fastcall FormResize(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    float size();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
dfm:
Код
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Orbit'
  ClientHeight = 400
  ClientWidth = 400
  Color = clBtnFace
  DoubleBuffered = True
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  OnResize = FormResize
  DesignSize = (
    400
    400)
  PixelsPerInch = 96
  TextHeight = 13
  object LabelSpeed: TLabel
    Left = 310
    Top = 11
    Width = 29
    Height = 13
    Anchors = [akTop, akRight]
    Caption = 'speed'
  end
  object CheckBoxClockwise: TCheckBox
    Left = 327
    Top = 36
    Width = 65
    Height = 17
    Anchors = [akTop, akRight]
    BiDiMode = bdLeftToRight
    Caption = 'clockwise'
    Checked = True
    ParentBiDiMode = False
    State = cbChecked
    TabOrder = 1
  end
  object SpinEditSpeed: TSpinEdit
    Left = 345
    Top = 8
    Width = 43
    Height = 22
    Anchors = [akTop, akRight]
    EditorEnabled = False
    MaxLength = 3
    MaxValue = 100
    MinValue = 1
    TabOrder = 0
    Value = 10
  end
  object Timer1: TTimer
    Interval = 100
    OnTimer = Timer1Timer
    Left = 360
    Top = 352
  end
end
Миниатюры
C++ Builder - Orbita  
1
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 10
11.07.2015, 01:29  [ТС] 3
Спасибо большое! Мне как пример подойдет идеально. А вот спросить хотел, почему у тебя, к примеру, #include <Vcl.Controls.hpp>, а у меня #include <Controls.hpp>. И еще у меня почему-то при расширении на весь экран TCSpinEdit сдвигается влево. И еще, он у тебя называется TSpinEdit. Не знаешь как исправить, чтоб не сдвигался? А насчет мерцания - я мало что понял, двойная буферизация вообще почти ничего не меняет, как повернуть картинку я тоже не въезжаю, буду разбираться.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
11.07.2015, 03:52 4
Цитата Сообщение от gunslinger Посмотреть сообщение
Как исправить этот минус - не знаю
Ручной даблбуфферинг:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Buffer->SetSize(Width, Height);
    Buffer->Canvas->Brush->Color = clBtnFace;
    Buffer->Canvas->FillRect(Buffer->Canvas->ClipRect);
 
    Timer1->Interval = 100. / SpinEditSpeed->Value;
 
    int half_size = size() / 2;
    margin = 1. * size() / scale;
    Buffer->Canvas->Brush->Style = bsClear;
    Buffer->Canvas->Ellipse(ClientWidth / 2 - half_size + margin,
        ClientHeight / 2 - half_size + margin, ClientWidth / 2 + half_size -
        margin, ClientHeight / 2 + half_size - margin);
 
    Buffer->Canvas->Brush->Style = bsSolid;
    Buffer->Canvas->Brush->Color = clTeal;
    int radius = (size() - 2. * margin) / scale / 2;
    static double angle = 0;
    Buffer->Canvas->Ellipse(ClientWidth / 2 + (half_size - margin) * cos(angle)
        - radius, ClientHeight / 2 + (half_size - margin) * sin(angle) - radius,
        ClientWidth / 2 + (half_size - margin) * cos(angle) + radius,
        ClientHeight / 2 + (half_size - margin) * sin(angle) + radius);
    if (CheckBoxClockwise->Checked)
        angle += koef;
    else
        angle -= koef;
 
    Canvas->Draw(0, 0, Buffer);
}
 
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    ClientWidth = default_size;
    ClientHeight = default_size;
    Canvas->Pen->Color = clTeal;
    Canvas->Brush->Color = clTeal;
    SpinEditSpeed->Value = 10;
    Timer1->Interval = 100. / SpinEditSpeed->Value;
    Timer1->Enabled = 1;
    SpinEditSpeed->EditorEnabled = 0;
    CheckBoxClockwise->Checked = 1;
 
    Buffer = new TBitmap;
}
 
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    delete Buffer;
}
, где Buffer:
C++
1
2
3
4
5
6
7
8
9
10
11
class TForm1 : public TForm
{
__published:
    // ...
private:
    TBitmap *Buffer; // <---
 
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    float size();
};
Цитата Сообщение от coolllbox Посмотреть сообщение
А вот спросить хотел, почему у тебя, к примеру, #include <Vcl.Controls.hpp>, а у меня #include <Controls.hpp>
Новая версия Билдера.
Цитата Сообщение от coolllbox Посмотреть сообщение
И еще, он у тебя называется TSpinEdit
Аналогично, в новых версиях он называется не TCSpinEdit, а именно TSpinEdit, и является стандартным контролом. А поскольку ты добавлял свой TCSpinEdit вручную, а не копировал содержимое формы - то у тебя просто не выставлены нужные Anchors. Нужно отметить в этом свойстве akTop и akRight, тогда спин всегда будет в правом верхнем углу. То же самое касается и чекбокса.
2
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 10
11.07.2015, 16:23  [ТС] 5
Сделал как вы сказали, стал выдавать ошибки. Я так понял TBitmap это класс, а не компонент, иначе я его просто не нашел в палитре. Ошибки:
[C++ Error] Unit1.h(29): E2015 Ambiguity between 'TBitmap' and 'Windows::TBitmap'
[C++ Error] Unit1.cpp(29): E2015 Ambiguity between 'TBitmap' and 'Windows::TBitmap'
[C++ Error] Unit1.cpp(50): E2316 'SetSize' is not a member of 'TBitmap'
[C++ Warning] Unit1.cpp(83): W8018 Assinging unsigned long to TColor

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <math.h>
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
const default_size = 400, scale = 10;
int margin = 1. * default_size / scale;
float koef = 0.01;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{   ClientWidth = default_size;
    ClientHeight = default_size;
    Canvas->Pen->Color = clTeal;
    Canvas->Brush->Color = clTeal;
    SpinEditSpeed->Value = 10;
    Timer1->Interval = 100. / SpinEditSpeed->Value;
    Timer1->Enabled = 1;
    SpinEditSpeed->EditorEnabled = 0;
    CheckBoxClockwise->Checked = 1;
 
    Buffer = new TBitmap;
}
//---------------------------------------------------------------------------
 float TForm1::size()
{
  return 1. * (ClientWidth < ClientHeight ? ClientWidth : ClientHeight);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
if (ClientWidth < 2 * margin)
    ClientWidth = 2* margin;
  if (ClientHeight < 2 * margin)
    ClientHeight = 2* margin;
 
  Timer1->OnTimer;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Refresh();
   Buffer->SetSize(Width, Height);
    Buffer->Canvas->Brush->Color = clBtnFace;
    Buffer->Canvas->FillRect(Buffer->Canvas->ClipRect);
 
    Timer1->Interval = 100. / SpinEditSpeed->Value;
 
    int half_size = size() / 2;
    margin = 1. * size() / scale;
    Buffer->Canvas->Brush->Style = bsClear;
    Buffer->Canvas->Ellipse(ClientWidth / 2 - half_size + margin,
        ClientHeight / 2 - half_size + margin, ClientWidth / 2 + half_size -
        margin, ClientHeight / 2 + half_size - margin);
 
    Buffer->Canvas->Brush->Style = bsSolid;
    Buffer->Canvas->Brush->Color = clTeal;
    int radius = (size() - 2. * margin) / scale / 2;
    static double angle = 0;
    Buffer->Canvas->Ellipse(ClientWidth / 2 + (half_size - margin) * cos(angle)
        - radius, ClientHeight / 2 + (half_size - margin) * sin(angle) - radius,
        ClientWidth / 2 + (half_size - margin) * cos(angle) + radius,
        ClientHeight / 2 + (half_size - margin) * sin(angle) + radius);
    if (CheckBoxClockwise->Checked)
        angle += koef;
    else
        angle -= koef;
 
    Canvas->Draw(0, 0, Buffer);
 
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
Form1->Color = RGB(rand()%255, rand()%255, rand()%255);
Form1->Height = Form1->Height + 1;
Form1->Width = Form1->Width + 1;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (Timer2->Enabled == false)
  {
    Timer2->Enabled = true;
  }
  else {
     Timer2->Enabled = false;
  }
 
 
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete Buffer;
}
//---------------------------------------------------------------------------
unit.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "CSPIN.h"
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TTimer *Timer1;
        TCheckBox *CheckBoxClockwise;
        TLabel *LabelSpeed;
        TCSpinEdit *SpinEditSpeed;
        TTimer *Timer2;
        TButton *Button1;
        void __fastcall FormResize(TObject *Sender);
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall Timer2Timer(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
 
private:
TBitmap *Buffer;    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        float size();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
11.07.2015, 16:35 6
Я древними Билдерами не пользуюсь, и не в курсе, чего там в них есть, а чего - нет. В XE2 все прекрасно работает. Но судя по описаниям ошибок - вот так:
C++
1
2
3
4
5
6
7
// в конструкторе формы:
    Buffer = new Graphics::TBitmap;
 
// в таймере
    // Buffer->SetSize(Width, Height); // вместо этой строки
    Buffer->Width = Width;
    Buffer->Height = Height;
И не надо добавлять то, чего у меня не было, и от чего надо было избавиться. Refresh() тут опять приведет к мерцанию, и ты потом опять скажешь, что все неправы. У меня Refresh() отсутствует, если что...
0
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 10
11.07.2015, 16:44  [ТС] 7
Кажется первые две ошибки исправил добавлением #define TBitmap Graphics::TBitmap, остается [C++ Error] Unit1.cpp(50): E2316 'SetSize' is not a member of 'TBitmap'

Добавлено через 2 минуты
Спасибо огромное! Ни в коем случае не имел ввиду, что ты не прав, Refresh(); убрал, SetSize тоже, теперь все отлично!
0
11.07.2015, 16:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2015, 16:44
Помогаю со студенческими работами здесь

Как заставить проект сделанный на C++ Builder 6.0 работать на компьютере на котором не установлен этот самый Builder
вопрос абсолютно нубский,но очень волнует...но как заставить проект сделанный на C++ Builder 6.0...

Ошибка EAccesViolation в методе класса - C++ Builder/Builder 6
Файл polygon.h #ifndef __My_Polygon_H #define __My_Polygon_H #include &lt;ostream&gt; ...

можно ли в С++ Builder 2006 писать программы на С++ Builder 6?
подскажите, пожалуйста... если программка написана на С++ Builder 2006, могу ли я перевести проект...

История активности файла. (C++ Builder 6, C++ Builder XE2)
Здравствуйте. Пришла идея написать программу для выявления истории активности файла, например есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru