Содержание материала

 

Предположим, у вас есть StatusBar с 4-мя панелями, плюс таймер. Тогда вы можете сделать:

Code:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

with StatusBar1 do

begin

   if GetKeyState(VK_CAPITAL) <> 0 then

     panels[0].text := ' CAP'

   else

     panels[0].text := '';

   if GetKeyState(VK_NUMLOCK) <> 0 then

     panels[1].text := ' NUM'

   else

     panels[1].text := '';

   if GetKeyState(VK_SCROLL) <> 0 then

     panels[2].text := ' SCRL'

   else

     panels[2].text := '';

   panels[3].text := ' ' + DateTimeToStr(now);

end;

end;

 


 

О том, как можно изменить формат вывода даты, доходчиво и с примерами изложено в электронной справке, в разделе, посвященный датам (Date). Обратите внимание на то, что свойство Text имеет тип строки, поэтому вы не можете написать panels[0].text := DateTime(now), т.к. дата/время имеет тип Double.

 

Code:

unit Status;

 

interface

 

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

Forms, Dialogs, ExtCtrls, Menus, Gauges;

 

type

 

TStatus = class(TCustomPanel)

private

   FDate: Boolean;

   FKeys: Boolean;

   FTime: Boolean;

   FResources: Boolean;

   DateTimePanel: TPanel;

   ResPanel: TPanel;

   ResGauge: TGauge;

   CapPanel: TPanel;

 

   NumPanel: TPanel;

   InsPanel: TPanel;

   HelpPanel: TPanel;

   UpdateWidth: Boolean;

   FTimer: TTimer;

   procedure SetDate(A: Boolean);

   procedure SetKeys(A: Boolean);

   procedure SetTime(A: Boolean);

   procedure SetResources(A: Boolean);

   procedure SetCaption(A: string);

   function GetCaption: string;

   procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;

 

public

   constructor Create(AOwner: TComponent); override;

   destructor Destroy; override;

   procedure SetupPanelFields(ThePanel: TPanel);

   procedure SetupPanel(ThePanel: TPanel; WidthMask: string);

   procedure UpdateStatusBar(Sender: TObject);

published

   property ShowDate: Boolean read FDate write SetDate default True;

   property ShowKeys: Boolean read FKeys write SetKeys default True;

 

   property ShowTime: Boolean read FTime write SetTime default True;

   property ShowResources: Boolean read FResources write SetResources

     default True;

 

   property BevelInner;

   property BevelOuter;

   property BevelWidth;

   property BorderStyle;

   property BorderWidth;

   property Caption: string read GetCaption write SetCaption;

 

   property Color;

   property Ctl3D;

   property DragCursor;

   property DragMode;

   property Enabled;

   property Font;

   property ParentColor;

   property ParentCtl3d;

   property ParentFont;

   property ParentShowHint;

   property PopUpMenu;

   property ShowHint;

   property Visible;

end;

 

procedure Register;

implementation

 

procedure Register;

begin

 

RegisterComponents('Additional', [TStatus]);

end;

 

procedure TStatus.SetupPanelFields(ThePanel: TPanel);

begin

 

with ThePanel do

begin

   Alignment := taCenter;

   Caption := '';

   BevelInner := bvLowered;

   BevelOuter := bvNone;

   {Установите все в True, чтобы все это отразилось на TStatus}

   ParentColor := True;

   ParentFont := True;

 

   ParentCtl3D := True;

end;

end;

 

procedure TStatus.SetupPanel(ThePanel: TPanel; WidthMask: string);

begin

 

SetupPanelFields(ThePanel);

with ThePanel do

begin

   Width := Canvas.TextWidth(WidthMask);

   Align := alRight;

end;

end;

 

constructor TStatus.Create(AOwner: TComponent);

begin

 

inherited Create(AOwner);

Parent := TWinControl(AOwner);

 

FTime := True;

FDate := True;

FKeys := True;

FResources := True;

{Заставляем строку состояния выровняться по нижнему краю}

Align := alBottom;

Height := 19;

BevelInner := bvNone;

BevelOuter := bvRaised;

{Если UpdateWidth равен TRUE, StatusBar пересчитывает только ширину панелей}

UpdateWidth := True;

Locked := True;

TabOrder := 0;

;

TabStop := False;

Font.Name := 'Arial';

Font.Size := 8;

{Создаем панель, которая будет отображать дату и время}

 

DateTimePanel := TPanel.Create(Self);

DateTimePanel.Parent := Self;

SetupPanel(DateTimePanel, '  00/00/00 00:00:00 дп  ');

{СОздаем панель, которая будет содержать графику ресурсов}

ResPanel := TPanel.Create(Self);

ResPanel.Parent := Self;

SetupPanel(ResPanel, '                    ');

{Создаем 2 Gauges, которые размещаем на Resource Panel}

ResGauge := TGauge.Create(Self);

ResGauge.Parent := ResPanel;

ResGauge.Align := alClient;

 

ResGauge.ParentFont := True;

ResGauge.BackColor := Color;

ResGauge.ForeColor := clLime;

ResGauge.BorderStyle := bsNone;

{Создаем панель, которая будет отображать состояние CapsLock}

CapPanel := TPanel.Create(Self);

CapPanel.Parent := Self;

SetupPanel(CapPanel, '  Cap  ');

{Создаем панель, которая будет отображать состояние NumLock}

NumPanel := TPanel.Create(Self);

NumPanel.Parent := Self;

SetupPanel(NumPanel, '  Num  ');

 

{Создаем панель, которая будет отображать состояние Insert/Overwrite}

InsPanel := TPanel.Create(Self);

InsPanel.Parent := Self;

SetupPanel(InsPanel, '  Ins  ');

{Создаем панель, которая будет отображать текст состояния}

HelpPanel := TPanel.Create(Self);

HelpPanel.Parent := Self;

SetupPanelFields(HelpPanel);

{Имеем вспомогательную панель, занимающую все остальное пространство}

HelpPanel.Align := alClient;

HelpPanel.Alignment := taLeftJustify;

 

{Это таймер, который регулярно обновляет строку состояния}

FTimer := TTimer.Create(Self);

if FTimer <> nil then

begin

   FTimer.OnTimer := UpdateStatusBar;

   {Обновление происходит дважды в секунду}

   FTimer.Interval := 500;

   FTimer.Enabled := True;

end;

end;

 

destructor TStatus.Destroy;

begin

 

FTimer.Free;

HelpPanel.Free;

 

InsPanel.Free;

NumPanel.Free;

CapPanel.Free;

ResGauge.Free;

ResPanel.Free;

DateTimePanel.Free;

inherited Destroy;

end;

 

procedure TStatus.SetDate(A: Boolean);

begin

 

FDate := A;

UpdateWidth := True;

end;

 

procedure TStatus.SetKeys(A: Boolean);

begin

 

FKeys := A;

UpdateWidth := True;

end;

 

procedure TStatus.SetTime(A: Boolean);

begin

 

FTime := A;

UpdateWidth := True;

end;

 

procedure TStatus.SetResources(A: Boolean);

begin

 

FResources := A;

UpdateWidth := True;

end;

 

{Если мы получаем или устанавливаем заголовок TStatus, то вместо этого задаем

заголовок HelpPanel}

 

procedure TStatus.SetCaption(A: string);

begin

 

HelpPanel.Caption := ' ' + A;

end;

 

function TStatus.GetCaption: string;

begin

 

GetCaption := HelpPanel.Caption;

end;

 

{Данная процедура устанавливает соответствующие заголовки}

 

procedure TStatus.UpdateStatusBar(Sender: TObject);

begin

 

if ShowDate and ShowTime then

   DateTimePanel.Caption := DateTimeToStr(Now)

else if ShowDate and not ShowTime then

   DateTimePanel.Caption := DateToStr(Date)

else if not ShowDate and ShowTime then

 

   DateTimePanel.Caption := TimeToStr(Time)

else

   DateTimePanel.Caption := '';

if UpdateWidth then

   with DateTimePanel do

     if ShowDate or ShowTime then

       Width := Canvas.TextWidth(' ' + Caption + ' ')

     else

       Width := 0;

if ShowResources then

begin

   ResGauge.Progress := GetFreeSystemResources(GFSR_SYSTEMRESOURCES);

 

   if ResGauge.Progress < 20 then

     ResGauge.ForeColor := clRed

   else

     ResGauge.ForeColor := clLime;

end;

if UpdateWidth then

   if ShowResources then

     ResPanel.Width := Canvas.TextWidth('                    ')

   else

     ResPanel.Width := 0;

if ShowKeys then

begin

   if (GetKeyState(vk_NumLock) and $01) <> 0 then

 

     NumPanel.Caption := '  Num  '

   else

     NumPanel.Caption := '';

   if (GetKeyState(vk_Capital) and $01) <> 0 then

     CapPanel.Caption := '  Cap  '

   else

     CapPanel.Caption := '';

   if (GetKeyState(vk_Insert) and $01) <> 0 then

     InsPanel.Caption := '  Ins  '

   else

     InsPanel.Caption := '';

end;

if UpdateWidth then

   if ShowKeys then

 

   begin

     NumPanel.Width := Canvas.TextWidth(' Num ');

     InsPanel.Width := Canvas.TextWidth(' Ins ');

     CapPanel.Width := Canvas.TextWidth(' Cap ');

   end

   else

   begin

     NumPanel.Width := 0;

     InsPanel.Width := 0;

     CapPanel.Width := 0;

   end;

UpdateWidth := False;

end;

 

{Позволяем изменять шрифты, используемые панелями для вывода текста}

 

procedure TStatus.CMFontChanged(var Message: TMessage);

begin

 

inherited;

UpdateWidth := True;

end;

 

end.

 

interface

 

implementation

 

end.

 

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить