// Getestet mit D4 unter XP (W7) // Achtung! // Wenn Sie die Komponente in Programmen einsetzen, die unter W7 oder // höher laufen sollen, muss man bei älteren Delphi-Versionen "Scaleby" // nutzen, um die Anzeige korrekt darzustellen, falls die Bildschirm- // auflösung geändert wird. // Empfohlen: procedure TForm1.FormCreate(Sender: TObject); begin scaleby(199, 200); end; // 1. Einfache Variante // Komponente für
einen Wippschalter
(scherzhaft
Schaukler, Rocker). procedure TForm1.Rocker1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if TRocker(Sender).Switch = rckOn then label1.caption := 'EIN' else
label1.caption := 'AUS';
end;
// Erläuterung der
wichtigen Eigenschaften: //------------------------------------------------------------------------ unit Rocker;
interface
uses
Windows, Classes, Graphics, Controls;
type
TRckSize = (rckLarge, rckNormal, rckSmall);
TRckColor = (rckBoth, rckGreen, rckRed);
TRckKind = (rckHorizontal, rckVertical);
TRckSwitch = (rckOff, rckOn);
TRocker = class(TGraphicControl)
private
FBmp: array[0..1] of TBitmap;
FCursorD, FCursorN, FCursorM: TCursor;
FDiffw, FDiffh: integer;
FSwitch: TRckSwitch;
FColor: TRckColor;
FAlways: Boolean;
FSize: TRckSize;
FKind: TRckKind;
FHlp: TBitmap;
protected
procedure Paint; override;
procedure Resize; override;
function onthat(x, y: integer): boolean;
procedure changecursor(x, y: integer);
procedure writechecked(b: boolean);
procedure setswitch(s: TRckSwitch);
procedure setFColor(f: TRckColor);
procedure VertFlip(bmp: TBitmap);
procedure HorzFlip(bmp: TBitmap);
procedure setcursord(c: TCursor);
procedure setcursorn(c: TCursor);
procedure setAlways(b: boolean);
procedure setkind(k: TRckKind);
procedure setsize(s: TRckSize);
function readchecked: boolean;
procedure Rotate(bm: TBitmap);
procedure buildonoff;
procedure Dimension;
procedure arrange;
public
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X,
Y: Integer); override;
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
procedure SetEnabled(Value: Boolean); override;
procedure Loaded; override;
property Checked: boolean read readchecked write writechecked;
published
property CursorNormal: TCursor read FCursorN write setcursorn;
property CursorSwitch: TCursor read FCursorD write setcursord;
property AlwaysRespond: boolean read FAlways write setAlways;
property Switch: TRckSwitch read FSwitch write setswitch;
property Color: TRckColor read FColor write setFColor;
property Size: TRckSize read FSize write setsize;
property Kind: TRckKind read FKind write setkind;
property ParentShowHint;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property ShowHint;
property Visible;
property Enabled;
end;
procedure Register;
implementation
{$R wipp.res}
procedure Register;
begin
RegisterComponents('DBR', [TRocker]);
end;
constructor TRocker.Create(Owner: TComponent);
var
x: integer;
begin
inherited Create(Owner);
for x := 0 to 1 do begin
FBmp[x] := TBitmap.create;
FBmp[x].pixelformat := pf24bit;
end;
FCursorD := crHandpoint;
FHlp := TBitmap.create;
FKind := rckVertical;
FCursorN := crArrow;
FCursorM := crArrow;
setsize(rckNormal);
FSwitch := rckOff;
FColor := rckBoth;
FAlways := false;
arrange;
end;
destructor TRocker.Destroy;
var
x: integer;
begin
for x := 0 to 1 do FBmp[x].free;
FHlp.free;
inherited Destroy;
end;
procedure TRocker.HorzFlip(bmp: TBitmap);
begin
stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height,
bmp.canvas.handle, bmp.width - 1, 0, -bmp.width, bmp.height, SRCCOPY);
end;
procedure TRocker.VertFlip(bmp: TBitmap);
begin
stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height,
bmp.canvas.handle, 0, bmp.height - 1, bmp.width, -bmp.height, SRCCOPY);
end;
procedure TRocker.Rotate(bm: TBitmap);
type
TripleArray = array[0..50] of TRGBTriple;
PTriple = ^TripleArray;
var
p: PTriple;
x, y: integer;
bitmap: TBitmap;
begin
bm.pixelformat := pf24bit;
bitmap := TBitmap.create;
bitmap.width := bm.height;
bitmap.height := bm.width;
bitmap.pixelformat := pf24bit;
for y := 0 to bm.height - 1 do begin
p := bm.scanline[y];
for x := bm.width - 1 downto 0 do
PTriple(bitmap.scanline[pred(bm.width - x)])[y] := p[x];
end;
bm.width := bitmap.width;
bm.height := bitmap.height;
bm.canvas.draw(0, 0, bitmap);
bitmap.free;
vertflip(bm);
end;
procedure TRocker.Dimension;
var
x: integer;
procedure zw(b: TBitmap);
begin
b.width := width;
b.height := height;
end;
begin
if FKind = rckVertical then begin
width := 33 - FDiffw;
height := 51 - FDiffh;
end else begin
width := 51 - FDiffh;
height := 33 - FDiffw;
end;
for x := 0 to 1 do
zw(FBmp[x]);
end;
procedure TRocker.Resize;
begin
inherited;
Dimension;
end;
procedure TRocker.Paint;
begin
canvas.draw(0, 0, FBmp[ord(FSwitch)]);
end;
procedure TRocker.setswitch(s: TRckSwitch);
begin
if s <> FSwitch then begin
FSwitch := s;
repaint;
end;
end;
procedure TRocker.buildonoff;
var
x, w, h: integer;
procedure makelines(i: integer);
begin
with FBmp[x].canvas do begin
moveto(3, i);
lineto(w, i);
moveto(i, 3);
lineto(i, h);
end;
end;
procedure sdraw(cnv: TCanvas);
begin
with cnv do begin
SetStretchBltMode(handle, STRETCH_HALFTONE);
stretchdraw(rect(3, 3, w, h), FHlp);
end;
end;
begin
if width = 0 then exit;
w := width - 3;
h := height - 3;
for x := 0 to 1 do
with FBmp[x], canvas do begin
FHlp.handle := LoadBitmap(HInstance, 'lio');
draw(0, 0, FHlp);
horzflip(FHlp);
draw(w, 0, FHlp);
horzflip(FHlp);
vertflip(FHlp);
draw(0, h, FHlp);
FHlp.handle := LoadBitmap(HInstance, 'reu');
draw(w, h, FHlp);
brush.color := clBlack;
fillrect(rect(w, 3, width, h));
fillrect(rect(3, h, w, height));
pen.color := clBlack;
makelines(2);
pen.color := $4C4C4C;
makelines(0);
pen.color := $ACACAC;
makelines(1);
transparent := true;
end;
if not enabled then FHlp.handle := LoadBitmap(HInstance, 'wgr') else
if (FColor = rckRed) or (FColor = rckBoth) then
FHlp.handle := LoadBitmap(HInstance, 'wrt') else
FHlp.handle := LoadBitmap(HInstance, 'wgn');
if FKind = rckHorizontal then rotate(FHlp);
sdraw(FBmp[0].canvas);
if not enabled then FHlp.handle := LoadBitmap(HInstance, 'wgr') else
if FColor = rckRed then
FHlp.handle := LoadBitmap(HInstance, 'wrt') else
FHlp.handle := LoadBitmap(HInstance, 'wgn');
if FKind = rckHorizontal then begin
rotate(FHlp);
horzflip(FHlp);
end else
vertflip(FHlp);
sdraw(FBmp[1].canvas);
end;
function TRocker.onthat(x, y: integer): boolean;
var
l, r, i: integer;
b, bf: boolean;
function prf(w: integer): boolean;
begin
result := not bf and (w < l) or bf and (w > r);
end;
begin
b := FKind = rckVertical;
bf := FSwitch = rckOff;
if b then i := height div 2
else i := width div 2;
l := pred(i);
r := l + 2;
result := b and prf(y) or not b and prf(x);
end;
procedure TRocker.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FAlways or onthat(x, y) then begin
if FSwitch = rckOff then FSwitch := rckOn else FSwitch := rckOff;
repaint;
changecursor(x, y);
inherited;
end;
end;
procedure TRocker.SetEnabled(Value: Boolean);
begin
inherited;
buildonoff;
end;
procedure TRocker.loaded;
begin
arrange;
inherited;
end;
procedure TRocker.setFColor(f: TRckColor);
begin
if f = FColor then exit;
FColor := f;
buildonoff;
repaint;
end;
procedure TRocker.setkind(k: TRckKind);
begin
if k = FKind then exit;
FKind := k;
arrange;
repaint;
end;
procedure TRocker.changecursor(x, y: integer);
begin
releasecapture;
if onthat(x, y) then cursor := FCursorD else cursor := FCursorN;
end;
procedure TRocker.MouseMove(Shift: TShiftState; X,
Y: Integer);
begin
changecursor(x, y);
inherited;
end;
procedure TRocker.setcursord(c: TCursor);
begin
FCursorD := c;
end;
procedure TRocker.setcursorn(c: TCursor);
begin
FCursorN := c;
end;
procedure TRocker.setsize(s: TRckSize);
begin
if s = FSize then exit;
FSize := s;
case s of
rckLarge: begin
FDiffw := 0;
FDiffh := 0;
end;
rckSmall: begin
FDiffw := 13;
FDiffh := 22;
end;
else begin
FDiffw := 7;
FDiffh := 12;
end;
end;
arrange;
repaint;
end;
procedure TRocker.arrange;
begin
Dimension;
buildonoff;
end;
procedure TRocker.setAlways(b: boolean);
begin
if b = FAlways then exit;
FAlways := b;
if b then begin
FCursorM := FCursorN;
FCursorN := FCursorD;
end else FCursorN := FCursorM;
end;
function TRocker.readchecked: boolean;
begin
result := FSwitch = rckOn;
end;
procedure TRocker.writechecked(b: boolean);
begin
if b then begin
if FSwitch = rckOn then exit;
setswitch(rckOn);
end else begin
if FSwitch = rckOff then exit;
setswitch(rckOff);
end;
end;
end.
//
----------------------------------------------------------------------- // Ist
EventOnLoad=False,
wird das Ereignis
OnChange
beim ersten unit Rockerx;
interface
uses
Windows,
Classes,
Controls,
Graphics;
type
TRckEvent = procedure(Sender: TObject; State: Boolean) of object;
TRckColor = (rckAqua, rckBlack, rckBlue, rckBrown, rckGreen,
rckOrange, rckPink, rckRed, rckWhite, rckYellow);
TRckSize = (rckLarge, rckNormal, rckSmall);
TRckKind = (rckHorizontal, rckVertical);
TRckSwitch = (rckOff, rckOn);
TRockerx = class(TGraphicControl)
private
FCursorD, FCursorN, FCursorM: TCursor;
FColorOn, FColorOff: TRckColor;
FBmp: array[0..1] of TBitmap;
FAlways, FOnStart: Boolean;
FDiffw, FDiffh: integer;
FSwitch: TRckSwitch;
FOff, FOn: string;
FEvent: TRckEvent;
FSize: TRckSize;
FKind: TRckKind;
FHlp: TBitmap;
FRect: TRect;
protected
procedure Paint; override;
procedure Loaded; override;
procedure Resize; override;
function onthat(x, y: integer): boolean;
procedure changecursor(x, y: integer);
function parse(f: TRckColor): string;
procedure setFColorOff(f: TRckColor);
procedure setFColorOn(f: TRckColor);
procedure writechecked(b: boolean);
procedure setswitch(s: TRckSwitch);
procedure VertFlip(bmp: TBitmap);
procedure HorzFlip(bmp: TBitmap);
procedure setcursord(c: TCursor);
procedure setcursorn(c: TCursor);
procedure setAlways(b: boolean);
procedure setkind(k: TRckKind);
procedure setsize(s: TRckSize);
function readchecked: boolean;
procedure Rotate(bm: TBitmap);
procedure buildonoff;
procedure switching;
procedure Dimension;
procedure arrange;
public
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X,
Y: Integer); override;
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
procedure SetEnabled(Value: Boolean); override;
property Checked: boolean read readchecked write writechecked;
published
property ColorOff: TRckColor read FColorOff write setFColorOff;
property CursorNormal: TCursor read FCursorN write setcursorn;
property CursorSwitch: TCursor read FCursorD write setcursord;
property AlwaysRespond: boolean read FAlways write setAlways;
property ColorOn: TRckColor read FColorOn write setFColorOn;
property EventOnLoad: boolean read FOnstart write FOnstart;
property Switch: TRckSwitch read FSwitch write setswitch;
property OnChange: TRckEvent read FEvent write FEvent;
property Size: TRckSize read FSize write setsize;
property Kind: TRckKind read FKind write setkind;
property ParentShowHint;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property ShowHint;
property Visible;
property Enabled;
end;
procedure Register;
implementation
{$R wippx.res}
procedure Register;
begin
RegisterComponents('DBR', [TRockerx]);
end;
constructor TRockerx.Create(Owner: TComponent);
var
x: integer;
begin
inherited Create(Owner);
for x := 0 to 1 do begin
FBmp[x] := TBitmap.create;
FBmp[x].pixelformat := pf24bit;
end;
FCursorD := crHandpoint;
FHlp := TBitmap.create;
FKind := rckVertical;
FCursorN := crArrow;
FCursorM := crArrow;
setsize(rckNormal);
FSwitch := rckOff;
FAlways := false;
FColorOn := rckGreen;
FColorOff := rckRed;
FOn := parse(FColorOn);
FOff := parse(FColorOff);
arrange;
end;
destructor TRockerx.Destroy;
var
x: integer;
begin
for x := 0 to 1 do FBmp[x].free;
FHlp.free;
inherited Destroy;
end;
procedure TRockerx.HorzFlip(bmp: TBitmap);
begin
stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height,
bmp.canvas.handle, bmp.width - 1, 0, -bmp.width, bmp.height, SRCCOPY);
end;
procedure TRockerx.VertFlip(bmp: TBitmap);
begin
stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height,
bmp.canvas.handle, 0, bmp.height - 1, bmp.width, -bmp.height, SRCCOPY);
end;
procedure TRockerx.Rotate(bm: TBitmap);
type
TripleArray = array[0..50] of TRGBTriple;
PTriple = ^TripleArray;
var
p: PTriple;
x, y: integer;
bitmap: TBitmap;
begin
bm.pixelformat := pf24bit;
bitmap := TBitmap.create;
bitmap.width := bm.height;
bitmap.height := bm.width;
bitmap.pixelformat := pf24bit;
for y := 0 to bm.height - 1 do begin
p := bm.scanline[y];
for x := bm.width - 1 downto 0 do
PTriple(bitmap.scanline[pred(bm.width - x)])[y] := p[x];
end;
bm.width := bitmap.width;
bm.height := bitmap.height;
bm.canvas.draw(0, 0, bitmap);
bitmap.free;
vertflip(bm);
end;
procedure TRockerx.Dimension;
var
x: integer;
procedure zw(b: TBitmap);
begin
b.width := width;
b.height := height;
end;
begin
if FKind = rckVertical then begin
width := 33 - FDiffw;
height := 51 - FDiffh;
end else begin
width := 51 - FDiffh;
height := 33 - FDiffw;
end;
for x := 0 to 1 do
zw(FBmp[x]);
end;
procedure TRockerx.Resize;
begin
inherited;
Dimension;
Frect := rect(0, 0, width, height);
end;
procedure TRockerx.Paint;
begin
with canvas do
draw(0, 0, FBmp[ord(FSwitch)]);
end;
procedure TRockerx.switching;
begin
repaint;
if assigned(FEvent) then
FEvent(self, readchecked);
end;
procedure TRockerx.setswitch(s: TRckSwitch);
begin
if s <> FSwitch then begin
FSwitch := s;
switching;
end;
end;
procedure TRockerx.buildonoff;
var
x, w, h: integer;
procedure makelines(i: integer);
begin
with FBmp[x].canvas do begin
moveto(3, i);
lineto(w, i);
moveto(i, 3);
lineto(i, h);
end;
end;
procedure sdraw(cnv: TCanvas);
begin
with cnv do begin
SetStretchBltMode(handle, STRETCH_HALFTONE);
stretchdraw(rect(3, 3, w, h), FHlp);
end;
end;
begin
if width = 0 then exit;
w := width - 3;
h := height - 3;
for x := 0 to 1 do
with FBmp[x], canvas do begin
FHlp.handle := LoadBitmap(HInstance, 'liox');
draw(0, 0, FHlp);
horzflip(FHlp);
draw(w, 0, FHlp);
horzflip(FHlp);
vertflip(FHlp);
draw(0, h, FHlp);
FHlp.handle := LoadBitmap(HInstance, 'reux');
draw(w, h, FHlp);
brush.color := clBlack;
fillrect(rect(w, 3, width, h));
fillrect(rect(3, h, w, height));
pen.color := clBlack;
makelines(2);
pen.color := $4C4C4C;
makelines(0);
pen.color := $ACACAC;
makelines(1);
transparent := true;
end;
if not enabled then FHlp.handle := LoadBitmap(HInstance, 'wgrx') else
FHlp.handle := LoadBitmap(HInstance, PChar(FOff));
if FKind = rckHorizontal then rotate(FHlp);
sdraw(FBmp[0].canvas);
if not enabled then FHlp.handle := LoadBitmap(HInstance, 'wgrx') else
FHlp.handle := LoadBitmap(HInstance, PChar(FOn));
if FKind = rckHorizontal then begin
rotate(FHlp);
horzflip(FHlp);
end else
vertflip(FHlp);
sdraw(FBmp[1].canvas);
end;
function TRockerx.onthat(x, y: integer): boolean;
var
l, r, i: integer;
b, bf: boolean;
function prf(w: integer): boolean;
begin
result := not bf and (w < l) or bf and (w > r);
end;
begin
b := FKind = rckVertical;
bf := FSwitch = rckOff;
if b then i := height div 2
else i := width div 2;
l := pred(i);
r := l + 2;
result := b and prf(y) or not b and prf(x);
end;
procedure TRockerx.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FAlways or onthat(x, y) then begin
if FSwitch = rckOff then setswitch(rckOn) else setswitch(rckOff);
changecursor(x, y);
end;
inherited;
end;
procedure TRockerx.SetEnabled(Value: Boolean);
begin
inherited;
buildonoff;
end;
procedure TRockerx.setFColorOn(f: TRckColor);
begin
if f = FColorOn then exit;
FColorOn := f;
FOn := parse(f);
buildonoff;
repaint;
end;
procedure TRockerx.setFColorOff(f: TRckColor);
begin
if f = FColorOff then exit;
FColorOff := f;
FOff := parse(f);
buildonoff;
repaint;
end;
procedure TRockerx.setkind(k: TRckKind);
begin
if k = FKind then exit;
FKind := k;
arrange;
repaint;
end;
procedure TRockerx.changecursor(x, y: integer);
begin
releasecapture;
if onthat(x, y) then cursor := FCursorD else cursor := FCursorN;
end;
procedure TRockerx.MouseMove(Shift: TShiftState; X,
Y: Integer);
begin
changecursor(x, y);
inherited;
end;
procedure TRockerx.setcursord(c: TCursor);
begin
FCursorD := c;
end;
procedure TRockerx.setcursorn(c: TCursor);
begin
FCursorN := c;
end;
procedure TRockerx.setsize(s: TRckSize);
begin
if s = FSize then exit;
FSize := s;
case s of
rckLarge: begin
FDiffw := 0;
FDiffh := 0;
end;
rckSmall: begin
FDiffw := 13;
FDiffh := 22;
end;
else begin
FDiffw := 7;
FDiffh := 12;
end;
end;
arrange;
repaint;
end;
procedure TRockerx.arrange;
begin
Dimension;
buildonoff;
end;
procedure TRockerx.setAlways(b: boolean);
begin
if b = FAlways then exit;
FAlways := b;
if b then begin
FCursorM := FCursorN;
FCursorN := FCursorD;
end else FCursorN := FCursorM;
end;
function TRockerx.readchecked: boolean;
begin
result := FSwitch = rckOn;
end;
procedure TRockerx.writechecked(b: boolean);
begin
if b then begin
if FSwitch = rckOn then exit;
setswitch(rckOn);
end else begin
if FSwitch = rckOff then exit;
setswitch(rckOff);
end;
end;
procedure TRockerx.loaded;
begin
inherited;
if FOnStart then switching;
end;
function TRockerx.parse(f: TRckColor): string;
begin
case f of
rckRed: result := 'wrtx';
rckAqua: result := 'waqx';
rckBlue: result := 'wblx';
rckPink: result := 'wpkx';
rckBrown: result := 'wbrx';
rckGreen: result := 'wgnx';
rckWhite: result := 'wwsx';
rckBlack: result := 'wbkx';
rckOrange: result := 'worx';
rckYellow: result := 'wgbx';
end;
end;
end.
//
----------------------------------------------------------------------- // Diese Variante
ist die Erweiterung von Variante 2. Zum Einen ist unit RockerL;
interface
uses
Windows,
Classes,
Controls,
Graphics;
type
TRckEvent = procedure(Sender: TObject; State: Boolean) of object;
TRckColor = (rckAqua, rckBlack, rckBlue, rckBrown, rckGreen,
rckMetal, rckOrange, rckPink, rckRed, rckWhite, rckYellow);
TRckSize = (rckLarge, rckNormal, rckSmall);
TRckKind = (rckHorizontal, rckVertical);
TRckSwitch = (rckOff, rckOn);
TRockerL = class(TGraphicControl)
private
FThreshold, FZL, FDiffw, FDiffh: integer;
Fleft, FLed, FAlways, FOnStart: Boolean;
FCursorD, FCursorN, FCursorM: TCursor;
FBmp, FLeds: array[0..1] of TBitmap;
FColorOn, FColorOff: TRckColor;
FSwitch: TRckSwitch;
FOff, FOn: string;
FEvent: TRckEvent;
FSize: TRckSize;
FKind: TRckKind;
FHlp: TBitmap;
FRect: TRect;
protected
procedure Paint; override;
procedure Loaded; override;
procedure Resize; override;
function onthat(x, y: integer): boolean;
procedure changecursor(x, y: integer);
function parse(f: TRckColor): string;
procedure setFColorOff(f: TRckColor);
procedure setFColorOn(f: TRckColor);
procedure writechecked(b: boolean);
procedure setswitch(s: TRckSwitch);
procedure VertFlip(bmp: TBitmap);
procedure HorzFlip(bmp: TBitmap);
procedure setcursord(c: TCursor);
procedure setcursorn(c: TCursor);
procedure setAlways(b: boolean);
procedure setkind(k: TRckKind);
procedure setsize(s: TRckSize);
function readchecked: boolean;
procedure Rotate(bm: TBitmap);
procedure makeled(b: boolean);
procedure setleft(b: boolean);
procedure buildonoff;
procedure switching;
procedure Dimension;
procedure arrange;
public
procedure MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X,
Y: Integer); override;
constructor Create(Owner: TComponent); override;
destructor Destroy; override;
procedure SetEnabled(Value: Boolean); override;
property Checked: boolean read readchecked write writechecked;
published
property ColorOff: TRckColor read FColorOff write setFColorOff;
property CursorNormal: TCursor read FCursorN write setcursorn;
property CursorSwitch: TCursor read FCursorD write setcursord;
property AlwaysRespond: boolean read FAlways write setAlways;
property ColorOn: TRckColor read FColorOn write setFColorOn;
property EventOnLoad: boolean read FOnstart write FOnstart;
property Switch: TRckSwitch read FSwitch write setswitch;
property OnChange: TRckEvent read FEvent write FEvent;
property LEDLeftTop: boolean read Fleft write setleft;
property Size: TRckSize read FSize write setsize;
property Kind: TRckKind read FKind write setkind;
property LED: boolean read Fled write makeled;
property ParentShowHint;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property ShowHint;
property Visible;
property Enabled;
end;
procedure Register;
implementation
{$R wippl.res}
procedure Register;
begin
RegisterComponents('DBR', [TRockerL]);
end;
constructor TRockerL.Create(Owner: TComponent);
var
x: integer;
begin
inherited Create(Owner);
for x := 0 to 1 do begin
FBmp[x] := TBitmap.create;
FBmp[x].pixelformat := pf24bit;
FLeds[x] := TBitmap.create;
end;
FLeft := true;
FCursorD := crHandpoint;
FHlp := TBitmap.create;
FKind := rckVertical;
FColorOff := rckMetal;
FColorOn := rckMetal;
FLed := true;
FOff := parse(FColorOff);
FOn := parse(FColorOn);
FCursorN := crArrow;
FCursorM := crArrow;
setsize(rckNormal);
FSwitch := rckOff;
FAlways := false;
arrange;
end;
destructor TRockerL.Destroy;
var
x: integer;
begin
for x := 0 to 1 do begin
FBmp[x].free;
FLeds[x].free;
end;
FHlp.free;
inherited Destroy;
end;
procedure TRockerL.HorzFlip(bmp: TBitmap);
begin
stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height,
bmp.canvas.handle, bmp.width - 1, 0, -bmp.width, bmp.height, SRCCOPY);
end;
procedure TRockerL.VertFlip(bmp: TBitmap);
begin
stretchblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height,
bmp.canvas.handle, 0, bmp.height - 1, bmp.width, -bmp.height, SRCCOPY);
end;
procedure TRockerL.Rotate(bm: TBitmap);
type
TripleArray = array[0..50] of TRGBTriple;
PTriple = ^TripleArray;
var
p: PTriple;
x, y: integer;
bitmap: TBitmap;
begin
bm.pixelformat := pf24bit;
bitmap := TBitmap.create;
bitmap.width := bm.height;
bitmap.height := bm.width;
bitmap.pixelformat := pf24bit;
for y := 0 to bm.height - 1 do begin
p := bm.scanline[y];
for x := bm.width - 1 downto 0 do
PTriple(bitmap.scanline[pred(bm.width - x)])[y] := p[x];
end;
bm.width := bitmap.width;
bm.height := bitmap.height;
bm.canvas.draw(0, 0, bitmap);
bitmap.free;
vertflip(bm);
end;
procedure TRockerL.Dimension;
var
x: integer;
procedure zw(b: TBitmap);
begin
b.width := width;
b.height := height;
end;
begin
if Fled then begin
case FSize of
rckLarge: Fzl := 25;
rckNormal: Fzl := 19;
else Fzl := 15;
end;
end else Fzl := 0;
if FKind = rckVertical then begin
width := 33 - FDiffw;
height := 51 - FDiffh + Fzl;
end else begin
width := 51 - FDiffh + Fzl;
height := 33 - FDiffw;
end;
for x := 0 to 1 do
zw(FBmp[x]);
end;
procedure TRockerL.Resize;
begin
inherited;
Dimension;
Frect := rect(0, 0, width, height);
end;
procedure TRockerL.Paint;
begin
with canvas do
draw(0, 0, FBmp[ord(FSwitch)]);
end;
procedure TRockerL.switching;
begin
repaint;
if assigned(FEvent) then
FEvent(self, readchecked);
end;
procedure TRockerL.setswitch(s: TRckSwitch);
begin
if s <> FSwitch then begin
FSwitch := s;
buildonoff;
switching;
end;
end;
procedure TRockerL.buildonoff;
var
x, w, h: integer;
rt, gn: string;
procedure makelines(i: integer);
begin
with FBmp[x].canvas do begin
moveto(3, i);
lineto(w, i);
moveto(i, 3);
lineto(i, h);
end;
end;
procedure sdraw(cnv: TCanvas);
var
zwl, zwr, zso, zsu, li, ob, zw, dr, ll, lt: integer;
begin
if FKind = rckHorizontal then begin
if FLeft then begin
zwr := 0;
zwl := Fzl;
li := zwl + 2;
case FSize of
rckLarge: ll := 6;
else ll := 5;
end;
end else begin
zwr := Fzl;
zwl := 0;
li := w - zwr;
case FSize of
rckLarge: ll := 52;
rckNormal: ll := 39;
else ll := 29;
end;
end;
case FSize of
rckLarge: lt := 8;
rckNormal: lt := 6;
else lt := 5;
end;
zso := 0;
zsu := 0;
ob := 3;
zw := li;
dr := h;
end else begin
if Fleft then begin
zsu := 0;
zso := Fzl;
ob := zso + 2;
case FSize of
rckLarge: lt := 6;
else lt := 5;
end;
end else begin
zsu := Fzl;
zso := 0;
ob := h - zsu;
case FSize of
rckLarge: lt := 52;
rckNormal: lt := 39;
else lt := 29;
end;
end;
zw := w;
li := 3;
zwl := 0;
zwr := 0;
dr := ob;
case FSize of
rckLarge: ll := 8;
rckNormal: ll := 6;
else ll := 5;
end;
end;
with cnv do begin
SetStretchBltMode(handle, STRETCH_HALFTONE);
stretchdraw(rect(3 + zwl, 3 + zso, w - zwr, h - zsu), FHlp);
pen.color := clBlack;
moveto(li, ob);
lineto(zw, dr);
if not FLed then exit;
if FSwitch = rckOff then
draw(ll, lt, Fleds[0])
else draw(ll, lt, Fleds[1]);
end;
end;
begin
if width = 0 then exit;
w := width - 3;
h := height - 3;
if enabled then begin
rt := 'r';
gn := 'g';
end else begin
rt := 'e';
gn := 'e';
end;
case FSize of
rckLarge: begin
Fleds[0].handle := LoadBitmap(HInstance, PChar('l' + rt + 'gl'));
Fleds[1].handle := LoadBitmap(HInstance, PChar('l' + gn + 'gl'));
end;
rckNormal: begin
Fleds[0].handle := LoadBitmap(HInstance, PChar('l' + rt + 'nl'));
Fleds[1].handle := LoadBitmap(HInstance, PChar('l' + gn + 'nl'));
end;
else begin
Fleds[0].handle := LoadBitmap(HInstance, PChar('l' + rt + 'kl'));
Fleds[1].handle := LoadBitmap(HInstance, PChar('l' + gn + 'kl'));
end;
end;
for x := 0 to 1 do
with FBmp[x], canvas do begin
if FLed then begin
brush.color := $525252;
fillrect(cliprect);
end;
FHlp.handle := LoadBitmap(HInstance, 'liol');
draw(0, 0, FHlp);
horzflip(FHlp);
draw(w, 0, FHlp);
horzflip(FHlp);
vertflip(FHlp);
draw(0, h, FHlp);
FHlp.handle := LoadBitmap(HInstance, 'reul');
draw(w, h, FHlp);
brush.color := clBlack;
fillrect(rect(width - 3, 3, width, h));
fillrect(rect(3, h, w, height));
pen.color := clBlack;
makelines(2);
pen.color := $4C4C4C;
makelines(0);
pen.color := $ACACAC;
makelines(1);
transparent := true;
end;
if not enabled then FHlp.handle := LoadBitmap(HInstance, 'wgrl') else
FHlp.handle := LoadBitmap(HInstance, PChar(FOff));
if FKind = rckHorizontal then rotate(FHlp);
sdraw(FBmp[0].canvas);
if not enabled then FHlp.handle := LoadBitmap(HInstance, 'wgrl') else
FHlp.handle := LoadBitmap(HInstance, PChar(FOn));
if FKind = rckHorizontal then begin
rotate(FHlp);
horzflip(FHlp);
FThreshold := (width - Fzl) div 2;
end else begin
vertflip(FHlp);
FThreshold := (height - fzl) div 2;
end;
sdraw(FBmp[1].canvas);
end;
function TRockerL.onthat(x, y: integer): boolean;
var
l, i, j: integer;
b, bf: boolean;
function prf(w, v: integer): boolean;
begin
result := (not bf and (w < l) and (w >= i + 5))
or (bf and (w > l) and (w <= v - j));
end;
begin
b := FKind = rckVertical;
bf := FSwitch = rckOff;
i := Fzl * ord(FLeft);
j := Fzl * ord(not FLeft) + 5;
l := FThreshold + i;
result := b and prf(y, height) or not b and prf(x, width);
end;
procedure TRockerL.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FAlways or onthat(x, y) then begin
if FSwitch = rckOff then setswitch(rckOn) else setswitch(rckOff);
changecursor(x, y);
end;
inherited;
end;
procedure TRockerL.SetEnabled(Value: Boolean);
begin
inherited;
buildonoff;
end;
procedure TRockerL.setFColorOn(f: TRckColor);
begin
if f = FColorOn then exit;
FColorOn := f;
FOn := parse(f);
buildonoff;
repaint;
end;
procedure TRockerL.setFColorOff(f: TRckColor);
begin
if f = FColorOff then exit;
FColorOff := f;
FOff := parse(f);
buildonoff;
repaint;
end;
procedure TRockerL.setkind(k: TRckKind);
begin
if k = FKind then exit;
FKind := k;
arrange;
repaint;
end;
procedure TRockerL.changecursor(x, y: integer);
begin
releasecapture;
if onthat(x, y) then cursor := FCursorD else cursor := FCursorN;
end;
procedure TRockerL.MouseMove(Shift: TShiftState; X,
Y: Integer);
begin
changecursor(x, y);
inherited;
end;
procedure TRockerL.setcursord(c: TCursor);
begin
FCursorD := c;
end;
procedure TRockerL.setcursorn(c: TCursor);
begin
FCursorN := c;
end;
procedure TRockerL.setsize(s: TRckSize);
begin
if s = FSize then exit;
FSize := s;
case s of
rckLarge: begin
FDiffw := 0;
FDiffh := 0;
end;
rckSmall: begin
FDiffw := 13;
FDiffh := 22;
end;
else begin
FDiffw := 7;
FDiffh := 12;
end;
end;
arrange;
repaint;
end;
procedure TRockerL.arrange;
begin
Dimension;
buildonoff;
end;
procedure TRockerL.setAlways(b: boolean);
begin
if b = FAlways then exit;
FAlways := b;
if b then begin
FCursorM := FCursorN;
FCursorN := FCursorD;
end else FCursorN := FCursorM;
end;
function TRockerL.readchecked: boolean;
begin
result := FSwitch = rckOn;
end;
procedure TRockerL.writechecked(b: boolean);
begin
if b then begin
if FSwitch = rckOn then exit;
setswitch(rckOn);
end else begin
if FSwitch = rckOff then exit;
setswitch(rckOff);
end;
end;
procedure TRockerL.loaded;
begin
inherited;
if FOnStart then switching;
end;
function TRockerL.parse(f: TRckColor): string;
begin
case f of
rckRed: result := 'wrtl';
rckAqua: result := 'waql';
rckBlue: result := 'wbll';
rckPink: result := 'wpkl';
rckBrown: result := 'wbrl';
rckGreen: result := 'wgnl';
rckWhite: result := 'wwsl';
rckBlack: result := 'wbkl';
rckMetal: result := 'wmtl';
rckOrange: result := 'worl';
rckYellow: result := 'wgbl';
end;
end;
procedure TRockerL.makeled(b: boolean);
begin
if FLed = b then exit;
FLed := b;
arrange;
repaint;
end;
procedure TRockerL.setleft(b: boolean);
begin
if FLeft = b then exit;
FLeft := b;
arrange;
repaint;
end;
end.
//
-----------------------------------------------------------------------
|
Zugriffe seit 6.9.2001 auf Delphi-Ecke





