// Komponente zum
Einstellen von Werten ähnlich der TrackBar, procedure TForm1.FormCreate(Sender: TObject); begin Slider1.Parent.DoubleBuffered := true; end; // Um Werte anzuzeigen, setzt man ein Label auf die Form: procedure TForm1.Slider1Position(Sender: TObject); begin Label1.caption := IntToStr(Slider1.Position); end; // oder auch: procedure TForm1.Slider1Position(Sender: TObject); begin Label1.caption := FormatFloat('#,##0.0', Slider1.Position / 10); end; // oder Ähnliches. // Man kann den Schieber mit der Maus anfassen und verschieben, oder auf eine // bestimmte Stelle klicken und der Schieber springt an die Mausposition. // Um den Schieber darzustellen, müssen Sie hier slid.zip downloaden und // in das Verzeichnis der Komponente (Lib) kopieren.
unit Slider; interface uses Windows, Classes, Graphics, Controls; type TSLDA = array[0..26] of byte; TSlider = class(TGraphicControl) private FChange: TNotifyEvent; bmw, bms: TBitmap; wg, down, a: boolean; posi, mi, ma, stelle, diff, merk, au, ao: integer; bc, sf, fh, fd, hig: TColor; procedure setstelle; procedure seta(b: boolean); procedure setbc(c: TColor); procedure setmi(i: integer); procedure setma(i: integer); procedure setpo(i: integer); procedure setau(i: integer); procedure setao(i: integer); procedure schieben(x, y: integer); procedure setwaagsenk(b: boolean); procedure setFarbe(c: TColor); procedure setbFarbe(c: TColor); procedure laden; procedure ev(b: boolean); procedure faerben; protected procedure MouseDown(Button: TMouseButton; Shift: TShiftState; x, y: integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; x, y: integer); override; procedure MouseMove(Shift: TShiftState; x, y: integer); override; procedure paint; override; procedure Resize; override; procedure loaded; override; public destructor Destroy; override; constructor Create(Owner: TComponent); override; published property Waagerecht: boolean read wg write setwaagsenk; property Position: integer read posi write setpo; property Min: integer read mi write setmi; property Max: integer read ma write setma; property OnPosition: TNotifyEvent read FChange write FChange; property Schieberfarbe: TColor read sf write setbFarbe; property Randfarbe: TColor read bc write setbc; property Farbe: TColor read hig write setfarbe; property Aktiv: boolean read a write seta; property UntererAnschlag: integer read au write setau; property ObererAnschlag: integer read ao write setao; property ShowHint; property Visible; property OnMouseDown; property OnMouseUp; property OnMouseMove; property Enabled; end; {$R slid.res} procedure Register; implementation function hell(a: integer): integer; asm add eax, $32 cmp eax, $FF jle @fertig mov eax, $FF @fertig: end; function dunkel(a: integer): integer; asm sub eax, $24 cmp eax, 0 jge @fertig xor eax, eax @fertig: end; function Aufhellen(fb: TColor): TColor; begin fb := ColorToRGB(fb); Result := RGB(hell(GetRValue(fb)), hell(GetGValue(fb)), hell(GetBValue(fb))); end; function Abdunkeln(fb: TColor): TColor; begin fb := ColorToRGB(fb); Result := RGB(dunkel(GetRValue(fb)), dunkel(GetGValue(fb)), dunkel(GetBValue(fb))); end; constructor TSlider.Create(Owner: TComponent); begin inherited Create(Owner); a := true; ma := 100; ao := maxint; au := -maxint; wg := true; width := 113; stelle := 2; down := false; bmw := TBitmap.create; bms := TBitmap.create; laden; sf := clwhite; bc := $666666; setfarbe($EFEFEF); end; destructor TSlider.Destroy; begin bmw.free; bms.free; inherited Destroy; end; procedure TSlider.loaded; begin ev(true); end; procedure TSlider.laden; begin bmw.LoadFromResourceName(HInstance, 'waag'); bmw.pixelformat := pf24bit; bms.LoadFromResourceName(HInstance, 'senk'); bms.pixelformat := pf24bit; end; procedure TSlider.seta(b: boolean); begin if a = b then exit; a := b; repaint; end; procedure TSlider.setfarbe(c: TColor); begin if c = hig then exit; hig := c; faerben; repaint; end; procedure TSlider.setbfarbe(c: TColor); var x, y: integer; r, g, b: byte; p: ^TSLDA; procedure go; begin p[x] := trunc(p[x] * b / 255); p[x + 1] := trunc(p[x + 1] * g / 255); p[x + 2] := trunc(p[x + 2] * r / 255); inc(x, 3); end; begin if c = sf then exit; laden; sf := colortorgb(c); r := getrvalue(sf); g := getgvalue(sf); b := getbvalue(sf); for y := 0 to 9 do begin p := bmw.scanline[y]; x := 0; while x < 27 do go; end; for y := 0 to 8 do begin p := bms.scanline[y]; x := 0; while x < 30 do go; end; repaint; end; procedure TSlider.Resize; begin if wg then begin height := 10; if width < 15 then width := 15; end else begin width := 10; if height < 15 then height := 15; end; setstelle; repaint; end; procedure TSlider.ev(b: boolean); begin if (merk <> posi) or b then begin if assigned(fchange) then fchange(self); merk := posi; end; end; procedure TSlider.schieben(x, y: integer); var i, m: integer; begin m := posi; if wg then begin i := width; stelle := x - diff; end else begin i := height; stelle := y - diff; end; if stelle < 2 then begin stelle := 2; diff := 4; end else begin if stelle > i - 11 then begin stelle := i - 11; diff := 4; end; end; posi := Round(mi + (stelle - 2) * (ma - mi) / (i - 13)); if posi < au then begin posi := au; setstelle; end else if posi > ao then begin posi := ao; setstelle; end; if posi <> m then ev(false); repaint; end; procedure TSlider.MouseDown(Button: TMouseButton; Shift: TShiftState; x, y: integer); begin if not enabled or not a then exit; down := true; if wg then begin if (x < stelle) or (x > stelle + 9) then diff := 4 else diff := x - stelle; end else begin if (y < stelle) or (y > stelle + 9) then diff := 4 else diff := y - stelle; end; schieben(x, y); inherited; end; procedure TSlider.MouseUp(Button: TMouseButton; Shift: TShiftState; x, y: integer); begin down := false; inherited; end; procedure TSlider.MouseMove(Shift: TShiftState; x, y: integer); begin if down then schieben(x, y); end; procedure TSlider.setmi(i: integer); begin if (i = mi) or not (enabled or (csDesigning in componentstate)) then exit; if not (csReading in componentstate) then if i >= ma then i := ma - 1; mi := i; if mi > posi then setpo(mi) else setstelle; repaint; end; procedure TSlider.setau(i: integer); begin if i = au then exit; if not (csReading in componentstate) then begin if i >= ma then i := ma - 1; if i >= ao then i := ao - 1; end; au := i; if au > posi then setpo(au); repaint; end; procedure TSlider.setao(i: integer); begin if i = ao then exit; if not (csReading in componentstate) then begin if i <= mi then i := mi + 1; if i <= au then i := au + 1; end; ao := i; if posi > ao then setpo(ao); repaint; end; procedure TSlider.setma(i: integer); begin if (i = ma) or not (enabled or (csDesigning in componentstate)) then exit; if not (csReading in componentstate) then if i <= mi then i := mi + 1; ma := i; if ma < posi then setpo(ma) else setstelle; repaint; end; procedure TSlider.setstelle; var x: integer; begin if wg then x := width else x := height; if ma - mi <> 0 then stelle := round((posi - mi) * (x - 13) / (ma - mi) + 2); end; procedure TSlider.faerben; begin fh := aufhellen(hig); fd := abdunkeln(hig); end; procedure TSlider.setpo(i: integer); begin if (i <> posi) and (a or enabled or (csDesigning in componentstate)) then begin if i < au then i := au; if i > ao then i := ao; posi := i; if not (csReading in componentstate) then begin if posi > ma then posi := ma else if posi < mi then posi := mi; end; setstelle; ev(false); repaint; end; end; procedure TSlider.paint; begin if csDesigning in componentstate then setstelle; with canvas do begin brush.color := hig; pen.color := bc; if wg then begin height := 10; RoundRect(0, 1, width, height - 1, 5, 5); pen.color := fh; moveto(2, 2); lineto(width - 2, 2); moveto(1, 3); lineto(width - 1, 3); pen.color := fd; moveto(2, height - 3); lineto(width - 2, height - 3); moveto(1, height - 4); lineto(width - 1, height - 4); if enabled and a then begin bmw.canvas.pixels[0, 0] := pixels[stelle, 0]; bmw.canvas.pixels[0, 9] := pixels[stelle, 9]; bmw.canvas.pixels[8, 0] := pixels[stelle + 8, 0]; bmw.canvas.pixels[8, 9] := pixels[stelle + 8, 9]; draw(stelle, 0, bmw); end; end else begin width := 10; RoundRect(1, 0, width - 1, height, 5, 5); pen.color := fh; moveto(2, 2); lineto(2, height - 2); moveto(3, 1); lineto(3, height - 1); pen.color := fd; moveto(width - 3, 2); lineto(width - 3, height - 2); moveto(width - 4, 1); lineto(width - 4, height - 1); if enabled and a then begin bms.canvas.pixels[0, 0] := pixels[0, stelle]; bms.canvas.pixels[0, 8] := pixels[0, stelle + 8]; bms.canvas.pixels[9, 0] := pixels[9, stelle]; bms.canvas.pixels[9, 8] := pixels[9, stelle + 8]; draw(0, stelle, bms); end; end; end; end; procedure TSlider.setwaagsenk(b: boolean); begin if (b <> wg) and a then begin wg := b; if not (csReading in componentstate) then begin if wg then begin width := height; height := 10; end else begin height := width; width := 10; end; end; repaint; end; end; procedure TSlider.setbc(c: TColor); begin if c = bc then exit; bc := c; repaint; end; procedure Register; begin RegisterComponents('DBR', [TSlider]); end; end. |
Zugriffe seit 6.9.2001 auf Delphi-Ecke