Простий індикатор (LED), Delphi, Програмування, статті

Небесна мережа

Тут представлений простий компонент, імітує тривимірний світлодіод (LED). Можна встановлювати стан Включено / Вимкнено. При зміну стану доступно Подія
"OnChange".

Сподіваюся компонент вам сподобається!

Почнемо зі створення нового проекту, збережемо його в окремій директорії і продекларіруем деякі речі для нашого світлодіода.

type
TdsLed1 = class(TGraphicControl)
private
FOnColor: TColor;
FOffColor: TColor;
FLedOn: Boolean;
FOnChange: TNotifyEvent;

procedure SetLedOn(Value: Boolean);
procedure SetOnColor(Value: TColor);
procedure SetOffColor(Value: TColor);

procedure DrawLedEllipse;
protected
procedure Paint; override;
procedure DoChange; virtual;
public
constructor Create(AOwner: TComponent); override;
published
property OnColor: TColor read FOnColor write SetOnColor;
property OffColor: TColor read FOffColor write SetOffColor;
property LedOn: Boolean read FLedOn write SetLedOn;

property Visible;

property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;

TGraphicControl буде предком для нашого TdsLed1. TGraphicControl – базовий клас для всіх невізуальних компонентів. Ви можете прочитати все про це класі в Delphi help. Причина, по якій ми його вибрали, в тому, що нам немає необхідності вводити які-небудь дані для світлодіода (тобто нам немає необхідності мати заголовок (handle) вікна Windows). Заголовки віднімають системні ресурси. Оскільки ми не потребуємо заголовку вікна, то отримуємо менші вимоги до системних ресурсів і перемальовування світлодіода буде відбуватися швидше.
Ми хочемо включати і відключати колір. Властивості FOnColor і FOffColor використовуються для цього. Ми хочемо змінювати стан включено / вимкнено. Подія FLedOn використовується для цього. OnChange подія має відбуватися при зміні стану світлодіода. FOnChange подія використовується для цього.

Ми будемо декларувати всі ці речі як властивості. Також, ми перепишемо властивість Visible для класу
TGraphicControl.

TGraphicControl не робить щось сам. Для того, щоб щось побачити, ми повинні перевизначити метод Paint і намалювати щось на канві.

Тепер приступимо до написання коду.

По-первихl, ми хочемо, щоб наш конструктор проводив деяку ініціалізацію. Перепишемо конструктор наступним чином:

constructor TdsLed1.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
FOnColor := clLime;
FOffColor := clRed;
FLedOn := false;
Width := 24;
Height := 24;
end;

Як ви можете побачити, ми визначили подія DoChange як віртуальне (virtual). Тільки віртуальні і динамічні методи можуть бути переписані. Перепишемо метод наступним чином:
procedure TdsLed1.DoChange;
begin
if Assigned(FOnChange) then FOnChange(self);
end;
Це і все, що робить даний метод.
Наступні два методи теж прості:

procedure TdsLed1.SetOnColor(Value: TColor);
begin
if FOnColor <> Value then
begin
FOnColor := Value;
Refresh;
end;
end;
procedure TdsLed1.SetOffColor(Value: TColor);
begin
if FOffColor <> Value then
begin
FOffColor := Value;
Refresh;
end;
end;

Обговоримо тільки одну річ. Оновлення (Refresh). Ми можемо викликати метод Invalidate, але ви знаєте, що медот Invalidate буде оновлювати наш світлодіод, тільки коли у Windows з’явиться час для цього. Тепер припустимо, що ви перемикаєте стан світлодіода на початку довгого процесу. If we would use
invalidate, led would switch to a different color when Application.ProcessMessages would
be called or never, if we wouldn’t call Application.ProcessMessages. Refresh repaints
control immediately, before anything else will go on. Exactly what we need.
When we switch on/off state of a led, this should happen:

procedure TdsLed1.SetLedOn(Value: Boolean);
begin
if Value <> FLedOn then
begin
FLedOn := Value;
Refresh;
DoChange;
end;
end;
If state should change, switch state, refresh led and trigger OnChange event.
Тепер велика частина. Малювання.

procedure TdsLed1.Paint;
begin
if FLedOn then
Canvas.Brush.Color := FOnColor
else
Canvas.Brush.Color := FOffColor;
DrawLedEllipse;
end;

procedure TdsLed1.DrawLedEllipse;
var
R: TRect;
off: Integer;
begin
R := ClientRect;

if Height > Width then
off := Width div 5
else
off := Height div 5;

with Canvas do
begin
Pen.Color := Canvas.Brush.Color;
Ellipse(R.Left, R.Top, R.Right, R.Bottom);

/ / 3D ефект
Pen.Color := clWhite;
Brush.Color := clWhite;
Chord(R.Left+off, R.Top+off, R.Right-off, R.Bottom-off, R.Right div 2,
R.Top+off, R.Left+off, R.Bottom div 2);
end;
end;

We defined drawing an ellipse led as a separated procedure. Why? You could write your own
routines to paint rectangle, triangle or whatever. In fact, we will do that in one of the
upcoming articles. All we do is set up the right color, draw a circle and a 3D effect. I
won’t explain Chord method since you should be able to try it out for yourself.
Should we try our code now?

Напишіть метод OnCreate для форми:

procedure TForm1.FormCreate(Sender: TObject);
begin
l := TdsLed1.Create(Self);
l.Parent := Self;
end;
Не забудьте задекларувати:
l: TdsLed1;
в private секції форми TForm1.
Розташуйте додаткову кнопку на формі і напишіть код:

procedure TForm1.Button1Click(Sender: TObject);
begin
l.LedOn := not l.LedOn;
end;

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*