Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109

Нарисовать стрелку как у аналоговых приборов

27.06.2014, 14:48. Показов 7557. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Подскажите, как можно нарисовать стрелку как у аналоговых приборов ? Например:

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2014, 14:48
Ответы с готовыми решениями:

Как нарисовать стрелку ?
Что надо добавить в этот код чтобы вместо линии рисовалась стрелка? var line = new Line { Stroke = Brushes.Black, X1 =...

Как нарисовать стрелку
Здравствуйте. У меня имеются две точки с координатами, заранее они неизвестны, т.к. координаты вносятся по нажатию мыши. Задача состоит в...

Как нарисовать стрелку на Image
Подскажите как нарисовать стрелку на Image?

77
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
02.07.2014, 15:01
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DenProx Посмотреть сообщение
Да, думаю так и придется делать)
ну, я думаю, что Вы справитесь! Если вдруг возникнут вопросы - задавайте, будем вместе пытаться их разрешить.
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
02.07.2014, 15:02  [ТС]
Sergio Leone, Обязательно) Спасибо!)
1
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
02.07.2014, 18:28
Шкала у нас - величина постоянная, поэтому имеет смысл нарисовать ее один раз и хранить в отдельном Битмапе:
Delphi
1
FScale: TBitmap;
SetScale - процедура для создания шкалы. Туда можно добавить параметры, которые будут влиять на внешний вид.

Еще где-то надо хранить положение стрелки:
Delphi
1
property Swivel: Integer read FSwivel write SetSwivel;
У меня эта величина в градусах. От 0 до размера сектора шкалы (120 градусов).
Эти же границы назначаются TrackBar'у (0..120).

Чтобы при изменении положения стрелки картинка сама перерисовывалась добавлена процедура SetSwivel.
Само рисование сводится к загрузке в Имагу картинки шкалы и отрисовки нового положения стрелки.

Код:
Кликните здесь для просмотра всего текста
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls;
 
type
  TImage = class(ExtCtrls.TImage)
  private
    FSwivel: Integer;
    FScale: TBitmap;
    procedure SetScale();
    procedure SetSwivel(ASwivel: Integer);
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Swivel: Integer read FSwivel write SetSwivel;
    property Scale: TBitmap read FScale;
  end;
 
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
end;
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Image1.Swivel := TrackBar1.Position;
end;
 
{ TImage }
 
constructor TImage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  
  FScale := TBitmap.Create;
  FScale.Width := 800;
  FScale.Height := 500;
  SetScale();
 
  Center := True;
  Stretch := True;
  Proportional := True;
 
  Swivel := 0;
end;
 
destructor TImage.Destroy;
begin
  FScale.Free;
  inherited;
end;
 
//procedure TImage.WMPaint(var Message: TWMPaint);
procedure TImage.Paint;
const
{$J+}
  b: Boolean = True;
{$J-}
var
  Xo, Yo, R: Integer;
  A: Real;
begin
  inherited;
 
  b := not b;
  if {Proportional and} b then Exit;
 
  Picture.Assign(FScale);
 
  Xo := 400;
  Yo := 400;
  R := 300;
  A := FSwivel * pi / 180;
 
  with Canvas, Pen do
  begin
    Width := 5;
    Color := clRed;
    MoveTo(Xo, Yo);
    LineTo(Xo + Round((R + 35) * cos(A)), Yo - Round((R + 35) * sin(A)));
  end; 
end;
 
procedure TImage.SetScale;
var
  i, j,
  Xo, Yo,
  X, Y,
  R,
  A1, A2: Integer;
 
  A, dA: Real;
 
  s: String;
 
begin
  Xo := 400;
  Yo := 400;
  R := 300;
  A1 := 150;
  A2 := -120;
  A := A1 * pi / 180;
  dA := A2 / (4 * 5) * pi / 180;
 
  with FScale.Canvas, Pen do
  begin
 
    Brush.Style := bsClear;
    Brush.Color := clMoneyGreen;
    Font.Size := 16;
 
    FillRect(ClipRect);
 
    Width := 20;
    Color := clWhite;
    Ellipse(Xo - R, Yo - R, Xo + R, Yo + R);
 
    Width := 5;
    Color := clBlue;
    MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
    AngleArc(FScale.Canvas.Handle, Xo, Yo, R, A1, A2);
 
    MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
    LineTo(Xo + Round((R + 35) * cos(A)), Yo - Round((R + 35) * sin(A)));
 
    s := IntToStr(0);
    MoveTo(Xo + Round((R + 50) * cos(A)), Yo - Round((R + 50) * sin(A)));
    TextOut(PenPos.X - TextWidth(s) div 2, PenPos.Y - TextHeight(s) div 2, s);
 
    for i := 1 to 4 do
    begin
      for j := 1 to 4 do
      begin
        A := A + dA;
        MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
        LineTo(Xo + Round((R + 15) * cos(A)), Yo - Round((R + 15) * sin(A)));
 
        s := IntToStr(i-1) + ',' + IntToStr(2 * j);
        X := Xo + Round((R + 30) * cos(A) - TextWidth(s)  / 2);
        Y := Yo - Round((R + 30) * sin(A) + TextHeight(s) / 2);
        TextOut(X, Y, s);
      end;
 
      A := A + dA;
      MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
      LineTo(Xo + Round((R + 35) * cos(A)), Yo - Round((R + 35) * sin(A)));
 
      s := IntToStr(i);
      X := Xo + Round((R + 50) * cos(A) - TextWidth(s)  / 2);
      Y := Yo - Round((R + 50) * sin(A) + TextHeight(s) / 2);
      TextOut(X, Y, s);
    end;
  end;
end;
 
procedure TImage.SetSwivel(ASwivel: Integer);
begin
  FSwivel := 150 - ASwivel;
  Repaint;
end;
 
end.
Вложения
Тип файла: rar Аналоговая шкала.rar (2.1 Кб, 21 просмотров)
2
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
03.07.2014, 08:06  [ТС]
FIL, Шкала может изменяться по условию задачи, но думаю это уже не трудно будет сделать ! Спасибо !!)
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
14.11.2014, 12:05  [ТС]
FIL, Доброго времени суток! Хотел бы снова поднять данную тему. У меня возникли некоторые проблемы со шкалой. В случае когда тип шкалы от -1..0..1 , все ясно. А как быть, если тип будет от 0..1 (т.е. от 0 до 10, 100, 500) и на оборот от -1..0 (-10, -100, - 500 до 0).
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
14.11.2014, 12:18
Цитата Сообщение от DenProx Посмотреть сообщение
А как быть, если тип будет от 0..1
В моем примере шкала от 0 до 4, поэтому я не очень понимаю в чем проблема.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
14.11.2014, 12:57  [ТС]
FIL, проблема в том, что тип шкалы может изменяться в процессе работы программы, и мне не совсем ясно, какие параметры отвечают за 0 точку.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
14.11.2014, 14:09  [ТС]
У меня немного другой пример, он более подходит под мою задачу

AnalogDevice.rar

Если у вас есть возможность, посмотрите пожалуйста! Мне кажется там делов на 5 минут, но ни как сообразить не могу где копать ...
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
14.11.2014, 15:41
Так у тебя в проекте надписи правильно выставляются при выборе шкалы.
Вопрос-то в чем, можешь толком объяснить?)
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
14.11.2014, 15:45  [ТС]
FIL, Надписи правильно, а сама стрелка не соответствует введенному значению. Для ввода Edit использую и Button2. Для шкал от -1..0..1 значения нормально работают. А когда ставлю тип шкалы от 0 до 10 к примеру, и ввожу какое то значение, то стрелка показывает совершенно другое.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
14.11.2014, 16:10
Для того, чтобы это правильно работало надо вместо констант типа:
Delphi
1
2
3
  if devValue<=-100 then Result := FirstAngle
  else
    if devValue>=100 then Result := LastAngle
ввести соответствующие переменные начала и конца диапазона и использовать их при расчетах.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
14.11.2014, 19:55  [ТС]
Это я уже понял) Не понятно какие именно переменные нужно ставить
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
14.11.2014, 20:07
Цитата Сообщение от DenProx Посмотреть сообщение
Не понятно какие именно переменные нужно ставить
Цитата Сообщение от FIL Посмотреть сообщение
переменные начала и конца диапазона
Если выбираешь диапазон -10..30, то одна переменная будет = -10, другая = 30.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
15.11.2014, 09:56  [ТС]
FIL, тут дело вот в этой формуле:

Delphi
1
Result := FirstAngle  - 5*angleStep - (devValue*angleStep/20);
где FirstAngle =150 ( всегда)

а вот angleStep, вполне может меняться я думаю, и еще не ясно какую роль играют значения 5 и 20.

Добавлено через 16 минут
Т.к. angleStep = 12 всегда, (это расстояние между точками)

Задача получается следующая, получить: угол 138 при введенном значении 1, 126 при 2, 114 при 3 и т.д.
Для этого нужно поменять значения 5 и 20 как я понимаю.

Добавлено через 10 минут
Эврика! :-) с положительной частью разобрался вроде )

заменил 5 на 0, а 20 на 1 (проще говоря убрал эти значения), и для шкалы типа 0..10, все стало работать как нужно!

Остался вопрос, как отразить в другую сторону, для шкалы типа -10..0
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
15.11.2014, 10:20
Ну элементарные же вычисления.
Допустим:
диапазон -10..30
размер шкалы в градусах = 120
начало шкалы = 150
надо поставить стрелку на 0-ое значение

Result = 150 - (120 / (30 - (-10))) * (0 - (-10))
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
15.11.2014, 10:59  [ТС]
FIL, Я сильно извиняюсь, но не могли бы вы в более общем виде формулу эту написать)
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
15.11.2014, 12:07
Result = [начало шкалы] - ([размер шкалы] / ([конец диапазона] - [начало диапазона])) * ([устанавливаемое значение] - [начало диапазона])
3
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
18.11.2014, 12:20  [ТС]
FIL, Я вас еще немного помучаю ) если не против )) С типами разобрался, все работает. Теперь осталась задача, передвигать стрелку по инерции. Т.е. например было значение 1, поставили 10 - стрелка должна плавно дойти до новой отметки.
Я примерно представляю, что нужно взять старое значение и новое. И с каким то шагом в цикле изменять его. Но до конца с мыслями не могу собраться.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
18.11.2014, 20:17
Цитата Сообщение от DenProx Посмотреть сообщение
передвигать стрелку по инерции
Для этого, при изменении значения, надо сохранять его в отдельном поле объекта и запускать таймер.
В таймере увеличивать текущее значение, пока оно не сравняется с новым и останавливать таймер.
Для расчета текущего шага увеличения можно использовать различные формулы, получая тем самым различные эффекты (замедление, плавность и т.п.). Ну или просто увеличивать на константу.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
18.11.2014, 20:20
Подправил немного свой пример (может чем поможет):
Код
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls;
 
type
  TPanel = class(ExtCtrls.TPanel)
  private
    A1: Integer;  // íà÷àëî øêàëû (â ãðàäóñàõ)
    A2: Integer;  // ðàçìàõ øêàëû (â ãðàäóñàõ)
    FnBSerif,            // ÷èñëî áîëüøèõ çàñå÷åê íà øêàëå
    FnSSerif: Integer;   // ÷èñëî ìàëåíüêèõ çàñå÷åê íà øêàëå
    MinValue: Real; // ìèí. çíà÷åíèå øêàëû (â ïîïóãàÿõ)
    MaxValue: Real; // ìàêñ. çíà÷åíèå øêàëû (â ïîïóãàÿõ)
    ValueFormat: String; // ôîðìàò îòîáðàæåíèÿ çíà÷åíèé øêàëû(èç FormatFloat)
    FSwivel: Integer; // óãîë ïîâîðîòà ñòðåëêè (â ãðàäóñàõ)
    FNewSwivel: Integer; // íîâûé óãîë ïîâîðîòà ñòðåëêè (â ãðàäóñàõ)
    FScale,              // èçîáðàæåíèå øêàëû
    tmp: TBitmap;
    Timer1: TTimer;      // òàéìåð ïëàâíîãî ïåðåìåùåíèÿ øêàëû
    procedure SetScale();
    procedure SetSwivel(ASwivel: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure SetValue(AValue: Real);
    function GetValue(): Real;
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
 
  published
    property Value: Real read GetValue write SetValue;
    property Swivel: Integer read FSwivel write SetSwivel;
    property Scale: TBitmap read FScale;
  end;
 
  TForm1 = class(TForm)
    Panel1: TPanel;
    TrackBar1: TTrackBar;
    Edit1: TEdit;
    Button1: TButton;
    procedure TrackBar1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
//==============================================================================
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Panel1.Swivel := TrackBar1.Position;
  Caption := FloatToStr(Panel1.Value);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.Value := StrToFloat(Edit1.Text);
end;
//==============================================================================
{ TPanel }
 
constructor TPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
 
  DoubleBuffered := True;
  
  tmp := TBitmap.Create;
  tmp.Canvas.Pen.Width := 5;
  tmp.Canvas.Pen.Color := clRed;
 
  FScale := TBitmap.Create;
  FScale.Width := 800;
  FScale.Height := 500;
 
  FnBSerif := 8;
  FnSSerif := 4;
 
  SetScale();
 
//  Center := True;
//  Stretch := True;
//  Proportional := True;
 
  Timer1 := TTimer.Create(Self);
  Timer1.Enabled := False;
  Timer1.Interval := 50;
  Timer1.OnTimer := Timer1Timer;
 
  Swivel := 0;
end;
 
destructor TPanel.Destroy;
begin
  Timer1.Free;
  FScale.Free;
  tmp.Free;
  inherited;
end;
 
//procedure TImage.WMPaint(var Message: TWMPaint);
procedure TPanel.Paint;
//const
{.$J+}
//  b: Boolean = True;
{.$J-}
var
  Xo, Yo, R: Integer;
  A: Real;
begin
  inherited;
 
//  b := not b;
//  if {Proportional and} b then Exit;
 
//  Picture.Assign(FScale);
  tmp.Assign(FScale);
 
  Xo := 400;
  Yo := 400;
  R := 300;
  A := FSwivel * pi / 180;
 
  with tmp.Canvas, Pen do
  begin
//    Width := 5;
//    Color := clRed;
    MoveTo(Xo, Yo);
    LineTo(Xo + Round((R + 35) * cos(A)), Yo - Round((R + 35) * sin(A)));
  end;
 
  StretchBlt(Canvas.Handle, 0, 0, Width, Height, tmp.Canvas.Handle,
             0, 0, tmp.Width, tmp.Height, SRCCOPY);
end;
 
procedure TPanel.SetScale;
var
  i, j,
  Xo, Yo,
  X, Y,
  R: Integer;
  A, dA: Real;
 
  s: String;
 
begin
  Xo := 400;
  Yo := 400;
  R := 300;
  A2 := -200;
  A1 := 180 - ((180 + A2) div 2);
 
  // óñòàíîâêà ÷èñëà äåëåíèé
  Form1.TrackBar1.Max := Abs(A2);//A1 + A2 âûíåñòè èç êëàññà êàê ñâ-âà
//  Form1.TrackBar1.Min := A1;
 
  A := A1 * pi / 180;
  dA := A2 / (FnBSerif * (FnSSerif + 1)) * pi / 180;
 
  MinValue := -3;
  MaxValue := 5;
 
  ValueFormat := '0.0';
 
  with FScale.Canvas, Pen do
  begin
 
    Brush.Color := clMoneyGreen;
    FillRect(ClipRect);
 
    Brush.Style := bsClear;
    Font.Size := 16;
    Width := 20;
    Color := clWhite;
    Ellipse(Xo - R, Yo - R, Xo + R, Yo + R);
 
    Width := 5;
    Color := clBlue;
    MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
    Windows.AngleArc(FScale.Canvas.Handle, Xo, Yo, R, A1, A2);
 
    MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
    LineTo(Xo + Round((R + 35) * cos(A)), Yo - Round((R + 35) * sin(A)));
 
    s := FormatFloat(ValueFormat, MinValue);
    MoveTo(Xo + Round((R + 50) * cos(A)), Yo - Round((R + 50) * sin(A)));
    TextOut(PenPos.X - TextWidth(s) div 2, PenPos.Y - TextHeight(s) div 2, s);
 
    for i := 0 to FnBSerif - 1 do
    begin
      for j := 1 to FnSSerif do
      begin
        A := A + dA;
        MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
        LineTo(Xo + Round((R + 15) * cos(A)), Yo - Round((R + 15) * sin(A)));
 
//        s := IntToStr(i-1) + ',' + IntToStr(2 * j);
        s := FormatFloat(ValueFormat, MinValue + (MaxValue - MinValue) / (FnBSerif * (FnSSerif - 1)) * (i * FnBSerif + j));
        X := Xo + Round((R + 30) * cos(A) - TextWidth(s)  / 2);
        Y := Yo - Round((R + 30) * sin(A) + TextHeight(s) / 2);
        TextOut(X, Y, s);
      end;
 
      A := A + dA;
      MoveTo(Xo + Round(R * cos(A)), Yo - Round(R * sin(A)));
      LineTo(Xo + Round((R + 35) * cos(A)), Yo - Round((R + 35) * sin(A)));
 
//      s := IntToStr(i);
      s := FormatFloat(ValueFormat, MinValue + (MaxValue - MinValue) / FnBSerif * (i + 1));
      X := Xo + Round((R + 50) * cos(A) - TextWidth(s)  / 2);
      Y := Yo - Round((R + 50) * sin(A) + TextHeight(s) / 2);
      TextOut(X, Y, s);
    end;
  end;
end;
 
procedure TPanel.SetSwivel(ASwivel: Integer);
begin
  FNewSwivel := A1 - ASwivel;
  if Abs(FSwivel - FNewSwivel) < 5 then
    FSwivel := FNewSwivel
  else
    Timer1.Enabled := True;
  Repaint;
end;
 
procedure TPanel.SetValue(AValue: Real);
begin
  if AValue < MinValue then
    Swivel := 0
  else
    if AValue > MaxValue then
      Swivel := -A2
    else
    begin
      Swivel := Round(-A2 / (MaxValue - MinValue) * (AValue - MinValue));
    end;
end;
 
function TPanel.GetValue: Real;
begin
  Result := MinValue - (MaxValue - MinValue) / A2 * (A1 - FSwivel);
end;
 
procedure TPanel.Timer1Timer(Sender: TObject);
begin
  if FSwivel <> FNewSwivel then
  begin
    FSwivel := FSwivel + (FNewSwivel - FSwivel) div 5 + (FNewSwivel - FSwivel) mod 5;
  end else
    Timer1.Enabled := False;
  Repaint;
  Form1.Caption := FloatToStr(Value);
end;
 
end.
Вложения
Тип файла: rar Аналоговая шкала.rar (3.0 Кб, 9 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.11.2014, 20:20

как нарисовать стрелку в GDI+?
Кто-нибудь подскажите как нарисовать стрелку.я нарисовал линию, теперь чтобы получилась стрелка мне надо построить треугольник на конце...

Как нарисовать стрелку с наконечником не на конце?
Здравствуйте! Рисую стрелку этим кодомprocedure arrow(nachalo,konec:tpoint); var B, deltaX, deltaY: Extended; begin ...

как нарисовать стрелку в конце дуги?
всем здравствуйте! возникла у меня такая проблема: есть дуга (может быть повёрнут относительно своего цента как угодно), требуется...

Как в WPF нарисовать круг и стрелку ?
По заданию мне нужно нарисовать граф, который будет находить кратчайшие пути...кругом я хочу отметить города ( внутри круга будет цифра), а...

Как на конце линии нарисовать крупную стрелку
Здравствуйте) нашел как нарисовать обычную стрелку на конце линии, но она очень мелкая, пару миллиметров всего. Как сделать, чтобы она...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru