home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 October
/
Chip_2001-10_cd1.bin
/
zkuste
/
delphi
/
kompon
/
d123456
/
CHEMPLOT.ZIP
/
Misc
/
Switch.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2000-07-13
|
20KB
|
546 lines
{
Programm : SWITCH.PAS
Sprache : Delphi
Zweck : Schalter-Komponente
Datum : 15, 16. Feb. 1996
Autor : U.Jnr-
This component simulates a luffing switch as used in many electic devices.
No Bitmaps are used, so it's fully scaleable.
Sorry for comments are in german.
Hint: Why do so many programers hide theire sources? Is this the real
sense of "share" ?
Greeting from germany - enjoy...
}
unit
Switch;
interface
uses
WinTypes, WinProcs, Messages, Classes, Controls, Graphics;
{------------------------------------------------------------------------------}
type
RectArray = array[0..3] of TPoint; {Vektorarraytyp fnr Rechteck}
TriArray = array[0..2] of TPoint; {Vektorarraytyp fnr Dreieck}
TSwitchType = (stHor_Rocker, stVert_Rocker, stButton);
TSwitch = class(TCustomControl)
private
TopShape: TriArray; {Dreieck Vektoren von Schalteroberseite}
OnShape: RectArray; {Rechteck Vektoren von Schalterfront "ON"}
OffShape: RectArray; {Rechteck Vektoren von Schalterfront "OFF"}
SideShape: RectArray; {Rechteck Vektoren von Schalterseite}
FOnChanged: TNotifyEvent; {Verbindung zur Aussenwelt}
FOnChecked: TNotifyEvent; {Verbindung zur Aussenwelt}
FOnUnChecked: TNotifyEvent; {Verbindung zur Aussenwelt}
FCaptionOn: TCaption; {Beschriftung Schalterstellung "ON"}
FCaptionOff: TCaption; {Beschriftung Schalterstellung "OFF"}
FChecked: Boolean; {Flag von Schalterstellung}
FCheckedLeft: Boolean; {Flag ob "ON" links oder rechts dargestellt wird}
FSlope: Byte; {Neigung (3D Effekt) des Schalters}
FSideLength: Byte; {Seitenabstand fnr hervorstehendes Schalterteil}
FOnColor: TColor; {Farbe fnr Frontfl_che "ON"}
FOffColor: TColor; {Farbe fnr Frontfl_che "OFF"}
FTopColor: TColor; {Farbe fnr Schalteroberseite}
FSideColor: TColor; {Farbe fnr Seitenfl_che}
FSwitchType: TSwitchType; {added by MB}
ALeft: Integer; {Linke Anfangsposition des Schalters}
ATop: Integer; {Obere Anfangsposition des Schalters}
AHeight: Integer; {Hwhe des Schalters}
AWidth: Integer; {Breite des Schalters}
LabelLen: Integer; {Halbbreite des Schalters}
LabelOfs: Integer; {Halbbreite fnr Spiegeldarstellung}
Side: Integer; {Tempor_r in Setup verwendet}
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure CallNotifyEvent;
procedure Setup;
procedure SetupVert;
{Modified by MJB:}
procedure Draw_Hor_Rocker;
{Added by MJB:}
procedure Draw_Vert_Rocker;
procedure Draw_Button;
procedure SetCaptionOn(Value: TCaption);
procedure SetCaptionOff(Value: TCaption);
procedure SetChecked(Value: Boolean);
procedure SetCheckedLeft(Value: Boolean);
procedure SetSlope(Value: Byte);
procedure SetSideLength(Value: Byte);
procedure SetOnColor(Value: TColor);
procedure SetOffColor(Value: TColor);
procedure SetTopColor(Value: TColor);
procedure SetSideColor(Value: TColor);
procedure SetSwitchType(Value: TSwitchType);
public
constructor Create(AOwner: TComponent); override;
procedure Paint; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
published
property CaptionOn: TCaption read FCaptionOn write SetCaptionOn;
property CaptionOff: TCaption read FCaptionOff write SetCaptionOff;
property Checked: Boolean read FChecked write SetChecked default False;
property CheckedLeft: Boolean read FCheckedLeft write SetCheckedLeft default True;
property Slope: Byte read FSlope write SetSlope default 6;
property SideLength: Byte read FSideLength write SetSideLength default 6;
property OnColor: TColor read FOnColor write SetOnColor default clRed;
property OffColor: TColor read FOffColor write SetOffColor default clMaroon;
property TopColor: TColor read FTopColor write SetTopColor default clSilver;
property SideColor: TColor read FSideColor write SetSideColor default clSilver;
property SwitchType: TSwitchType read FSwitchType write SetSwitchType;
property Font;
property TabStop;
property TabOrder;
property ShowHint;
property Visible;
property OnClick;
property OnMouseDown;
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
property OnChecked: TNotifyEvent read FOnChecked write FOnChecked;
property OnUnChecked: TNotifyEvent read FOnUnChecked write FOnUnChecked;
end;
{------------------------------------------------------------------------------}
procedure Register;
implementation
{------------------------------------------------------------------------------}
constructor TSwitch.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Caption:='';
FCaptionOn:='On';
FCaptionOff:='Off';
FSlope:=6;
FSideLength:=6;
FChecked:=False;
FCheckedLeft:=True;
FOnColor:=clLime;
FOffColor:=clRed;
FTopColor:=clSilver;
FSideColor:=clGray;
FOnChecked:=nil;
FOnUnChecked:=nil;
SetBounds(Left,Top,83,18 + FSlope);
{Font.Name:='small fonts';
Font.Size:=7;
Font.Color:=clBtnText;}
end;
{------------------------------------------------------------------------------}
procedure TSwitch.Paint;
begin
case FSwitchType of
stHor_Rocker: Draw_Hor_Rocker; {Keine geerbte Methode aufrufen und sofort Schalter zeichnen}
stVert_Rocker: Draw_Vert_Rocker;
stButton: Draw_Button;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
inherited MouseDown(Button,Shift,X,Y);
if (Button = mbLeft) then
begin
SetFocus;
if ((LabelLen > 0) and (X > LabelLen)) or
((LabelLen < 0) and (X < Abs(LabelLen))) then
begin {Nur wenn Mausklick innerhalb des hervorgehobenen Schalterteil ist}
FChecked:=not FChecked;
CallNotifyEvent;
Invalidate;
end;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.WMSetFocus(var Message: TWMSetFocus);
begin
Invalidate;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.WMKillFocus(var Message: TWMKillFocus);
begin
Invalidate;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.KeyDown(var Key: Word; Shift: TShiftState);
begin
if Focused and ((Key = VK_Space) or (Key = VK_Return)) then
begin
FChecked:=not FChecked;
CallNotifyEvent;
Invalidate;
Click;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.CallNotifyEvent; {Au-enwelt informieren}
begin
if Assigned(FOnChanged) then FOnChanged(Self);
if FChecked and Assigned(FOnChecked) then FOnChecked(Self) else
if not FChecked and Assigned(FOnUnChecked) then FOnUnChecked(Self);
end;
{------------------------------------------------------------------------------}
procedure TSwitch.Draw_Hor_Rocker; {Schalter zeichnen}
var
TW: Integer;
TH: Integer;
begin
Setup; {Vektoren fnr Schalterteile berechnen}
if Focused then Canvas.Rectangle(0,0,Width,AHeight + 1 + 2 * ATop);
Canvas.Pen.Color:=clWhite; {Umrandung von Schalter zeichnen}
Canvas.MoveTo(ALeft - 1,ATop + AHeight + 1);
Canvas.LineTo(ALeft + AWidth,ATop + AHeight + 1); {Untere Linie in weiss}
Canvas.LineTo(ALeft + AWidth,ATop - 2); {Rechte Linie in weiss}
Canvas.Pen.Color:=clGray;
Canvas.MoveTo(ALeft + AWidth,ATop - 1);
Canvas.LineTo(ALeft - 1,ATop - 1); {Obere Linie in dunkelgrau}
Canvas.LineTo(ALeft - 1,ATop + AHeight + 1); {Linke Linie in dunkelgrau}
Canvas.Pen.Color:=clBlack; {Polygonumrandung ist schwarz}
Canvas.Brush.Style:=bsSolid; {Fnllfl_che ist geschlossen}
Setup;
Canvas.Brush.Color:=FTopColor;
Canvas.Polygon(TopShape); {Top des Schalters zeichnen}
Canvas.Brush.Color:=FSideColor;
Canvas.Polygon(SideShape); {Seite des Schalters zeichnen}
if FChecked then Canvas.Brush.Color:=FOnColor
else Canvas.Brush.Color:=FOffColor;
Canvas.Polygon(OnShape); {On Seite des Schalters zeichnen}
Canvas.Brush.Color:=FOffColor;
Canvas.Polygon(OffShape); {Off Seite des Schalters zeichnen}
Canvas.Font:=Font; {Gew_hlten Font nbergeben}
Canvas.Brush.Style:=bsClear; {Transparente Textausgabe}
if FChecked then Caption:=FCaptionOn else Caption:=FCaptionOff;
if LabelLen > 0 then TW:=ALeft + ((Abs(LabelLen) - Canvas.TextWidth(Caption)) div 2)
else TW:=LabelOfs + ((Abs(LabelLen) - Canvas.TextWidth(Caption)) div 2);
TH:=ATop + ((AHeight - Canvas.TextHeight(Caption)) div 2);
Canvas.TextOut(TW,TH,Caption);
end;
{------------------------------------------------------------------------------}
procedure TSwitch.Draw_Vert_Rocker; {Schalter zeichnen}
var
TW: Integer;
TH: Integer;
begin
Setup; {Vektoren fnr Schalterteile berechnen}
if Focused then Canvas.Rectangle(0,0,Width,AHeight + 1 + 2 * ATop);
Canvas.Pen.Color:=clWhite; {Umrandung von Schalter zeichnen}
Canvas.MoveTo(ALeft - 1,ATop + AHeight + 1);
Canvas.LineTo(ALeft + AWidth,ATop + AHeight + 1); {Untere Linie in weiss}
Canvas.LineTo(ALeft + AWidth,ATop - 2); {Rechte Linie in weiss}
Canvas.Pen.Color:=clGray;
Canvas.MoveTo(ALeft + AWidth,ATop - 1);
Canvas.LineTo(ALeft - 1,ATop - 1); {Obere Linie in dunkelgrau}
Canvas.LineTo(ALeft - 1,ATop + AHeight + 1); {Linke Linie in dunkelgrau}
Canvas.Pen.Color:=clBlack; {Polygonumrandung ist schwarz}
Canvas.Brush.Style:=bsSolid; {Fnllfl_che ist geschlossen}
SetupVert;
Canvas.Brush.Color:=FTopColor;
Canvas.Polygon(TopShape); {Top des Schalters zeichnen}
Canvas.Brush.Color:=FSideColor;
Canvas.Polygon(SideShape); {Seite des Schalters zeichnen}
if FChecked then Canvas.Brush.Color:=FOnColor
else Canvas.Brush.Color:=FOffColor;
Canvas.Polygon(OnShape); {On Seite des Schalters zeichnen}
Canvas.Brush.Color:=FOffColor;
Canvas.Polygon(OffShape); {Off Seite des Schalters zeichnen}
Canvas.Font:=Font; {Gew_hlten Font nbergeben}
Canvas.Brush.Style:=bsClear; {Transparente Textausgabe}
if FChecked then Caption:=FCaptionOn else Caption:=FCaptionOff;
if LabelLen > 0 then TW:=ALeft + ((Abs(LabelLen) - Canvas.TextWidth(Caption)) div 2)
else TW:=LabelOfs + ((Abs(LabelLen) - Canvas.TextWidth(Caption)) div 2);
TH:=ATop + ((AHeight - Canvas.TextHeight(Caption)) div 2);
Canvas.TextOut(TW,TH,Caption);
end;
{------------------------------------------------------------------------------}
procedure TSwitch.Draw_Button; {Schalter zeichnen}
var
TW: Integer;
TH: Integer;
Depth: Integer;
begin
{Setup; {Vektoren fnr Schalterteile berechnen}
if Focused then Canvas.Rectangle(0,0,Width,Height);
Canvas.Pen.Color:=clWhite; {Umrandung von Schalter zeichnen}
Canvas.MoveTo(1, Height-1);
Canvas.LineTo(Width-1, Height - 1); {Untere Linie in weiss}
Canvas.LineTo(Width-1, 1); {Rechte Linie in weiss}
Canvas.Pen.Color:=clGray;
Canvas.MoveTo(Width-1, 1);
Canvas.LineTo(1, 1); {Obere Linie in dunkelgrau}
Canvas.LineTo(1, Height-1); {Linke Linie in dunkelgrau}
Canvas.Pen.Color:=clBlack; {Polygonumrandung ist schwarz}
Canvas.Brush.Style:=bsSolid; {Fnllfl_che ist geschlossen}
{Added / changed by MJB:}
Canvas.Brush.Color:=FTopColor;
Canvas.Rectangle(1,1, Width-1, Height-1);
if FChecked then Depth := FSlope div 2 else Depth := FSlope;
Canvas.Brush.Color:=FSideColor;
Canvas.Ellipse(FSideLength, FSideLength, Width-FSideLength, Height-FSideLength);
Canvas.Rectangle(Width div 2 - Depth, FSideLength, Width div 2, Height-FSideLength);
if FChecked then
Canvas.Brush.Color:=FOnColor
else Canvas.Brush.Color:=FOffColor;
Canvas.Ellipse(FSideLength- Depth, FSideLength, Width-FSideLength - Depth, Height-FSideLength);
Canvas.Font:=Font; {Gew_hlten Font nbergeben}
Canvas.Brush.Style:=bsClear; {Transparente Textausgabe}
if FChecked then Caption:=FCaptionOn else Caption:=FCaptionOff;
TW:=(Width - Canvas.TextWidth(Caption)) div 2 - Depth;
TH:=(Height - Canvas.TextHeight(Caption)) div 2;
Canvas.TextOut(TW,TH,Caption);
end;
{------------------------------------------------------------------------------}
procedure TSwitch.Setup; {Vektoren fnr Schalterteile berechnen}
begin
ALeft:=2; {2 Pixel linker Abstand fnr Rahmen und Focusrechteck}
ATop:=2; {2 Pixel oberer Abstand fnr Rahmen und Focusrechteck}
AHeight:=Height - FSlope - 2 * ATop; {Schalterhwhe = Height - Ofs - Neigung}
AWidth:=Width - 2 * ALeft; {Schalterbreite = Width - 2 * Ofs}
LabelLen:=AWidth div 2;
LabelOfs:=LabelLen + ALeft;
Side:=FSideLength;
if (not FChecked and FCheckedLeft) or (not FCheckedLeft and FChecked) then
begin
LabelLen:=-LabelLen;
Side:=-FSideLength;
end;
TopShape[0].X:=LabelOfs; {Vektoren von obere Dreieckfl_che berechnen}
TopShape[0].Y:=ATop;
TopShape[1].X:=LabelOfs + LabelLen - Side;
TopShape[1].Y:=ATop + FSlope;
TopShape[2].X:=LabelOfs + LabelLen;
TopShape[2].Y:=ATop;
OnShape[0].X:=LabelOfs - LabelLen; {Vektoren der "EIN" Frontseite berechnen}
OnShape[0].Y:=ATop;
OnShape[1]:=TopShape[0];
OnShape[2]:=OffShape[3];
OnShape[3].X:=OnShape[0].X;
OnShape[3].Y:=ATop + AHeight;
OffShape[0]:=TopShape[0]; {Vektoren der "AUS" Frontseite berechnen}
OffShape[1]:=TopShape[1];
OffShape[2].X:=OffShape[1].X;
OffShape[2].Y:=OffShape[1].Y + AHeight;
OffShape[3].X:=OffShape[0].X;
OffShape[3].Y:=ATop + AHeight;
SideShape[0]:=OffShape[1]; {Vektoren der Seitenfl_che berechnen}
SideShape[1]:=TopShape[2];
SideShape[2].X:=SideShape[1].X;
SideShape[2].Y:=ATop + AHeight;
SideShape[3]:=OffShape[2];
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetupVert; {Vektoren fnr Schalterteile berechnen}
begin
ALeft:=2; {2 Pixel linker Abstand fnr Rahmen und Focusrechteck}
ATop:=2; {2 Pixel oberer Abstand fnr Rahmen und Focusrechteck}
AHeight:=Height - FSlope - 2 * ATop; {Schalterhwhe = Height - Ofs - Neigung}
AWidth:=Width - 2 * ALeft; {Schalterbreite = Width - 2 * Ofs}
LabelLen:=AWidth div 2;
LabelOfs:=LabelLen + ALeft;
Side:=FSideLength;
if (not FChecked and FCheckedLeft) or (not FCheckedLeft and FChecked) then
begin
LabelLen:=-LabelLen;
Side:=-FSideLength;
end;
TopShape[0].Y:=-LabelOfs; {Vektoren von obere Dreieckfl_che berechnen}
TopShape[0].X:=ATop;
TopShape[1].Y:=LabelOfs + LabelLen - Side;
TopShape[1].X:=ATop + FSlope;
TopShape[2].Y:=LabelOfs + LabelLen;
TopShape[2].X:=ATop;
OnShape[0].Y:=LabelOfs - LabelLen; {Vektoren der "EIN" Frontseite berechnen}
OnShape[0].X:=ATop;
OnShape[1]:=TopShape[0];
OnShape[2]:=OffShape[3];
OnShape[3].Y:=OnShape[0].Y;
OnShape[3].X:=ATop + AHeight;
OffShape[0]:=TopShape[0]; {Vektoren der "AUS" Frontseite berechnen}
OffShape[1]:=TopShape[1];
OffShape[2].Y:=OffShape[1].Y;
OffShape[2].X:=OffShape[1].X + AHeight;
OffShape[3].Y:=OffShape[0].Y;
OffShape[3].X:=ATop + AHeight;
SideShape[0]:=OffShape[1]; {Vektoren der Seitenfl_che berechnen}
SideShape[1]:=TopShape[2];
SideShape[2].Y:=SideShape[1].Y;
SideShape[2].X:=ATop + AHeight;
SideShape[3]:=OffShape[2];
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetCaptionOn(Value: TCaption); {Beschriftung "ON" nbergeben}
begin
if FCaptionOn <> Value then
begin
FCaptionOn:=Value;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetCaptionOff(Value: TCaption); {Beschriftung "OFF" nbergeben}
begin
if FCaptionOff <> Value then
begin
FCaptionOff:=Value;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetChecked(Value: Boolean);
begin
if FChecked <> Value then
begin
FChecked:=Value;
CallNotifyEvent;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetCheckedLeft(Value: Boolean);
begin
if FCheckedLeft <> Value then
begin
FCheckedLeft:=Value;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetSlope(Value: Byte);
begin
if FSlope <> Value then
begin
if (FSideLength > Value) then
begin
FSlope:=Value;
Invalidate;
end;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetSideLength(Value: Byte);
begin
if (FSideLength <> Value) and (Value < Width - 4) then
begin
if (Value > FSlope) then
begin
FSideLength:=Value;
Invalidate;
end;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetOnColor(Value: TColor);
begin
if FOnColor <> Value then
begin
FOnColor:=Value;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetOffColor(Value: TColor);
begin
if FOffColor <> Value then
begin
FOffColor:=Value;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetTopColor(Value: TColor);
begin
if FTopColor <> Value then
begin
FTopColor:=Value;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetSideColor(Value: TColor);
begin
if FSideColor <> Value then
begin
FSideColor:=Value;
Invalidate;
end;
end;
{------------------------------------------------------------------------------}
procedure TSwitch.SetSwitchType(Value: TSwitchType);
begin
FSwitchType := Value;
Invalidate;
end;
{------------------------------------------------------------------------------}
procedure Register;
begin
RegisterComponents('Samples',[TSwitch]);
end;
{------------------------------------------------------------------------------}
initialization
end.