[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / Pascal - Delphi /

Простой индикатор (LED)

Небесная сеть


Здесь представлен простой компонент , имитирующий трехмерный светодиод (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;




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / Pascal - Delphi /

Работа со шрифтами на Win API
06-06-2010   

Сегодня поговорим о шрифтах, и о том, каким образом работать с ними на Win API. Нам потребуется переменная типа HFONT. Изменить стиль шрифта можно у любого компонента, я покажу это на примере кнопки... подробнее

Кол. просмотров: общее - 3901 сегодня - 0

Работа с таймером на Win API
06-06-2010   

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

Кол. просмотров: общее - 3917 сегодня - 0

Работа с мультимедийным таймером на Win API
06-06-2010   

Мы уже знакомы с системным таймером, сегодня познакомимся с мультимедийным, основное отличие которого, более высокая скорость (точность) работы... подробнее

Кол. просмотров: общее - 4056 сегодня - 0

Создание CheckBoxов средствами Win API
06-06-2010   

Сегодня наша программа научится работать с CheckBoxами. CheckBox можно представить как флаг, который можно установить или сбросить, и в зависимости от его состояния выполнять определенные действия... подробнее

Кол. просмотров: общее - 4181 сегодня - 0

Создание группы RadioButton средствами Win API
06-06-2010   

В прошлый раз мы сделали несколько радио-кнопок, которые автоматически объединялись в одну группу. Сейчас рассмотрим, как создавать несколько независимых групп радио-кнопок... подробнее

Кол. просмотров: общее - 3953 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects