Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 27
1

Мигает PaintBox

21.12.2012, 11:29. Показов 1738. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно написать прогу, в которой хаотично двигаются квадраты разного размера. Каждый квадрат это отдельный поток. При столкновении, квадрат меньшего размера исчезает (поток убивается) и так до тех пор, пока не останется один квадрат.
Я рисую эти квадраты на PaintBox. При столкновении один исчезает, а другие начинают мигать. Если поиграться с количеством и скоростью, то они могут и не исчезать вовсе. Плюс еще, у меня должно выводиться сообщение, что остался один квадрат, но у меня оно не выводится.
Подскажите пожалуйста, где нужно исправить ))

Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, math, unit2;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    Label3: TLabel;
    Edit2: TEdit;
    Label4: TLabel;
    Edit3: TEdit;
    Panel1: TPanel;
    PaintBox: TPaintBox;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure GetData;
  end;
 
  Molecula = record
     x, y:Integer;          // êîîðäèíàòû
     Vx, Vy: Integer;       // ñîñòàâëÿþùèå ñêîðîñòè
     angle: real;           // óãîë ïîëåòà
     speed: byte;
  end;
 
var
  Form1: TForm1;
  Vmax, n: integer;
  R: array [1..100] of integer;
  mol: array [1..100] of molecula;
  run: boolean;
  HThread: array[1..150] of Thread;
  Mutex : THandle;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.GetData;
var i:integer;
begin
   Randomize;
   n:=strtoint(Edit3.Text);     // êîëè÷åñòâî
   for i:=1 to n do R[i]:=(10+random(25));     // ðàçìåð
   Vmax:=strtoint(Edit2.Text);  // ìàêñèìàëüíàÿ ñêîðîñòü äâèæåíèÿ
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i, j: byte;
    temp: integer;
begin
  GetData;
 
  // çàïóñê äâèæåíèÿ
  //PaintBox.Refresh;
  PaintBox.Canvas.Brush.Color:=clWhite;
  PaintBox.Canvas.Pen.Color:=clWhite;
  PaintBox.Canvas.Rectangle(0,0,400,400);
 
  PaintBox.Canvas.Brush.Color:=clBlue;
  PaintBox.Canvas.Pen.Color:=clBlue;
 
  Randomize;
 
  // îïðåäåëåíèå íà÷àëüíîãî ïîëîæåíèÿ
  for i:=1 to N do
  begin
    // íà÷àëüíûå êîîðäèíàòû
    mol[i].x:=RandomRange(R[i], PaintBox.Width-R[i]);
    mol[i].y:=RandomRange(R[i], PaintBox.Height-R[i]);
 
    // íà÷àëüíîå íàïðàâëåíèå äâèæåíèÿ
    mol[i].angle:=Random(360)*Pi/180;
    mol[i].speed:=RandomRange(1, Vmax);
 
    // cîñòàâëÿþùèå äâèæåíèÿ  ïî îñÿì
    mol[i].Vx := Round(mol[i].speed * Sin(mol[i].angle));
    mol[i].Vy := Round(mol[i].speed * Cos(mol[i].angle));
 
    // âûâîä íà ýêðàí
    PaintBox.Canvas.Rectangle(mol[i].x-R[i], mol[i].y-R[i], mol[i].x+R[i], mol[i].y+R[i]);
  end;
  Mutex:= CreateMutex (nil, false, nil);
 for i:=1 to n do
  begin
    HThread[i] := Thread.Create(false,i,n);
    sleep(100);
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
  for i:=1 to n do HThread[i].Terminate;
  CloseHandle(Mutex);
end;
 
end.
Delphi
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, math;
 
type
  Thread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  public
  t:integer;
  t1:integer;
  ThreadName: integer;
  ThreadName1: integer;
  constructor Create(CreateSuspennded: Boolean; const Name: Integer; const Name1:integer);
  Destructor Destroy; override;
  procedure del;
  procedure Write;
  end;
  var k:integer;
 
implementation
uses Unit1;
 
constructor Thread.Create(CreateSuspennded: Boolean; const Name: Integer; const Name1:integer);
begin
  inherited Create(CreateSuspennded);
  ThreadName := Name;
  ThreadName1 := Name1;
end;
 
destructor Thread.Destroy;
begin
inherited Destroy;
end;
 
procedure Thread.Del;
begin
 Form1.PaintBox.Canvas.Brush.Color:=clWhite;
 Form1.PaintBox.Canvas.Pen.Color:=clWhite;
 Form1.PaintBox.Canvas.Rectangle(mol[t].x-R[t], mol[t].y-R[t], mol[t].x+R[t], mol[t].y+R[t]);
end;
 
procedure Thread.Write;
begin
 Form1.PaintBox.Canvas.Brush.Color:=clBlue;
 Form1.PaintBox.Canvas.Pen.Color:=clBlue;
 Form1.PaintBox.Canvas.Rectangle(mol[t].x-R[t], mol[t].y-R[t], mol[t].x+R[t], mol[t].y+R[t]);
end;
 
procedure Thread.Execute;
var i,m,j,temp:integer;
begin
  i:=ThreadName;  m:=ThreadName1;
 while not terminated do
  begin
    if WaitForSingleObject(Mutex, INFINITE) = WAIT_OBJECT_0 then
    try
       with Form1.Canvas do
       begin
          Lock;
          t:=i;
          Synchronize(del);
          //sleep(10);
          for j:=1 to m do
            if j<>i then
            begin
              // îïðåäåëÿåì ñòîëêíîâåíèå
              if sqrt((sqr(mol[i].x-mol[j].x)+sqr(mol[i].y-mol[j].y)))<(2*R[i]+1) then
              begin
                if k=1 then
                   ShowMessage('Îñòàëñÿ ïîñëåäíèé êâàäðàò');
                if R[j]>R[i] then
                begin
                  HThread[i].Terminate;
                  sleep(5);
                  k:=m-1;
                end
                else
                begin
                  HThread[j].Terminate;
                  sleep(5);
                  k:=m-1;
                end;
                Form1.PaintBox.Canvas.Brush.Color:=clWhite;
                Form1.PaintBox.Canvas.Pen.Color:=clWhite;
                Form1.PaintBox.Canvas.Rectangle(0,0,400,400);
              end;
            end;
          // ñäâèãàåì íà íîâóþ ïîçèöèþ.
          mol[i].x:=mol[i].x+mol[i].Vx;
          mol[i].y:=mol[i].y+mol[i].Vy;
          // ïðîâåðêà íà âûõîä çà ãðàíèöû îáëàñòè
          if mol[i].x>Form1.PaintBox.Width-R[i] then
          begin
            mol[i].x:=Form1.PaintBox.Width-R[i];
            mol[i].Vx:=-mol[i].Vx;
          end;
          if mol[i].x<R[i] then
          begin
            mol[i].x:=R[i];
            mol[i].Vx:=-mol[i].Vx;
          end;
          if Mol[i].y>Form1.PaintBox.Height-R[i] then
          begin
            mol[i].y:=Form1.PaintBox.Height-R[i];
            mol[i].Vy:=-mol[i].Vy;
          end;
          if mol[i].y<R[i] then
          begin
            mol[i].y:=R[i];
            mol[i].Vy:=-Mol[i].Vy;
          end;
          t1:=i;
          Synchronize(write);
          sleep(10);
          UnLock;
      end;
    finally  ReleaseMutex(Mutex);
    sleep(4);
  end;
 
end;
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2012, 11:29
Ответы с готовыми решениями:

Как сместить Canvas в PaintBox не смещая PaintBox?
Как сместить например на 3 пикселя весь рисунок в PaintBox, не изменяя при этом размеров и позиции...

PaintBox
Только учусь,плохо разбираюсь Мне нужно,чтобы мышка определяла на какой клетке находится,чтобы...

Paintbox
Подскажите как быть если в paintbox нирисовал линию а потом открыл другое приложение допустим папку...

Paintbox
Подскажите как мне нужно ввести команду floodfill чтобы она закрасила группу пикселей цвета clred а...

4
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
21.12.2012, 13:57 2
Цитата Сообщение от Fireblade Посмотреть сообщение
у меня должно выводиться сообщение, что остался один квадрат, но у меня оно не выводится
Вызов ShowMessage в доп.потоке недопустим.

А вот это
with Form1.Canvas do
begin
Lock;
вообще бестолковые и вредные телодвижения, с учетом того что с канвой (формы и пейнтбокса на ней) так или иначе работает основной поток.
0
0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 27
21.12.2012, 16:21  [ТС] 3
Цитата Сообщение от mss Посмотреть сообщение
Вызов ShowMessage в доп.потоке недопустим.

А вот это


вообще бестолковые и вредные телодвижения, с учетом того что с канвой (формы и пейнтбокса на ней) так или иначе работает основной поток.
Спасибо! А как тогда вызвать сообщение, если в доп. потоке нельзя? Использовать какой-нибудь флаг и проецированные в память файлы?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
21.12.2012, 16:24 4
Цитата Сообщение от Fireblade Посмотреть сообщение
А как тогда вызвать сообщение
Как угодно, но ни в коем случае не ShowMessage.
Простейшим и вполне достаточным будет вызов MessageBox()
0
0 / 0 / 0
Регистрация: 16.12.2012
Сообщений: 27
21.12.2012, 16:53  [ТС] 5
Цитата Сообщение от mss Посмотреть сообщение
Как угодно, но ни в коем случае не ShowMessage.
Простейшим и вполне достаточным будет вызов MessageBox()
Понял, спасибо ))
0
21.12.2012, 16:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2012, 16:53
Помогаю со студенческими работами здесь

PaintBox
В моей программе 2 проблемы, нуждаюсь в вашей помощи.. Первая проблема - PaintBox разных...

Paintbox
здравствуйте,я делаю что-то вроде пэинта в делфи,в качестве холста я использую пэинтбокс,можете...

PaintBox
Создайте приложение, на форму которого помещён компонент PaintBox. Напишите обработчик события...

Timer + PaintBox ?
поставлена такая задача: нужно создать таймер но не простой а что бы во время обратного отсчёта на...

График в Paintbox
Здравствуйте, У меня проблема я пропустил 2 занятия из за гриппа и не чего не понимаю в пайнт боксе...

Мерцание в PaintBox
Кто подскажет как избавиться от мерцания в PaintBox когда в него выводится что-то с помощью таймера?


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

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