From ce951f772f6ab19cde6998e674255b7bd6eff225 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 23 Aug 2015 20:46:00 +0000 Subject: [PATCH] ColorPalette: Support named colors. New property "UseSpacers" (false: clNone is a "no-fill" color). Replace hkWebsafePalette2 by pkHTMLPalette. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4287 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/colorpalette/colorpalette.pas | 712 +++++++++++++++-------- components/colorpalette/demo/unit1.lfm | 22 +- components/colorpalette/demo/unit1.pas | 28 +- 3 files changed, 519 insertions(+), 243 deletions(-) diff --git a/components/colorpalette/colorpalette.pas b/components/colorpalette/colorpalette.pas index ce11baa12..f877c257d 100644 --- a/components/colorpalette/colorpalette.pas +++ b/components/colorpalette/colorpalette.pas @@ -29,7 +29,7 @@ 0,0,0 # inserts color r,g,b - 255,255,255 + 255,255,255 Pure white $NONE # inserts empty palette grid cell @@ -63,7 +63,7 @@ type TPaletteKind = (pkStandardPalette, pkExtendedPalette, pkSystemPalette, pkStandardAndSystemPalette, pkExtendedAndSystemPalette, - pkGradientPalette, pkWebSafePalette, pkWebSafePalette2); + pkGradientPalette, pkHTMLPalette, pkWebSafePalette); TColorMouseEvent = procedure (Sender: TObject; AColor: TColor; Shift: TShiftState) of object; TColorPaletteEvent = procedure (Sender: TObject; AColor: TColor) of object; @@ -82,7 +82,7 @@ type FOnSelectColor: TColorPaletteEvent; FOnGetHintText: TColorPaletteHintEvent; FRows: Integer; - FColors: TList; + FColors: TStringList; FSelectedColor: TColor; FSelectedIndex: Integer; FPickMode: TPickMode; @@ -98,29 +98,33 @@ type FBorderWidth: Integer; FPaletteKind: TPaletteKind; FGradientSteps: Byte; + FUseSpacers: Boolean; function GetColorCount: Integer; function GetColors(AIndex: Integer): TColor; + function GetColorNames(AIndex: Integer): String; function GetPickedColor: TColor; procedure SetBorderColor(const AValue: TColor); procedure SetBorderWidth(const AValue: Integer); procedure SetButtonHeight(const AValue: Integer); procedure SetButtonWidth(const AValue: Integer); + procedure SetColorNames(AIndex: Integer; const AValue: String); procedure SetColors(AIndex: Integer; const AValue: TColor); procedure SetCols(AValue: Integer); procedure SetGradientSteps(AValue: Byte); procedure SetPaletteKind(AValue: TPaletteKind); procedure SetSelectedIndex(AValue: Integer); procedure SetShowSelection(AValue: Boolean); + procedure SetUseSpacers(AValue: Boolean); protected procedure BlendWBColor(AColor: TColor; Steps: Integer); procedure ColorPick(AIndex: Integer; Shift: TShiftState); dynamic; procedure ColorMouseMove(AColor: TColor; Shift: TShiftState); dynamic; - procedure DoAddColor(AColor: TColor); virtual; + procedure DoAddColor(AColor: TColor; AColorName: String = ''); virtual; procedure DoColorPick(AColor: TColor; AShift: TShiftState); virtual; procedure DoDeleteColor(AIndex: Integer); virtual; procedure DoSelectColor(AColor: TColor); virtual; - function GetHintText(AColor: TColor): String; virtual; + function GetHintText(AIndex: Integer): String; virtual; function IsCorrectShift(Shift: TShiftState): Boolean; procedure MouseDown(Button: TMouseButton; Shift:TShiftState; X, Y:Integer); override; procedure MouseEnter; override; @@ -140,6 +144,7 @@ type property SelectedIndex: Integer read FSelectedIndex write SetSelectedIndex default 0; property ShowColorHint: Boolean read FShowColorHint write FShowColorHint default true; property ShowSelection: Boolean read FShowSelection write SetShowSelection default false; + property UseSpacers: Boolean read FUseSpacers write SetUseSpacers default true; property OnGetHintText: TColorPaletteHintEvent read FOnGetHintText write FOnGetHintText; public @@ -147,13 +152,14 @@ type destructor Destroy; override; procedure Paint; override; - procedure AddColor(AColor: TColor); + procedure AddColor(AColor: TColor; AColorName: String = ''); procedure ClearColors; procedure DeleteColor(AIndex: Integer); procedure LoadPalette(const FileName: String); procedure SavePalette(const FileName: String); property Colors[Index: Integer]: TColor read GetColors write SetColors; + property ColorNames[Index: Integer]: String read GetColorNames write SetColorNames; property ColorCount: Integer read GetColorCount; property PickedColor: TColor read GetPickedColor; deprecated 'Use SelectedColor'; property SelectedColor: TColor read FSelectedColor; @@ -181,6 +187,7 @@ type property SelectedIndex; property ShowColorHint; property ShowSelection; + property UseSpacers; property OnColorMouseMove; property OnColorPick; @@ -221,7 +228,7 @@ type implementation uses - LCLIntf; + LCLIntf, StrUtils; procedure Register; begin @@ -236,7 +243,7 @@ begin inherited; ControlStyle := ControlStyle + [csFixedWidth, csFixedHeight]; - FColors := TList.Create; + FColors := TStringList.Create; FBorderColor := clBlack; FBorderWidth := 1; FButtonWidth := 12; @@ -246,6 +253,7 @@ begin FPickShift := [ssLeft]; FShowColorHint := true; FGradientSteps := 3; + FUseSpacers := true; FCols := 8; SetPaletteKind(pkStandardPalette); @@ -258,9 +266,9 @@ begin inherited; end; -procedure TCustomColorPalette.AddColor(AColor: TColor); +procedure TCustomColorPalette.AddColor(AColor: TColor; AColorName: String = ''); begin - DoAddColor(AColor); + DoAddColor(AColor, AColorName); UpdateSize; Invalidate; end; @@ -319,9 +327,9 @@ begin Invalidate; end; -procedure TCustomColorPalette.DoAddColor(AColor: TColor); +procedure TCustomColorPalette.DoAddColor(AColor: TColor; AColorName: String = ''); begin - FColors.Add(Pointer(AColor)); + FColors.AddObject(AColorName, TObject(AColor)); end; procedure TCustomColorPalette.DoColorPick(AColor: TColor; AShift: TShiftState); @@ -349,32 +357,54 @@ begin Result := FColors.Count; end; -function TCustomColorPalette.GetColors(AIndex: Integer): TColor; +function TCustomColorPalette.GetColorNames(AIndex: Integer): String; begin - if (AIndex < 0) or (AIndex >= FColors.Count) then - Result := clNone - else - Result := TColor(PtrUInt(FColors.Items[AIndex])); + if (AIndex >= 0) and (AIndex < FColors.Count) then + begin + Result := FColors.Strings[AIndex]; + if Result = '' then + begin + Result := ColorToString(GetColors(AIndex)); + if FUseSpacers and (Result = ColorToString(clNone)) then + Result := ''; + end; + end else + Result := ''; end; -function TCustomColorPalette.GetHintText(AColor: TColor): string; +function TCustomColorPalette.GetColors(AIndex: Integer): TColor; +begin + if (AIndex >= 0) and (AIndex < FColors.Count) then + Result := TColor(PtrUInt(FColors.Objects[AIndex])) + else + Result := clNone; +end; + +function TCustomColorPalette.GetHintText(AIndex: Integer): string; const INDENT = '* '; - MASK = '%3:s'#13'%4:sRed: %0:d'#13'%4:sGreen: %1:d'#13'%4:sBlue: %2:d'; + MASK = '%0:s'#13'%4:sRed: %1:d'#13'%4:sGreen: %2:d'#13'%4:sBlue: %3:d'; +var + C: TColor; begin - if AColor = clNone then - Result := 'NONE' - else + C := GetColors(AIndex); + if C = clNone then begin - Result := ColorToString(AColor); - if (Result[1] = 'c') and (Result[2] = 'l') then + if FUseSpacers then + Result := '' + else + Result := 'None' + end else + begin + Result := GetColorNames(AIndex); + if (Result <> '') and (Result[1] = 'c') and (Result[2] = 'l') then Delete(Result, 1, 2); Result := Format(MASK, [ - Red(AColor), Green(AColor), Blue(AColor), Uppercase(Result), INDENT] + Result, Red(C), Green(C), Blue(C), INDENT] ); end; if Assigned(FOnGetHintText) then - FOnGetHintText(Self, AColor, Result); + FOnGetHintText(Self, C, Result); end; function TCustomColorPalette.GetPickedColor: TColor; @@ -396,24 +426,66 @@ var F: TextFile; Line: String; C: TColor; + clrName: String; + p, steps: Integer; - function ParseColor(var S: String): TColor; + procedure ParseColor(S: String; out AColor: TColor; out Steps: Integer; + out ColorName: String); var - R, G, B: Integer; - I: Integer; + I, counter: Integer; + L: TStringList; + tmp: String; + P: PChar; + R,G,B: Integer; begin - R := StrToIntDef(Copy(S, 1, Pos(',', S) - 1), 0); - Delete(S, 1, Pos(',', S)); - G := StrToIntDef(Copy(S, 1, Pos(',', S) - 1), 0); - Delete(S, 1, Pos(',', S)); - - S := TrimLeft(S); - I := 1; - while (I <= Length(S)) and (S[I] in ['0'..'9']) do Inc(I); - B := StrToIntDef(Copy(S, 1, Pred(I)), 0); - Delete(S, 1, Pred(I)); - - Result := RGBToColor(Max(0, Min(R, 255)), Max(0, Min(G, 255)), Max(0, Min(B, 255))); + R := 0; + G := 0; + B := 0; + Steps := 0; + ColorName := ''; + tmp := ''; + P := PChar(S); + counter := 0; + // Skip leading spaces + while (P^ = ' ') do inc(P); + while P^ <> #0 do begin + case P^ of + ' ': begin + if counter = 2 then begin + B := StrToIntDef(tmp, B); + inc(counter); + tmp := ''; + while P^ = ' ' do inc(P); + end else + if counter > 2 then + begin + tmp := tmp + ' '; + inc(P); + end; + end; + ',': begin + case counter of + 0: R := StrToIntDef(tmp, R); + 1: G := StrToIntDef(tmp, G); + end; + inc(counter); + tmp := ''; + inc(P); + while P^ = ' ' do inc(P); + end; + else tmp := tmp + P^; + inc(P); + end; + end; + if tmp <> '' then + case counter of + 0: R := StrToIntDef(tmp, R); + 1: G := StrToIntDef(tmp, B); + 2: B := StrToIntDef(tmp, B); + else + if not TryStrToInt(tmp, Steps) then ColorName := tmp; + end; + AColor := RGBToColor(Max(0, Min(R, 255)), Max(0, Min(G, 255)), Max(0, Min(B, 255))); end; begin @@ -431,20 +503,32 @@ begin ReadLn(F, Line); Line := Trim(Line); if Length(Line) < 2 then Continue; - if Line[1] = '#' then Continue; + if Line[1] = '#' then + Continue; + // Allow '#' as comment within line + p := pos('#', Line); + if p > 0 then + Line := TrimRight(Copy(Line, 1, p-1)); + // Parse data lines if Line[1] = '$' then begin - if Copy(Line, 2, 4) = 'NONE' then DoAddColor(clNone); - if Copy(Line, 2, 4) = 'COLS' then FCols := StrToIntDef(Copy(Line, 6, MaxInt), 8); + if Copy(Line, 2, 4) = 'NONE' then + DoAddColor(clNone); + if Copy(Line, 2, 4) = 'COLS' then + FCols := StrToIntDef(Copy(Line, 6, MaxInt), 8); if Copy(Line, 2, 7) = 'BLENDWB' then begin Delete(Line, 1, 8); - C := ParseColor(Line); - BlendWBColor(C, StrToInt(Line)); + ParseColor(Line, C, steps, clrName); + BlendWBColor(C, steps); end; end else - if Pos(',', Line) > 0 then DoAddColor(ParseColor(Line)); + if Pos(',', Line) > 0 then + begin + ParseColor(Line, C, steps, clrName); + DoAddColor(C, clrName); + end; end; finally Close(F); @@ -504,16 +588,18 @@ begin C := GetColors(FMouseIndex); if ShowHint and FShowColorHint then begin - Hint := GetHintText(c); + Hint := GetHintText(FMouseIndex); if FMouseIndex <> FPrevMouseIndex then Application.ActivateHint(ClientToScreen(Point(X, Y))); end; if (FMouseIndex <> FPrevMouseIndex) then begin - if C <> clNone then + if not (FUseSpacers and (C = clNone)) then + begin ColorMouseMove(C, Shift); - if FPickMode = pmContinuous then - ColorPick(FMouseIndex, Shift); + if FPickMode = pmContinuous then + ColorPick(FMouseIndex, Shift); + end; end; end; @@ -548,12 +634,22 @@ procedure TCustomColorPalette.Paint; procedure PaintBox(x1, y1, x2, y2: Integer; c: TColor); begin - if c = clNone then + if FUseSpacers and (c = clNone) then exit; // Fill interior - Canvas.Brush.Color := c; - Canvas.FillRect(x1, y1, x2, y2); + if c = clNone then + begin + Canvas.Pen.Color := clBlack; + Canvas.Pen.Width := 1; + Canvas.Pen.Style := psSolid; + Canvas.Line(x1, y1, x2, y2); + Canvas.Line(x1, y2, x2, y1); + end else + begin + Canvas.Brush.Color := c; + Canvas.FillRect(x1, y1, x2, y2); + end; // Paint border if (FBorderColor <> clNone) and (FBorderWidth > 0) then @@ -620,6 +716,7 @@ var i: Integer; L: TStringList; clr: TColor; + clrName: String; r,g,b: Byte; begin L := TStringList.Create; @@ -631,7 +728,11 @@ begin L.Add('$NONE') else begin RedGreenBlue(clr, r,g,b); - L.Add(Format('%d, %d, %d',[r, g, b])); + clrName := ColorNames[i]; + if clrName = '' then + L.Add(Format('%d, %d, %d',[r, g, b])) + else + L.Add(Format('%d, %d, %d %s', [r, g, b, clrName])); end; end; L.SaveToFile(FileName); @@ -671,9 +772,14 @@ begin UpdateSize; end; +procedure TCustomColorPalette.SetColorNames(AIndex: Integer; const AValue: String); +begin + FColors.Strings[AIndex] := AValue; +end; + procedure TCustomColorPalette.SetColors(AIndex: Integer; const AValue: TColor); begin - FColors.Items[AIndex] := Pointer(AValue); + FColors.Objects[AIndex] := TObject(AValue); Invalidate; end; @@ -699,19 +805,10 @@ begin end; procedure TCustomColorPalette.SetPaletteKind(AValue: TPaletteKind); - - function FixHex(hx: String): TColor; - var - r, g, b, color: string; - begin - r := copy(hx,1,2); - g := copy(hx,3,2); - b := copy(hx,5,2); - Result := StringToColor('$0' + b + g + r); - end; - const STEPS: array[0..4] of byte = (0, 64, 128, 192, 255); + + // Number of columns for each built-in palette, for a decent layout. COLCOUNT: array[TPaletteKind] of Integer = ( 8, // StandardPalette = 16 standard colors 4, // ExtendedPalette = 16 standard colors + 4 extra colors @@ -719,8 +816,8 @@ const 8, // StandardAndSystemPalette = 16 standard + 25 system colors = 41 colors 5, // ExtendedAndSystemPalette = 16 std + 4 extra + 25 system colors = 45 colors -1, // Gradient palette - color count depends on PaletteStep - 6, // Websafe palette - 14 // Websafe palette #2 + 10, // HTML palette + 6 // Websafe palette #2 ); var i, n: Integer; @@ -802,6 +899,309 @@ begin SetCols(n*2 + 1); end; + if FPaletteKind = pkHTMLPalette then + // https://en.wikipedia.org/wiki/Web_colors#X11_color_names + begin + // White_colors + DoAddColor(RGBToColor(255,255,255), 'White'); + DoAddColor(RGBToColor(255,250,250), 'Snow'); + DoAddColor(RGBToColor(240,255,240), 'Honeydew'); + DoAddColor(RGBToColor(245,255,250), 'MintCream'); + DoAddColor(RGBToColor(240,255,255), 'Azure'); + DoAddColor(RGBToColor(240,248,255), 'AliceBlue'); + DoAddColor(RGBToColor(248,248,255), 'GhostWhite'); + DoAddColor(RGBToColor(245,245,245), 'WhiteSmoke'); + DoAddColor(RGBToColor(255,245,238), 'Seashell'); + DoAddColor(RGBToColor(245,245,220), 'Beige'); + DoAddColor(RGBToColor(253,245,230), 'OldLace'); + DoAddColor(RGBToColor(255,250,240), 'FloralWhite'); + DoAddColor(RGBToColor(255,255,240), 'Ivory'); + DoAddColor(RGBToColor(250,235,215), 'AntiqueWhite'); + DoAddColor(RGBToColor(250,240,230), 'Linen'); + DoAddColor(RGBToColor(255,240,245), 'LavenderBlush'); + DoAddColor(RGBToColor(255,228,225), 'MistyRose'); + // Pink_colors + DoAddColor(RGBToColor(255,192,203), 'Pink'); + DoAddColor(RGBToColor(255,182,193), 'LightPink'); + DoAddColor(RGBToColor(255,105,180), 'HotPink'); + DoAddColor(RGBToColor(255, 20,147), 'DeepPink'); + DoAddColor(RGBToColor(219,112,147), 'PaleVioletRed'); + DoAddColor(RGBToColor(199, 21,133), 'MediumVioletRed'); + // Red_colors + DoAddColor(RGBToColor(255,160,122), 'LightSalmon'); + DoAddColor(RGBToColor(250,128,114), 'Salmon'); + DoAddColor(RGBToColor(233,150,122), 'DarkSalmon'); + DoAddColor(RGBToColor(240,128,128), 'LightCoral'); + DoAddColor(RGBToColor(205, 92, 92), 'IndianRed'); + DoAddColor(RGBToColor(220, 20, 60), 'Crimson'); + DoAddColor(RGBToColor(178, 34, 34), 'FireBrick'); + DoAddColor(RGBToColor(139, 0, 0), 'DarkRed'); + DoAddColor(RGBToColor(255, 0, 0), 'Red'); + // Orange_colors + DoAddColor(RGBToColor(255, 69, 0), 'OrangeRed'); + DoAddColor(RGBToColor(255, 99, 71), 'Tomato'); + DoAddColor(RGBToColor(255,127, 80), 'Coral'); + DoAddColor(RGBToColor(255,140, 0), 'DarkOrange'); + DoAddColor(RGBToColor(255,165, 0), 'Orange'); + // Yellow_colors + DoAddColor(RGBToColor(255,255, 0), 'Yellow'); + DoAddColor(RGBToColor(255,255,224), 'LightYellow'); + DoAddColor(RGBToColor(255,250,205), 'LemonChiffon'); + DoAddColor(RGBToColor(250,250,210), 'LightGoldenrodYellow'); + DoAddColor(RGBToColor(255,239,213), 'PapayaWhip'); + DoAddColor(RGBToColor(255,228,181), 'Moccasin'); + DoAddColor(RGBToColor(255,218,185), 'PeachPuff'); + DoAddColor(RGBToColor(238,232,170), 'PaleGoldenrod'); + DoAddColor(RGBToColor(240,230,140), 'Khaki'); + DoAddColor(RGBToColor(189,183,107), 'DarkKhaki'); + DoAddColor(RGBToColor(255,215, 0), 'Gold'); + // Brown_colors + DoAddColor(RGBToColor(255,248,220), 'Cornsilk'); + DoAddColor(RGBToColor(255,235,205), 'BlanchedAlmond'); + DoAddColor(RGBToColor(255,228,196), 'Bisque'); + DoAddColor(RGBToColor(255,222,173), 'NavajoWhite'); + DoAddColor(RGBToColor(245,222,179), 'Wheat'); + DoAddColor(RGBToColor(222,184,135), 'BurlyWood'); + DoAddColor(RGBToColor(210,180,140), 'Tan'); + DoAddColor(RGBToColor(188,143,143), 'RosyBrown'); + DoAddColor(RGBToColor(244,164, 96), 'SandyBrown'); + DoAddColor(RGBToColor(218,165, 32), 'Goldenrod'); + DoAddColor(RGBToColor(184,134, 11), 'DarkGoldenrod'); + DoAddColor(RGBToColor(205,133, 63), 'Peru'); + DoAddColor(RGBToColor(210,105, 30), 'Chocolate'); + DoAddColor(RGBToColor(139, 69, 19), 'SaddleBrown'); + DoAddColor(RGBToColor(160, 82, 45), 'Sienna'); + DoAddColor(RGBToColor(165, 42, 42), 'Brown'); + DoAddColor(RGBToColor(128, 0, 0), 'Maroon'); + // Green_colors + DoAddColor(RGBToColor( 85,107, 47), 'DarkOliveGreen'); + DoAddColor(RGBToColor(128,128, 0), 'Olive'); + DoAddColor(RGBToColor(107,142, 35), 'OliveDrab'); + DoAddColor(RGBToColor(154,205, 50), 'YellowGreen'); + DoAddColor(RGBToColor( 50,205, 50), 'LimeGreen'); + DoAddColor(RGBToColor( 0,255, 0), 'Lime'); + DoAddColor(RGBToColor(124,252, 0), 'LawnGreen'); + DoAddColor(RGBToColor(127,255, 0), 'Chartreuse'); + DoAddColor(RGBToColor(173,255, 47), 'GreenYellow'); + DoAddColor(RGBToColor( 0,255,127), 'SpringGreen'); + DoAddColor(RGBToColor( 0,250,154), 'MediumSpringGreen'); + DoAddColor(RGBToColor(144,238,144), 'LightGreen'); + DoAddColor(RGBToColor(152,251,152), 'PaleGreen'); + DoAddColor(RGBToColor(143,188,143), 'DarkSeaGreen'); + DoAddColor(RGBToColor( 60,179,113), 'MediumSeaGreen'); + DoAddColor(RGBToColor( 46,139, 87), 'SeaGreen'); + DoAddColor(RGBToColor( 34,139, 34), 'ForestGreen'); + DoAddColor(RGBToColor( 0,128, 0), 'Green'); + DoAddColor(RGBToColor( 0,100, 0), 'DarkGreen'); + // Cyan_colors + DoAddColor(RGBToColor(102,205,170), 'MediumAquamarine'); + DoAddColor(RGBToColor( 0,255,255), 'Aqua'); +// DoAddColor(RGBToColor( 0,255,255), 'Cyan'); + DoAddColor(RGBToColor(224,255,255), 'LightCyan'); + DoAddColor(RGBToColor(175,238,238), 'PaleTurquoise'); + DoAddColor(RGBToColor(127,255,212), 'Aquamarine'); + DoAddColor(RGBToColor( 64,224,208), 'Turquoise'); + DoAddColor(RGBToColor( 72,209,204), 'MediumTurquoise'); + DoAddColor(RGBToColor( 0,206,209), 'DarkTurquoise'); + DoAddColor(RGBToColor( 32,178,170), 'LightSeaGreen'); + DoAddColor(RGBToColor( 95,158,160), 'CadetBlue'); + DoAddColor(RGBToColor( 0,139,139), 'DarkCyan'); + DoAddColor(RGBToColor( 0,128,128), 'Teal'); + // Blue_colors + DoAddColor(RGBToColor(176,196,222), 'LightSteelBlue'); + DoAddColor(RGBToColor(176,224,230), 'PowderBlue'); + DoAddColor(RGBToColor(173,216,230), 'LightBlue'); + DoAddColor(RGBToColor(135,206,235), 'SkyBlue'); + DoAddColor(RGBToColor(135,206,250), 'LightSkyBlue'); + DoAddColor(RGBToColor( 0,191,255), 'DeepSkyBlue'); + DoAddColor(RGBToColor( 30,144,255), 'DodgerBlue'); + DoAddColor(RGBToColor(100,149,237), 'CornflowerBlue'); + DoAddColor(RGBToColor( 70,130,180), 'SteelBlue'); + DoAddColor(RGBToColor( 65,105,225), 'RoyalBlue'); + DoAddColor(RGBToColor( 0, 0,255), 'Blue'); + DoAddColor(RGBToColor( 0, 0,205), 'MediumBlue'); + DoAddColor(RGBToColor( 0, 0,139), 'DarkBlue'); + DoAddColor(RGBToColor( 0, 0,128), 'Navy'); + DoAddColor(RGBToColor( 25, 25,112), 'MidnightBlue'); + // Purple/Violet/Magenta colors + DoAddColor(RGBToColor(230,230,250), 'Lavender'); + DoAddColor(RGBToColor(216,191,216), 'Thistle'); + DoAddColor(RGBToColor(221,160,221), 'Plum'); + DoAddColor(RGBToColor(238,130,238), 'Violet'); + DoAddColor(RGBToColor(218,112,214), 'Orchid'); + DoAddColor(RGBToColor(255, 0,255), 'Fuchsia'); + DoAddColor(RGBToColor(255, 0,255), 'Magenta'); + DoAddColor(RGBToColor(186, 85,211), 'MediumOrchid'); + DoAddColor(RGBToColor(147,112,219), 'MediumPurple'); + DoAddColor(RGBToColor(138, 43,226), 'BlueViolet'); + DoAddColor(RGBToColor(148, 0,211), 'DarkViolet'); + DoAddColor(RGBToColor(153, 50,204), 'DarkOrchid'); + DoAddColor(RGBToColor(139, 0,139), 'DarkMagenta'); + DoAddColor(RGBToColor(128, 0,128), 'Purple'); + DoAddColor(RGBToColor( 75, 0,130), 'Indigo'); + DoAddColor(RGBToColor( 72, 61,139), 'DarkSlateBlue'); + DoAddColor(RGBToColor(102, 51,153), 'RebeccaPurple'); + DoAddColor(RGBToColor(106, 90,205), 'SlateBlue'); + DoAddColor(RGBToColor(123,104,238), 'MediumSlateBlue'); + // Gray/Black_colors + DoAddColor(RGBToColor(220,220,220), 'Gainsboro'); + DoAddColor(RGBToColor(211,211,211), 'LightGrey'); + DoAddColor(RGBToColor(192,192,192), 'Silver'); + DoAddColor(RGBToColor(169,169,169), 'DarkGray'); + DoAddColor(RGBToColor(128,128,128), 'Gray'); + DoAddColor(RGBToColor(105,105,105), 'DimGray'); + DoAddColor(RGBToColor(119,136,153), 'LightSlateGray'); + DoAddColor(RGBToColor(112,128,144), 'SlateGray'); + DoAddColor(RGBToColor( 47, 79, 79), 'DarkSlateGray'); + DoAddColor(RGBToColor( 0, 0, 0), 'Black'); + end; + + { + if FPaletteKind = pkHTMLPalette then + begin + DoAddColor(RGBToColor(255,255,255), 'white'); + DoAddColor(RGBToColor(255,255,240), 'ivory'); + DoAddColor(RGBToColor(255,255,224), 'lightyellow'); + DoAddColor(RGBToColor(255,255, 0), 'yellow'); + DoAddColor(RGBToColor(255,250,250), 'snow'); + DoAddColor(RGBToColor(255,250,240), 'floralwhite'); + DoAddColor(RGBToColor(255,250,205), 'lemonchiffon'); + DoAddColor(RGBToColor(255,248,220), 'cornsilk'); + DoAddColor(RGBToColor(255,245,238), 'seashell'); + DoAddColor(RGBToColor(255,240,245), 'lavenderblush'); + DoAddColor(RGBToColor(255,239,213), 'papayawhip'); + DoAddColor(RGBToColor(255,235,205), 'blanchedalmond'); + DoAddColor(RGBToColor(255,228,225), 'mistyrose'); + DoAddColor(RGBToColor(255,228,196), 'bisque'); + DoAddColor(RGBToColor(255,228,181), 'moccasin'); + DoAddColor(RGBToColor(255,222,173), 'navajowhite'); + DoAddColor(RGBToColor(255,218,185), 'peachpuff'); + DoAddColor(RGBToColor(255,215, 0), 'gold'); + DoAddColor(RGBToColor(255,192,203), 'pink'); + DoAddColor(RGBToColor(255,182,193), 'lightpink'); + DoAddColor(RGBToColor(255,165, 0), 'orange'); + DoAddColor(RGBToColor(255,160,122), 'lightsalmon'); + DoAddColor(RGBToColor(255,140, 0), 'darkorange'); + DoAddColor(RGBToColor(255,127, 80), 'coral'); + DoAddColor(RGBToColor(255,105,180), 'hotpink'); + DoAddColor(RGBToColor(255, 99, 71), 'tomato'); + DoAddColor(RGBToColor(255, 69, 0), 'orangered'); + DoAddColor(RGBToColor(255, 20,147), 'deeppink'); + DoAddColor(RGBToColor(255, 0,255), 'fuchsia'); + DoAddColor(RGBToColor(255, 0,255), 'fuchsia'); + DoAddColor(RGBToColor(255, 0, 0), 'red'); + DoAddColor(RGBToColor(253,245,230), 'oldlace'); + DoAddColor(RGBToColor(250,250,210), 'lightgoldenrodyellow'); + DoAddColor(RGBToColor(250,240,230), 'linen'); + DoAddColor(RGBToColor(250,235,215), 'antiquewhite'); + DoAddColor(RGBToColor(250,128,114), 'salmon'); + DoAddColor(RGBToColor(248,248,255), 'ghostwhite'); + DoAddColor(RGBToColor(245,255,250), 'mintcream'); + DoAddColor(RGBToColor(245,245,245), 'whitesmoke'); + DoAddColor(RGBToColor(245,245,220), 'beige'); + DoAddColor(RGBToColor(245,222,179), 'wheat'); + DoAddColor(RGBToColor(244,164, 96), 'sandybrown'); + DoAddColor(RGBToColor(240,255,255), 'azure'); + DoAddColor(RGBToColor(240,255,240), 'honeydew'); + DoAddColor(RGBToColor(240,248,255), 'aliceblue'); + DoAddColor(RGBToColor(240,230,140), 'khaki'); + DoAddColor(RGBToColor(240,128,128), 'lightcoral'); + DoAddColor(RGBToColor(238,232,170), 'palegoldenrod'); + DoAddColor(RGBToColor(238,130,238), 'violet'); + DoAddColor(RGBToColor(233,150,122), 'darksalmon'); + DoAddColor(RGBToColor(230,230,250), 'lavender'); + DoAddColor(RGBToColor(224,255,255), 'lightcyan'); + DoAddColor(RGBToColor(222,184,135), 'burlywood'); + DoAddColor(RGBToColor(221,160,221), 'plum'); + DoAddColor(RGBToColor(220,220,220), 'gainsboro'); + DoAddColor(RGBToColor(220, 20, 60), 'crimson'); + DoAddColor(RGBToColor(219,112,147), 'palevioletred'); + DoAddColor(RGBToColor(218,165, 32), 'goldenrod'); + DoAddColor(RGBToColor(218,112,214), 'orchid'); + DoAddColor(RGBToColor(216,191,216), 'thistle'); + DoAddColor(RGBToColor(211,211,211), 'lightgrey'); + DoAddColor(RGBToColor(210,180,140), 'tan'); + DoAddColor(RGBToColor(210,105, 30), 'chocolate'); + DoAddColor(RGBToColor(205,133, 63), 'peru'); + DoAddColor(RGBToColor(205, 92, 92), 'indianred'); + DoAddColor(RGBToColor(199, 21,133), 'mediumvioletred'); + DoAddColor(RGBToColor(192,192,192), 'silver'); + DoAddColor(RGBToColor(189,183,107), 'darkkhaki'); + DoAddColor(RGBToColor(188,143,143), 'rosybrown'); + DoAddColor(RGBToColor(186, 85,211), 'mediumorchid'); + DoAddColor(RGBToColor(184,134, 11), 'darkgoldenrod'); + DoAddColor(RGBToColor(178, 34, 34), 'firebrick'); + DoAddColor(RGBToColor(176,224,230), 'powderblue'); + DoAddColor(RGBToColor(176,196,222), 'lightsteelblue'); + DoAddColor(RGBToColor(175,238,238), 'paleturquoise'); + DoAddColor(RGBToColor(173,255, 47), 'greenyellow'); + DoAddColor(RGBToColor(173,216,230), 'lightblue'); + DoAddColor(RGBToColor(169,169,169), 'darkgray'); + DoAddColor(RGBToColor(165, 42, 42), 'brown'); + DoAddColor(RGBToColor(160, 82, 45), 'sienna'); + DoAddColor(RGBToColor(154,205, 50), 'yellowgreen'); + DoAddColor(RGBToColor(153, 50,204), 'darkorchid'); + DoAddColor(RGBToColor(152,251,152), 'palegreen'); + DoAddColor(RGBToColor(148, 0,211), 'darkviolet'); + DoAddColor(RGBToColor(147,112,219), 'mediumpurple'); + DoAddColor(RGBToColor(144,238,144), 'lightgreen'); + DoAddColor(RGBToColor(143,188,143), 'darkseagreen'); + DoAddColor(RGBToColor(139, 69, 19), 'saddlebrown'); + DoAddColor(RGBToColor(139, 0,139), 'darkmagenta'); + DoAddColor(RGBToColor(139, 0, 0), 'darkred'); + DoAddColor(RGBToColor(138, 43,226), 'blueviolet'); + DoAddColor(RGBToColor(135,206,250), 'lightskyblue'); + DoAddColor(RGBToColor(135,206,235), 'skyblue'); + DoAddColor(RGBToColor(128,128,128), 'gray'); + DoAddColor(RGBToColor(128,128, 0), 'olive'); + DoAddColor(RGBToColor(128, 0,128), 'purple'); + DoAddColor(RGBToColor(128, 0, 0), 'maroon'); + DoAddColor(RGBToColor(127,255,212), 'aquamarine'); + DoAddColor(RGBToColor(127,255, 0), 'chartreuse'); + DoAddColor(RGBToColor(124,252, 0), 'lawngreen'); + DoAddColor(RGBToColor(123,104,238), 'mediumslateblue'); + DoAddColor(RGBToColor(119,136,153), 'lightslategray'); + DoAddColor(RGBToColor(112,128,144), 'slategray'); + DoAddColor(RGBToColor(107,142, 35), 'olivedrab'); + DoAddColor(RGBToColor(106, 90,205), 'slateblue'); + DoAddColor(RGBToColor(105,105,105), 'dimgray'); + DoAddColor(RGBToColor(102,205,170), 'mediumaquamarine'); + DoAddColor(RGBToColor(100,149,237), 'cornflowerblue'); + DoAddColor(RGBToColor( 95,158,160), 'cadetblue'); + DoAddColor(RGBToColor( 85,107, 47), 'darkolivegreen'); + DoAddColor(RGBToColor( 75, 0,130), 'indigo'); + DoAddColor(RGBToColor( 72,209,204), 'mediumturquoise'); + DoAddColor(RGBToColor( 72, 61,139), 'darkslateblue'); + DoAddColor(RGBToColor( 70,130,180), 'steelblue'); + DoAddColor(RGBToColor( 65,105,225), 'royalblue'); + DoAddColor(RGBToColor( 64,224,208), 'turquoise'); + DoAddColor(RGBToColor( 60,179,113), 'mediumseagreen'); + DoAddColor(RGBToColor( 50,205, 50), 'limegreen'); + DoAddColor(RGBToColor( 47, 79, 79), 'darkslategray'); + DoAddColor(RGBToColor( 46,139, 87), 'seagreen'); + DoAddColor(RGBToColor( 34,139, 34), 'forestgreen'); + DoAddColor(RGBToColor( 32,178,170), 'lightseagreen'); + DoAddColor(RGBToColor( 30,144,255), 'dodgerblue'); + DoAddColor(RGBToColor( 25, 25,112), 'midnightblue'); + DoAddColor(RGBToColor( 0,255,255), 'aqua'); + DoAddColor(RGBToColor( 0,255,255), 'cyan'); + DoAddColor(RGBToColor( 0,255,127), 'springgreen'); + DoAddColor(RGBToColor( 0,255, 0), 'lime'); + DoAddColor(RGBToColor( 0,250,154), 'mediumspringgreen'); + DoAddColor(RGBToColor( 0,206,209), 'darkturquoise'); + DoAddColor(RGBToColor( 0,191,255), 'deepskyblue'); + DoAddColor(RGBToColor( 0,139,139), 'darkcyan'); + DoAddColor(RGBToColor( 0,128,128), 'teal'); + DoAddColor(RGBToColor( 0,128, 0), 'green'); + DoAddColor(RGBToColor( 0,100, 0), 'darkgreen'); + DoAddColor(RGBToColor( 0, 0,255), 'blue'); + DoAddColor(RGBToColor( 0, 0,205), 'mediumblue'); + DoAddColor(RGBToColor( 0, 0,139), 'darkblue'); + DoAddColor(RGBToColor( 0, 0,128), 'navy'); + DoAddColor(RGBToColor( 0, 0, 0), 'black'); + end; + } + if FPaletteKind = pkWebSafePalette then begin // https://en.wikipedia.org/wiki/Web_colors @@ -811,173 +1211,6 @@ begin DoAddColor(RGBToColor(r*$33, g*$33, b*$33)); end; - if FPaletteKind = pkWebSafePalette2 then - begin - DoAddColor(FixHex('f0f8ff')); // 140 - DoAddColor(FixHex('faebd7')); - DoAddColor(FixHex('00ffff')); - DoAddColor(FixHex('7fffd4')); - DoAddColor(FixHex('f0ffff')); - DoAddColor(FixHex('f5f5dc')); - - DoAddColor(FixHex('ffe4c4')); - DoAddColor(FixHex('000000')); - DoAddColor(FixHex('ffebcd')); - DoAddColor(FixHex('0000ff')); - DoAddColor(FixHex('8a2be2')); - DoAddColor(FixHex('a52a2a')); - - DoAddColor(FixHex('deb887')); - DoAddColor(FixHex('5f9ea0')); - DoAddColor(FixHex('7fff00')); - DoAddColor(FixHex('d2691e')); - DoAddColor(FixHex('ff7f50')); - DoAddColor(FixHex('6495ed')); - - DoAddColor(FixHex('fff8dc')); - DoAddColor(FixHex('dc143c')); - DoAddColor(FixHex('00ffff')); - DoAddColor(FixHex('00008b')); - DoAddColor(FixHex('008b8b')); - DoAddColor(FixHex('b8860b')); - - DoAddColor(FixHex('a9a9a9')); - DoAddColor(FixHex('006400')); - DoAddColor(FixHex('bdb76b')); - DoAddColor(FixHex('8b008b')); - DoAddColor(FixHex('556b2f')); - DoAddColor(FixHex('ff8c00')); - - DoAddColor(FixHex('9932cc')); - DoAddColor(FixHex('8b0000')); - DoAddColor(FixHex('e9967a')); - DoAddColor(FixHex('8fbc8f')); - DoAddColor(FixHex('483d8b')); - DoAddColor(FixHex('2f4f4f')); - - DoAddColor(FixHex('00ced1')); - DoAddColor(FixHex('9400d3')); - DoAddColor(FixHex('ff1493')); - DoAddColor(FixHex('00bfff')); - DoAddColor(FixHex('696969')); - DoAddColor(FixHex('1e90ff')); - - DoAddColor(FixHex('b22222')); - DoAddColor(FixHex('fffaf0')); - DoAddColor(FixHex('228b22')); - DoAddColor(FixHex('ff00ff')); - DoAddColor(FixHex('dcdcdc')); - DoAddColor(FixHex('f8f8ff')); - - DoAddColor(FixHex('ffd700')); - DoAddColor(FixHex('daa520')); - DoAddColor(FixHex('808080')); - DoAddColor(FixHex('008000')); - DoAddColor(FixHex('adff2f')); - DoAddColor(FixHex('f0fff0')); - - DoAddColor(FixHex('ff69b4')); - DoAddColor(FixHex('cd5c5c')); - DoAddColor(FixHex('4b0082')); - DoAddColor(FixHex('fffff0')); - DoAddColor(FixHex('f0e68c')); - DoAddColor(FixHex('e6e6fa')); - - DoAddColor(FixHex('fff0f5')); - DoAddColor(FixHex('7cfc00')); - DoAddColor(FixHex('fffacd')); - DoAddColor(FixHex('add8e6')); - DoAddColor(FixHex('f08080')); - DoAddColor(FixHex('e0ffff')); - - DoAddColor(FixHex('fafad2')); - DoAddColor(FixHex('90ee90')); - DoAddColor(FixHex('d3d3d3')); - DoAddColor(FixHex('ffb6c1')); - DoAddColor(FixHex('ffa07a')); - DoAddColor(FixHex('20b2aa')); - - DoAddColor(FixHex('87cefa')); - DoAddColor(FixHex('778899')); - DoAddColor(FixHex('b0c4de')); - DoAddColor(FixHex('ffffe0')); - DoAddColor(FixHex('00ff00')); - DoAddColor(FixHex('32cd32')); - - DoAddColor(FixHex('faf0e6')); - DoAddColor(FixHex('ff00ff')); - DoAddColor(FixHex('800000')); - DoAddColor(FixHex('66cdaa')); - DoAddColor(FixHex('0000cd')); - DoAddColor(FixHex('ba55d3')); - - DoAddColor(FixHex('9370db')); - DoAddColor(FixHex('3cb371')); - DoAddColor(FixHex('7b68ee')); - DoAddColor(FixHex('00fa9a')); - DoAddColor(FixHex('48d1cc')); - DoAddColor(FixHex('c71585')); - - DoAddColor(FixHex('191970')); - DoAddColor(FixHex('f5fffa')); - DoAddColor(FixHex('ffe4e1')); - DoAddColor(FixHex('ffe4b5')); - DoAddColor(FixHex('ffdead')); - DoAddColor(FixHex('000080')); - - DoAddColor(FixHex('fdf5e6')); - DoAddColor(FixHex('808000')); - DoAddColor(FixHex('6b8e23')); - DoAddColor(FixHex('ffa500')); - DoAddColor(FixHex('ff4500')); - DoAddColor(FixHex('da70d6')); - - DoAddColor(FixHex('eee8aa')); - DoAddColor(FixHex('98fb98')); - DoAddColor(FixHex('afeeee')); - DoAddColor(FixHex('db7093')); - DoAddColor(FixHex('ffefd5')); - DoAddColor(FixHex('ffdab9')); - - DoAddColor(FixHex('cd853f')); - DoAddColor(FixHex('ffc0cb')); - DoAddColor(FixHex('dda0dd')); - DoAddColor(FixHex('b0e0e6')); - DoAddColor(FixHex('800080')); - DoAddColor(FixHex('ff0000')); - - DoAddColor(FixHex('bc8f8f')); - DoAddColor(FixHex('4169e1')); - DoAddColor(FixHex('8b4513')); - DoAddColor(FixHex('fa8072')); - DoAddColor(FixHex('f4a460')); - DoAddColor(FixHex('2e8b57')); - - DoAddColor(FixHex('fff5ee')); - DoAddColor(FixHex('a0522d')); - DoAddColor(FixHex('c0c0c0')); - DoAddColor(FixHex('87ceeb')); - DoAddColor(FixHex('6a5acd')); - DoAddColor(FixHex('708090')); - - DoAddColor(FixHex('fffafa')); - DoAddColor(FixHex('00ff7f')); - DoAddColor(FixHex('4682b4')); - DoAddColor(FixHex('d2b48c')); - DoAddColor(FixHex('008080')); - DoAddColor(FixHex('d8bfd8')); - - DoAddColor(FixHex('ff6347')); - DoAddColor(FixHex('40e0d0')); - DoAddColor(FixHex('ee82ee')); - DoAddColor(FixHex('f5deb3')); - DoAddColor(FixHex('ffffff')); - DoAddColor(FixHex('f5f5f5')); - - DoAddColor(FixHex('ffff00')); - DoAddColor(FixHex('9acd32')); - end; - if FPaletteKind <> pkGradientPalette then SetCols(COLCOUNT[FPaletteKind]); end; @@ -1002,6 +1235,13 @@ begin Invalidate; end; +procedure TCustomColorPalette.SetUseSpacers(AValue: Boolean); +begin + if FUseSpacers = AValue then exit; + FUseSpacers := AValue; + Invalidate; +end; + procedure TCustomColorPalette.UpdateSize; begin if (FCols = 0) or (FColors.Count = 0) then FRows := 0 diff --git a/components/colorpalette/demo/unit1.lfm b/components/colorpalette/demo/unit1.lfm index b8601dcec..1e86d475e 100644 --- a/components/colorpalette/demo/unit1.lfm +++ b/components/colorpalette/demo/unit1.lfm @@ -80,7 +80,7 @@ object MainForm: TMainForm Height = 25 Top = 239 Width = 137 - Caption = 'Load Default.pal' + Caption = 'Load palette...' OnClick = BtnLoadDefaultPalClick TabOrder = 4 end @@ -146,8 +146,8 @@ object MainForm: TMainForm 'Std + system palette' 'Ext + system palette' 'Gradient palette' + 'HTML palette' 'Websafe palette' - 'Websafe palette #2' ) OnSelect = CbBuiltinPalettesSelect Style = csDropDownList @@ -306,6 +306,17 @@ object MainForm: TMainForm OnChange = CbCustomHintTextChange TabOrder = 7 end + object CbUseSpacers: TCheckBox + Left = 10 + Height = 19 + Top = 142 + Width = 131 + Caption = 'Use clNone as spacer' + Checked = True + OnChange = CbUseSpacersChange + State = cbChecked + TabOrder = 8 + end end object Bevel2: TBevel Left = 462 @@ -397,4 +408,11 @@ object MainForm: TMainForm OnClick = MnuDeletePickedColorClick end end + object OpenDialog: TOpenDialog + DefaultExt = '.pal' + Filter = 'Palette files (*.pal)|*.pal' + Options = [ofPathMustExist, ofFileMustExist, ofEnableSizing, ofViewDetail] + left = 384 + top = 208 + end end diff --git a/components/colorpalette/demo/unit1.pas b/components/colorpalette/demo/unit1.pas index 70ce68469..c7253c9a4 100644 --- a/components/colorpalette/demo/unit1.pas +++ b/components/colorpalette/demo/unit1.pas @@ -27,6 +27,7 @@ type CbShowColorHints: TCheckBox; CbBorderColor: TColorBox; CbCustomHintText: TCheckBox; + CbUseSpacers: TCheckBox; ColorDialog: TColorDialog; ColorPalette: TColorPalette; CbPickMode: TComboBox; @@ -44,6 +45,7 @@ type LblPickMode2: TLabel; MnuEditPickedColor: TMenuItem; MnuDeletePickedColor: TMenuItem; + OpenDialog: TOpenDialog; PalettePopupMenu: TPopupMenu; Panel1: TPanel; Panel2: TPanel; @@ -62,6 +64,7 @@ type procedure CbShowColorHintsChange(Sender: TObject); procedure CbShowSelectionChange(Sender: TObject); procedure CbBorderColorSelect(Sender: TObject); + procedure CbUseSpacersChange(Sender: TObject); procedure ColorPaletteDblClick(Sender: TObject); procedure ColorPaletteGetHintText(Sender: TObject; AColor: TColor; var AText: String); @@ -141,6 +144,14 @@ end; procedure TMainForm.BtnLoadDefaultPalClick(Sender: TObject); begin + with OpenDialog do + if Execute then + begin + ColorPalette.LoadPalette(FileName); + UpdateCaption; + EdColCount.Value := ColorPalette.ColumnCount; + end; + { if not FileExists('..\default.pal') then begin ShowMessage('File "default.pal" not found. Copy it from the TColorPalette folder to the current exe folder.'); @@ -149,6 +160,7 @@ begin ColorPalette.LoadPalette('..\default.pal'); UpdateCaption; EdColCount.Value := ColorPalette.ColumnCount; + } end; procedure TMainForm.BtnLoadRndPaletteClick(Sender: TObject); @@ -203,6 +215,11 @@ begin ColorPalette.ShowSelection := CbShowSelection.Checked; end; +procedure TMainForm.CbUseSpacersChange(Sender: TObject); +begin + ColorPalette.UseSpacers := CbUseSpacers.Checked; +end; + procedure TMainForm.ColorPaletteDblClick(Sender: TObject); begin with ColorDialog do @@ -301,7 +318,7 @@ begin colors for the context menu. Use object inspector, or use this code: } ColorPalette.PickShift := [ssLeft, ssRight]; - ColorPalette.OnGetHintText := nil; + ColorPalette.OnGetHintText := nil; // will be activated by CbCustomHintText end; procedure TMainForm.MnuDeletePickedColorClick(Sender: TObject); @@ -318,16 +335,17 @@ procedure TMainForm.SetColorInfo(ATitle: string; AColor: TColor); begin if AColor = clNone then LblColorInfo.Caption := Format( - '%s: %s', [ATitle, ColorToString(AColor)] + '%s: None', [ATitle] ) else LblColorInfo.caption := Format( '%s: %s'#13+ ' red = %d'#13+ ' green = %d'#13+ - ' blue = %d', - [ATitle, ColorToString(AColor), Red(AColor), Green(AColor), Blue(AColor)] - ); + ' blue = %d', [ + ATitle, ColorPalette.ColorNames[ColorPalette.SelectedIndex], + Red(AColor), Green(AColor), Blue(AColor) + ]); end; procedure TMainForm.UpdateCaption;