Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для ArtyomTank
1 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 137

Не происходит рисование при вставке процедуры для рисования в таймер. PaintBox FormsABC

22.03.2019, 14:05. Показов 2283. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как я понял отрисовка происходит во время работы главного тела программы, а после запуска процедуры через таймер отрисовка не происходит.

Pascal
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
132
133
134
135
136
uses FormsABC, Timers;
 
type
  pos = record
    x: integer;
    y: integer;
  end;
 
///variables
var
  clockOut: PaintBox;
  Menu: MainMenu;
  
  clockSize: integer := 500;
  padding: integer := 5;
  r := Round(clockSize / 2) - padding;
  rs: integer := 10;
  wp, hp: array[0..12] of integer;
  h: array[0..12] of string;
  posEnd: pos;
  
  family := new System.Drawing.FontFamily('Consolas');
  emSize: single := 16;
  Pen := new System.Drawing.Pen(System.Drawing.Color.Black);
  Brush := new System.Drawing.SolidBrush(System.Drawing.Color.Black);
  Font := new System.Drawing.Font(family, emSize);
  stringSize: System.Drawing.SizeF;
 
  //mainLoop:Timer;
 
 
///требуется для направления стрелки.
///возвращает координаты конца стрелки в типе pos.
///Параметр y0: координата начала линии на оси y.
///Параметр x0: координата начала линии на оси x.
///Параметр r: длинна линии.
///Параметр time: время в целочисленном формате.
///Параметр t: принимает 'o' для минут и секунд и 'h' для часов.
function arrowpos(y0, x0: integer; r: real; time: integer; t: char): pos;
var
  position: pos;
  k: real;
begin
  if t = 'o' then k := 360 / 12;
  if t = 'h' then k := 360 / 60;
  position.x := x0 + Round(r * sin(Pi * time / k));
  position.y := y0 - Round(r * cos(Pi * time / k));
  Result := position;
end;
 
///Вывод часов
procedure AClock;
begin
  Pen.Width := 1;
  clockOut.Graphics.Clear(Color.White);
  
  var time: DateTime;
  time := DateTime.Now;
  clockOut.Graphics.DrawEllipse(Pen, padding, padding, r * 2, r * 2);
  clockOut.Graphics.DrawEllipse(Pen, padding, padding, r * 2, r * 2);
  clockOut.Graphics.DrawEllipse(Pen, padding + r - rs / 2, padding + r - rs / 2, rs, rs);
  //FloodFill(xClock,yClock,clBlack);
  for var i := 0 to 11 do
  begin
    clockOut.Graphics.DrawString(h[i], Font, Brush, padding + (r + Round((r - 10) * sin(Pi * (i + 1) / (180 / 30))) - wp[i]), padding + (r - Round((r - 10) * cos(Pi * (i + 1) / (180 / 30))) - hp[i]));//(r+Round((r-5)*sin(Pi*(i+1)/(180/30))))-wp[i]) , padding+(r-Round((r-5)*cos(Pi*(i+1)/(180/30)))-hp[i]) ,
  end;
  posEnd := arrowpos(padding + r, padding + r, r - 30, time.second, 'o');
  Pen.width := 2;
  clockOut.Graphics.DrawLine(Pen, padding + r, padding + r, posEnd.x, posEnd.y);
  posEnd := arrowpos(padding + r, padding + r, r - 35, time.minute, 'o');
  Pen.width := 4;
  clockOut.Graphics.DrawLine(Pen, padding + r, padding + r, posEnd.x, posEnd.y);
  posEnd := arrowpos(padding + r, padding + r, r / 2, time.hour, 'h');
  Pen.width := 8;
  clockOut.Graphics.DrawLine(Pen, padding + r, padding + r, posEnd.x, posEnd.y);
  
  Write('draw' + time.Second);
end;
 
///отрисовка таймера
procedure ATimer;
begin
  
end;
 
///отрисовка секундомера
procedure AStopwatch;
begin
  
end;
 
 
///отрисовка
procedure Draw;
begin
  AClock;
end;
 
 
 
///initialization
procedure Init;
begin
  MainForm.Title := 'Clock & Timer & Stopwatch';
  MainForm.SetSize(clockSize + 10, clockSize + 60);
  MainForm.CenterOnScreen;
  MainForm.IsFixedSize := true;
  
  Menu := new MainMenu();
  Menu.Add('clock');
  
  clockOut := new PaintBox();
  clockOut.Height := clockSize;
  clockOut.Width := clockSize;
  
  for var i := 0 to 11 do
  begin
    h[i] := IntToStr(i + 1);
    stringSize := clockOut.Graphics.MeasureString(h[1], Font);
    
    wp[i] := Round(stringSize.Width / 2);
    hp[i] := Round(stringSize.Height / 2);
  end;
end;
 
procedure Update(t:integer);
begin
var mainLoop := new Timer(t, Draw);
  mainLoop.Start;
end;
 
begin
  Init;
  Draw;
  Update(100)
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2019, 14:05
Ответы с готовыми решениями:

PaintBox в FormsABC. Как с ним работать?
Пытаясь найти какую-нибудь канву для рисования в FormsABC, я зайдя в определение FormsABC, нашёл там PaintBox, так вот как с ним работать?

Как указать кисть В FormsABC для PaintBox.Graphics.DrawString;? А точнее как создать эту кисть?
var Brush :=new System.Drawing.Brush(); clock.pas(19) : Нельзя создать экземпляр абстрактного класса Brush Добавлено через 33...

PaintBox: рисование кривой при зажатой кнопке мыши
Разработайте приложение из одной формы, разместив на форме компонент Panel, а на Panel – компонент PaintBox. Запрограммируйте перемещение...

6
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
22.03.2019, 16:40
Перестаньте плодить темы. Пишите в какую то одну всё про то что вы пытались сделать, и что вы увидели (визуально, при попытке отладить и т.п.).
Я чуть позже смогу помочь, сейчас нет возможности открыть паскаль.

Добавлено через 1 минуту
Вот остальные темы отсюда же:
Не отрисовывается окно
Не рисует в PaintBox FormABC

(пусть будет тут, или может модераторы объеденят)
0
 Аватар для ArtyomTank
1 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 137
23.03.2019, 07:53  [ТС]
Цитата Сообщение от Sun Serega Посмотреть сообщение
Перестаньте плодить темы
Да просто я думал, что может быть неправильно задаю вопрос и от этого мне не отвечают, и не зная как переправить вопрос решил создавать новые темы.

Добавлено через 1 час 43 минуты
Как должно быть:
Отрисовывается PaintBox, затем запускается таймер обновляющий рисунок в PaintBox.

Что выходит:
Отрисовывается PaintBox и всё больше он не обновляется.

Что я делаю не так?
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
23.03.2019, 17:39
Лучший ответ Сообщение было отмечено ArtyomTank как решение

Решение

Вот упрощённый пример того что не работает:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uses FormsABC;
 
begin
  
  MainForm.NetForm.Shown += (o,e)->
  begin
    System.Threading.Thread.Create(()->
    while true do
    begin
      writeln('drawing');
      var gr := MainForm.NetForm.CreateGraphics;
      gr.DrawLine(new System.Drawing.Pen(System.Drawing.Color.Black), 10,10, 20,20);
      Sleep(100);
    end).Start;
  end;
  
end.
Я задал вопрос по этому поводу разработчикам: <тут была ссылка, нарушающая Правила Форума, пункт 5.8>
Ибо код, вроде правильный. По крайней мере в чистом System.Windows.Forms это работает, а значит это что то внутри FormsABC мешает так делать.
1
 Аватар для ArtyomTank
1 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 137
24.03.2019, 01:19  [ТС]
Из вашего диалога с разработчиком я понял, что придётся переходить на System.Windows.Form.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
24.03.2019, 02:01
Лучший ответ Сообщение было отмечено ArtyomTank как решение

Решение

Да, так будет лучше.

Но он вообще имел в виду что переходить надо на WPF, для которого модуля аля FormsABC нет.
Но его можно, как и System.Windows.Form, на прямую, подключив определённую библиотеку.
В данном случае, это, в основном, PresentationFramework.dll, но если вы не находите какой то класс - смотрите на msdn, там всегда написано какой класс в какой библиотеке.

С другой стороны, для обучения и простых задач, не сфокусированных на производительности - System.Windows.Form лучше.
1
 Аватар для ArtyomTank
1 / 1 / 0
Регистрация: 21.02.2019
Сообщений: 137
24.03.2019, 08:47  [ТС]
Вот я перевёл, но рисуется только чать изображения. Почему?
Pascal
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
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'} 
 
uses System, System.Windows.Forms, System.Drawing,Timers;
 
type
  pos = record
    x: integer;
    y: integer;
  end;
 
var
  f: Form;
  PaintBox:= new Panel();
  canvas := PaintBox.CreateGraphics;
  
  PaintBoxSize: integer := 500;
  padding: integer := 5;
  r := Round(PaintBoxSize / 2) - padding;
  rs: integer := 10;
  wp, hp: array[0..12] of integer;
  h: array[0..12] of string;
  posEnd: pos;
  time: DateTime;
  
  family := new FontFamily('Consolas');
  emSize: single := 16;
  Pen := new Pen(Color.Black);
  Brush := new SolidBrush(Color.Black);
  Font := new Font(family, emSize);
  stringSize: SizeF;
 
 
///требуется для направления стрелки.
///возвращает координаты конца стрелки в типе pos.
///Параметр y0: координата начала линии на оси y.
///Параметр x0: координата начала линии на оси x.
///Параметр r: длинна линии.
///Параметр time: время в целочисленном формате.
///Параметр t: принимает 'o' для минут и секунд и 'h' для часов.
function arrowpos(y0, x0: integer; r: real; time: integer; t: char): pos;
var
  position: pos;
  k: real;
begin
  if t = 'o' then k := 360 / 12;
  if t = 'h' then k := 360 / 60;
  position.x := x0 + Round(r * sin(Pi * time / k));
  position.y := y0 - Round(r * cos(Pi * time / k));
  Result := position;
end;
 
 
procedure Init;
begin
  f := new Form;
  f.Text := 'Clock';
  f.Size := new Size(PaintBoxSize + 20, PaintBoxSize + 40);
  
  PaintBox.BackColor := Color.White;
  PaintBox.Size := new Size(PaintBoxSize, PaintBoxSize);
  f.Controls.Add(PaintBox);
  
  {$omp parallel for}
  for var i := 0 to 11 do
  begin
    h[i] := IntToStr(i + 1);
    stringSize := canvas.MeasureString(h[1], Font);
    
    wp[i] := Round(stringSize.Width / 2);
    hp[i] := Round(stringSize.Height / 2);
  end;
end;
 
procedure AClock;
begin
  Pen.Width := 1;
  canvas.Clear(Color.White);
  
  time := DateTime.Now;
  canvas.DrawEllipse(Pen, padding, padding, r * 2, r * 2);
  canvas.DrawEllipse(Pen, padding + r - rs / 2, padding + r - rs / 2, rs, rs);  
 
  for var i := 0 to 11 do
  begin
    canvas.DrawString(h[i], Font, Brush, padding + (r + Round((r - 10) * sin(Pi * (i + 1) / (180 / 30))) - wp[i]), padding + (r - Round((r - 10) * cos(Pi * (i + 1) / (180 / 30))) - hp[i]));//(r+Round((r-5)*sin(Pi*(i+1)/(180/30))))-wp[i]) , padding+(r-Round((r-5)*cos(Pi*(i+1)/(180/30)))-hp[i]) ,
  end;
  
  Pen.width := 2;
  posEnd := arrowpos(padding + r, padding + r, r - 30, time.second, 'o');
  canvas.DrawLine(Pen, padding + r, padding + r, posEnd.x, posEnd.y);
  Pen.width := 4;
  posEnd := arrowpos(padding + r, padding + r, r - 35, time.minute, 'o');
  canvas.DrawLine(Pen, padding + r, padding + r, posEnd.x, posEnd.y);
  Pen.width := 8;
  posEnd := arrowpos(padding + r, padding + r, r / 2, time.hour, 'h');
  canvas.DrawLine(Pen, padding + r, padding + r, posEnd.x, posEnd.y);
end;
 
procedure Draw;
begin
AClock;
end;
 
procedure Update(t: integer);
begin
  var mainLoop := new Timer(t, Draw);
  mainLoop.Start;
end;
 
begin
  Init;
  Draw;
  Update(1000);
  Application.Run(f);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2019, 08:47
Помогаю со студенческими работами здесь

Иконка для окна при подключенном модуле FormsABC
Есть проблема: нужно изменить изначальную иконку окна при запуске программы на свою. Вопрос гуглил, ответов не нашёл. Буду дико...

PaintBox рисование
Рисую на PaintBox(он на frame), но картинка не проявляется. Знаю про onpaint, но там писать обработчик не охота, думается видел, что можно...

Рисование в PaintBox-e
Нужно осуществить рисование в пеинт боксе (как в обычном пеинте) при нажатии на кнопку мыши. Вот код: procedure...

Рисование в PaintBox
i++; TTabSheet *pPage = new TTabSheet(this); pPage-&gt;PageControl = PageControl1; pPage-&gt;TabVisible=true; ...

Рисование на paintbox'e
Помогите плиз. Суть такова, на форме есть paintbox, нужно, чтобы после загрузки приложения на paintbox'e уже была нарисована линия, без...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru