![]() |
![]() |
|||||||||||
Introduction The Delphi programming environment already contains a dialog form for color selection.In some cases however, a simple component, not a pop-up form, for the selection of colors is needed. This article describes such a simple component, which may also be integrated in complex, home built, dialog forms. The component source code is listed and the complete project may be downloaded. How the component looks
Ancestor Class The ancestor class is the TGraphicControl component, which is also the ancestor of the Tpaintbox component.Basically, the davColorBox is a modified paintbox. Component Properties
- cbVert ............ vertical orientation
- cb64............2 bits per color, 64 selectable colors - cb512..........3 bits per color, 512 selectable colors
Component Methods
Component Events
OnSelect is derived from the Mouse_Up event. Component Application When a mouse_up event occurs on the davColorBox component, an OnSelect event is received.
begin //.............color is the selected color end; Remarks The width and height properties are recalculated by the component,depending on the colordepth and Csquare values selected. Within the component, a color is represented by a sequential number in the range 0 .. 511 in the case of 512 color mode. From this number, the position in the rectangle is calculated for display. Also the 32 bit Windows color is calculated from this value. This 32 bit, true color, value is returned at the Onselect event. Source Code
unit davColorBox;
{color picker component
supply rectangle with selectable colors
properties:
- direction : cbHor, cbVert for horizontal or vertical orientation
- colordepth : cb8, cb64 , cb512 for amount of colors
- Csquare : 5 .. 40, edge of each colored square
- border : 0 .. 10 , the width of the border
- borderlight : color of left and top of border
- borderdark : color of bottom and right side of border
methods:
- create
events:
- OnSelect : mouse-up over a color supplies selected color
}
interface
uses windows,controls,classes;
type TcolorDepth = (cb8,cb64,cb512);
Tcolorboxdir = (cbHor,cbVert);
TColorSelect = procedure(sender : TObject; color : LongInt) of object;
TColorSquare = record
x1 : integer;
y1 : integer;
color : LongInt;
end;
TdavColorBox = class(TGraphicControl)
private
FColorDepth : TColorDepth;
FDirection : Tcolorboxdir;
FColor : LongInt;
FOnSelect : TColorSelect;
Fx : Integer;
Fy : integer;
FBorderwidth: byte;
FBorderlight: LongInt;
FBorderdark : LongInt;
FCsquare : byte;
procedure setDirection(cbDir : TcolorBoxdir);
procedure setColorDepth(cbDepth : TColorDepth);
procedure setDimensions;
function number2color(w : word) : TColorSquare;
protected
procedure paint; override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure setSquare(edge : byte);
procedure setBorderwidth(w : byte);
procedure setBorderlight(c : longInt);
procedure setBorderdark(c : longInt);
procedure select(sender : TObject; selcolor : LongInt);
public
constructor create(AOwner:TComponent); override;
published
property OnSelect : TcolorSelect read FOnSelect write FOnSelect;
property direction: TColorboxdir read FDirection write setDirection default cbHor;
property colordepth: Tcolordepth read Fcolordepth write setcolordepth default cb512;
property Csquare : byte read FCsquare write setSquare default 10;
property border : byte read Fborderwidth write setborderwidth default 2;
property borderlight : longInt read Fborderlight write setborderLight default $ffffff;
property borderdark : LongInt read Fborderdark write setBorderdark default $0;
property visible;
property enabled;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('system',[TdavColorBox]);
end;
procedure TdavColorBox.setDimensions;
const dimlist : array[cb8..cb512] of byte = (2,4,8);
var xx,yy : integer;
begin
yy := dimlist[FcolorDepth]*FCsquare;
xx := yy * dimlist[FColorDepth] + 2*border + 1;
yy := yy + 2*border + 1;
if Fdirection = cbHor then
begin
width := xx; height := yy;
end
else
begin
height := xx; width := yy;
end;
end;
constructor TdavColorBox.create(AOwner: TComponent);
begin
inherited create(Aowner);
FCSquare := 10;
FBorderwidth := 4;
FColorDepth := cb512;
FDirection := cbHor;
FBorderLight := $ffffff;
FBorderdark := $0;
FColor := $0;
setdimensions;
end;
procedure TdavColorBox.setdirection(cbdir : Tcolorboxdir);
begin
Fdirection := cbdir;
setdimensions;
end;
procedure TdavColorbox.setColorDepth(cbdepth : TColorDepth);
begin
FColorDepth := cbdepth;
setSquare(FCSquare);
setdimensions;
end;
function TdavColorBox.number2color(w : word) : TColorSquare;
var r,g,b : byte;
begin
case ColorDepth of
cb8 : begin
r := w and $1;
g := (w shr 1) and 1;
b := (w shr 2) and $1;
result.x1 := border + (r + 2*g) * FCSquare;
result.y1 := border + b * FCSquare;
if r > 0 then r := $ff;
if g > 0 then g := $ff;
if b > 0 then b := $ff;
end;
cb64 : begin
r := (w and $3);
g := (w shr 2) and $3;
b := (w shr 4) and $3;
result.x1 := border + (r + 4*g) * FCSquare;
result.y1 := border + b * FCSquare;
r := r shl 6;
g := g shl 6;
b := b shl 6;
if r > 0 then r := r + $3f;
if g > 0 then g := g + $3f;
if b > 0 then b := b + $3f;
end;
cb512 : begin
r := (w and $7);
g := (w shr 3) and $7;
b := (w shr 6) and $7;
result.x1 := border + (r + 8*g) * FCSquare;
result.y1 := border + b * FCSquare;
r := r shl 5;
g := g shl 5;
b := b shl 5;
if r > 0 then r := r + $1f;
if g > 0 then g := g + $1f;
if b > 0 then b := b + $1f;
end;
end;//case
result.color := RGB(r,g,b);
end;
procedure TdavColorBox.Paint;
const Cmaxcolor : array[cb8..cb512] of word = (7,63,511);
var h,i,x1,y1 : integer;
cs : TColorSquare;
begin
with self do
with canvas do
begin
pen.color := $0;
pen.width := 1;
for i := 0 to border-1 do //borderpaint
begin
pen.color := Fborderlight;
moveto(width-1-i,i);
lineto(i,i);
lineto(i,height-1-i);
pen.color := FborderDark;
lineto(width-1-i,height-1-i);
lineto(width-1-i,i);
end;
//--
for i := 0 to Cmaxcolor[FColorDepth] do
begin
cs := number2color(i);
if FDirection = cbVert then //trade x,y positions for vertical
begin
h := cs.x1; cs.x1 := cs.y1; cs.y1 := h;
end;
brush.color := cs.color;
fillrect(rect(cs.x1,cs.y1,cs.x1+FCSquare,cs.y1+FCSquare));
end;//for i
//--
pen.color := $0;
for i := 0 to ((width-2*border) div FCSquare) do //sep. lines
begin
x1 := border + i * FCSquare;
moveto(x1,border);
lineto(x1,height - border);
end;
for i := 0 to ((height-2*border) div FCSquare) do
begin
y1 := border+ i * FCSquare;
moveto(border,y1);
lineto(width-border,y1);
end;
end;
end;
procedure TdavColorBox.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var h,v,temp : byte;
colornumber : word;
begin
if (x > Fborderwidth) and (x < width-Fborderwidth-1)
and (y > Fborderwidth) and (y < height-Fborderwidth-1) then
begin
h := (x - Fborderwidth) div FCsquare;
v := (y - Fborderwidth) div FCSquare;
end
else exit;
//--
if FDirection = cbVert then
begin
temp := h; h := v; v:= temp;
end;
case FColorDepth of
cb8 : colornumber := h + v * 4;
cb64 : colornumber := h + v * 16;
cb512 : colornumber := h + v * 64;
end;
Fcolor := number2color(colornumber).color;
if assigned(FOnSelect) then FonSelect(self,FColor);
end;
procedure TdavColorBox.Select(sender : TObject; selcolor : LongInt);
begin
if assigned(FOnSelect) then FonSelect(self,Fcolor);
end;
procedure TDavColorBox.setSquare(edge : byte);
begin
case FColorDepth of
cb8 : if edge > 40 then edge := 40;
cb64 : if edge > 20 then edge := 20;
cb512 : if edge > 10 then edge := 10;
end;
if edge < 5 then edge := 5;
FCSquare := edge;
setdimensions;
end;
procedure TdavColorBox.setBorderwidth(w : byte);
begin
if w > 10 then w := 10;
FBorderwidth := w;
setdimensions;
end;
procedure TdavColorBox.setBorderlight(c : longInt);
begin
FBorderlight := c;
paint;
end;
procedure TdavColorBox.setBorderdark(c : longInt);
begin
FBorderdark := c;
paint;
end;
end.
Project source code This Delphi-7 project consists of
- unit dav7colorpicker : unit that holds the component source code Click [ here ] to download the complete project.
|
||||||||||||
![]() |
![]() |