// Eine Komponente
zum Zählen von Impulsen mit einer Frequenz ab
// einer Zehntelsekunde aufwärts. Man kann die Zahlenbasis der
// Komponente zwischen 2 (Dual) und 16 (Hexadezimal) festlegen.
// Die Größe der Komponente wird von der Eigenschaft "Fontsize"
// bestimmt (Bitte nicht mit "Font.Size" verwechseln).
// Jedesmal wenn die Eigenschaft "Eingang" auf "True" gesetzt
// wird, erhöht sich der Wert der Komponente um "1". Ist die
// Zahlenbasis erreicht, wird der Wert "0" und "OnUebertrag" wird
// ausgelöst. Ist ein "Nachfolger" benannt, wird außerdem dessen
// Eingang auf "True" gesetzt.
// Siehe dazu die Beispiele am Seitenende.
// Setzt man den Wert einer Komponente auf "-1", zeigt die Komponente
// einen Punkt an. Bei "-2" einen Doppelpunkt. In beiden Fällen wird
// ein Impuls von der Komponente ohne Änderung durchgereicht.
// Rückwärtszählen ist nicht möglich.
|
Komponentenansicht |
|
Beispiel "Dualanzeige"
(hier
animiert) |
|
Beispiel "Uhr"
(hier nicht
animiert) |
// Getestet mit D4 unter XP
unit Zaehler;
interface
uses
Windows, Extctrls, Classes, Graphics, Controls;
type
TBType = 2..16;
TWtype = -2..15;
TZaehler = class(TCustomPanel)
private
FUeb, FChg: TNotifyEvent;
FCNE, FFarbe: TColor;
FNach: TZaehler;
FBasis: TBType;
FEin: boolean;
FWert: TWtype;
protected
procedure zeichen;
procedure ausgang;
function getrand: byte;
function getcol: TColor;
function getfontsize: byte;
procedure setrand(b: byte);
procedure setcol(c: TColor);
function getsunken: boolean;
procedure setcNE(c: TColor);
procedure setein(b: boolean);
procedure setwert(w: TWtype);
procedure setbasis(b: TBType);
procedure setfarbe(c: TColor);
procedure setnach(z: TZaehler);
procedure setfontsize(b: byte);
procedure setsunken(b: boolean);
public
procedure resize; override;
destructor Destroy; override;
procedure SetEnabled(Value: boolean); override;
constructor Create(AOwner: TComponent); override;
published
property FontSize: byte read getfontsize write setfontsize;
property Versunken: boolean read getsunken write setsunken;
property OnUebertrag: TNotifyEvent read FUeb write FUeb;
property Nachfolger: TZaehler read FNach write setnach;
property OnChange: TNotifyEvent read Fchg write Fchg;
property FontColor: TColor read getcol write setcol;
property Basis: TBType read FBasis write setbasis;
property Farbe: TColor read FFarbe write setfarbe;
property Eingang: boolean read FEin write setein;
property FarbeNE: TColor read FCNE write setcNE;
property Wert: TWtype read FWert write setwert;
property Rand: Byte read getrand write setrand;
property ParentShowHint;
property ShowHint;
property Visible;
property Enabled;
end;
procedure Register;
implementation
constructor TZaehler.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FNach := nil;
autosize := false;
FBasis := 10;
bevelouter := bvLowered;
bevelwidth := 3;
FWert := 0;
zeichen;
color := clBlack;
FFarbe := color;
FCNE := clGray;
Font.Name := 'Arial';
Font.Color := clwhite;
Font.Style := [fsBold];
Font.Size := 24;
resize;
end;
destructor TZaehler.Destroy;
begin
inherited Destroy;
end;
procedure TZaehler.setrand(b: byte);
var
w: integer;
begin
if width > height then w := height
else w := width;
if b > w div 2 - 1 then b := w div 2 - 1;
if b = BevelWidth then exit;
Bevelwidth := b;
resize;
end;
procedure TZaehler.setsunken(b: boolean);
begin
if b then bevelouter := bvLowered
else bevelouter := bvRaised;
end;
function TZaehler.getsunken: boolean;
begin
result := bevelouter <> bvRaised;
end;
function TZaehler.getrand: byte;
begin
result := bevelwidth;
end;
procedure TZaehler.resize;
begin
width := round(bevelwidth * 2 + Font.Size);
height := round(bevelwidth * 2 + Font.Size * 1.3);
end;
function TZaehler.getfontsize: byte;
begin
result := Font.Size;
end;
procedure TZaehler.setfontsize(b: byte);
begin
if b = Font.Size then exit;
Font.Size := b;
resize;
end;
procedure TZaehler.setbasis(b: TBType);
begin
if b = FBasis then exit;
FBasis := b;
FWert := 0;
zeichen;
end;
procedure TZaehler.zeichen;
begin
case FWert of
-1: caption := '.';
-2: caption := ':';
0..9: caption := chr(FWert + 48);
10..15: caption := chr(FWert + 55);
end;
end;
procedure TZaehler.setwert(w: TWtype);
begin
if (w = FWert) or not enabled then exit;
if w >= FBasis then FWert := 0 else
FWert := w;
zeichen;
if assigned(FChg) then FChg(self);
end;
procedure TZaehler.setcol(c: TColor);
begin
if c = Font.color then exit;
Font.color := c;
end;
function TZaehler.getcol: TColor;
begin
result := Font.color;
end;
procedure TZaehler.SetEnabled(Value: boolean);
begin
inherited;
if not enabled then
color := FCNE else
color := FFarbe;
end;
procedure TZaehler.setcNE(c: TColor);
begin
if FCNE = c then exit;
FCNE := c;
if not enabled then invalidate;
end;
procedure TZaehler.ausgang;
begin
if FNach <> nil then FNach.eingang := true;
if assigned(FUeb) then FUeb(self);
end;
procedure TZaehler.setein(b: boolean);
begin
if (b = FEin) or not b or not enabled then exit;
FEin := true;
if FWert >= 0 then begin
inc(FWert);
if FWert = FBasis then begin
FWert := 0;
ausgang;
end;
zeichen;
end else ausgang;
FEin := false;
if assigned(FChg) then FChg(self);
end;
procedure TZaehler.setfarbe(c: TColor);
begin
if c = FFarbe then exit;
FFarbe := c;
if enabled then
color := c;
end;
procedure TZaehler.setnach(z: TZaehler);
begin
if (z = self) or not (z is TZaehler)
then FNach := nil
else FNach := z;
end;
procedure Register;
begin
RegisterComponents('DBR', [TZaehler]);
end;
end.
*********************************************************************
Beispiel "Dualanzeige"
uses Zaehler;
var
zarr: array[0..2] of TZaehler;
procedure TForm1.FormCreate(Sender: TObject);
var
x: integer;
begin
for x := 0 to high(zarr) do begin
zarr[x] := TZaehler.create(self);
with zarr[x] do begin
basis := 2;
if x > 0 then nachfolger := zarr[x - 1];
rand := 0;
farbe := clblue;
fontcolor := clyellow;
top := 10;
left := 10 + width * x;
zarr[x].parent := self;
end;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
x: integer;
begin
for x := 0 to high(zarr) do
zarr[x].free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
zarr[high(zarr)].eingang := true;
end;
//--------------------------------------------------------------------------
Beispiel "Uhr"
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private-Deklarationen }
public
procedure change(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses Zaehler;
var
zarr: array[0..7] of TZaehler;
procedure TForm1.FormCreate(Sender: TObject);
var
x: integer;
begin
Timer1.interval := 1000;
for x := 0 to high(zarr) do begin
zarr[x] := TZaehler.create(self);
with zarr[x] do begin
if x > 0 then nachfolger := zarr[x - 1];
rand := 1;
fontcolor := clLime;
top := 10;
left := 10 + width * x;
zarr[x].parent := self;
end;
end;
zarr[2].wert := -2;
zarr[5].wert := -2;
zarr[3].basis := 6;
zarr[6].basis := 6;
zarr[1].OnChange := Change;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
x: integer;
begin
for x := 0 to high(zarr) do
zarr[x].free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
zarr[high(zarr)].eingang := true;
end;
procedure TForm1.FormShow(Sender: TObject);
var
Hour, Min, Sec, MSec: Word;
begin
decodetime(Time, Hour, Min, Sec, MSec);
zarr[0].wert := hour div 10;
zarr[1].wert := hour mod 10;
zarr[3].wert := Min div 10;
zarr[4].wert := Min mod 10;
zarr[6].wert := Sec div 10;
zarr[7].wert := Sec mod 10;
end;
procedure TForm1.change;
begin
if (zarr[1].wert = 4) and
(zarr[0].wert = 2) then begin
zarr[0].wert := 0;
zarr[1].wert := zarr[0].wert;
end;
end;
|