unit StyleCombos; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ExtCtrls,Pctypesutils; type TStyleCombo = class(TCustomComboBox) protected procedure CreateWnd; override; public procedure SetStyleList; virtual; published property OnChange; Property Font; end; TPenStyleCombo = class(TStyleCombo) private function GetSelection: TPenStyle; procedure SetSelection(Value: TPenStyle); protected procedure SetStyle(Value: TComboBoxStyle); override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; public constructor Create(AOwner: TComponent); override; property Selection: TPenStyle read GetSelection write SetSelection; procedure SetStyleList; override; end; TRowCombo = class(TStyleCombo) private function GetSelection: TRowStyle; procedure SetSelection(Value: TRowStyle); protected procedure SetStyle(Value: TComboBoxStyle); override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; public constructor Create(AOwner: TComponent); override; Procedure DrawToCanvas(Canvasx:TCanvas;Index: Integer; Rect: TRect); property Selection: TRowStyle read GetSelection write SetSelection; procedure SetStyleList; override; end; TBrushStyleCombo = class(TStyleCombo) private oldidx : integer; function GetSelection: TBrushStyle; procedure SetSelection(Value: TBrushStyle); protected procedure SetStyle(Value: TComboBoxStyle); override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; public constructor Create(AOwner: TComponent); override; property Selection: TBrushStyle read GetSelection write SetSelection; procedure SetStyleList; override; end; TPenWidthCombo = class(TStyleCombo) private function GetSelection: shortint; procedure SetSelection(Value: shortint); protected procedure SetStyle(Value: TComboBoxStyle); override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; public constructor Create(AOwner: TComponent); override; procedure SetStyleList; override; property Selection: shortint read GetSelection write SetSelection; end; TColorCombo = class(TCustomComboBox) private function GetSelection: TColor; procedure SetSelection(Value: TColor); protected procedure SetStyle(Value: TComboBoxStyle); override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; procedure CreateWnd; override; public constructor Create(AOwner: TComponent); override; procedure SetColorList; virtual; property Selection: TColor read GetSelection write SetSelection; published property Color; property Ctl3D; property DragMode; property DragCursor; property DropDownCount; property Enabled; property Font; property ItemHeight; property Items; property MaxLength; property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property Sorted; property TabOrder; property TabStop; property Text; property Visible; property OnChange; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnDrawItem; property OnDropDown; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnMeasureItem; property OnStartDrag; end; TFontComboBox = class(TCustomComboBox) private { Private declarations } FBitmap: TBitmap; FCanvas: TControlCanvas; FTTOnly: Boolean; FUseItemFont: Boolean; {added}FUpdateAllForms : boolean; function IsTrueType(Index: Integer): Boolean; procedure DrawTT(Background: TColor); procedure SetTTOnly(Value : boolean); procedure SetUseItemFont(Value : boolean); protected { Protected declarations } procedure CreateWnd; override; {added}procedure CMFontChanged(var Message); message CM_FONTCHANGED; {added}procedure Change; override; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; published { Published declarations } property Color; property Ctl3D; property DragMode; property DragCursor; property DropDownCount; property Enabled; property Font; property Items; property ParentColor; property ParentCtl3D; property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; property TabStop; property Visible; property Text; property OnChange; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnDropDown; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property TTonly : boolean read FTTonly write SetTTonly; property UseItemFont : boolean read FUseItemFont write SetUseItemFont; {added}property UpdateAllForms : boolean read FUpdateAllForms write FUpdateAllForms; end; TPictureComboBox = class(TCustomComboBox) private { Private declarations } FImageList : TImageList; FShadow : Boolean; FBackgroundColour, FShadowColour : TColor; protected { Protected declarations } function GetIconList : TImageList; procedure SetIconList (AnIconImageList : TImageList); function GetImageIndex(AnIndex : Integer) : Integer; function DisplayString(AnIndex : Integer) : string; procedure ComboBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); procedure Drawitem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure Loaded; override; public { Public declarations } constructor Create(AnOwner : TComponent); override; destructor Destroy; override; published { Published declarations } property Color; property Ctl3D; property DragCursor; property DragMode; property DropDownCount; property Enabled; property Font; property ImeMode; property ImeName; property ItemHeight; property Items; property MaxLength; property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property Sorted; property TabOrder; property TabStop; property Visible; property OnChange; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnDropDown; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnStartDrag; property ImageList : TImageList read GetIconList write SetIconList; property Shadow : Boolean read FShadow write FShadow; property ShadowColour : TColor read FShadowColour write FShadowColour; property BackgroundColour : TColor read FBackgroundColour write FBackgroundColour; end; implementation const ColorArray: array[0..19] of TColor = ( clBlack, clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal, clGray, clSilver, clRed, clLime, clYellow, clBlue, clFuchsia, clAqua, clLtGray, clDkGray, clWhite, clNone, clDefault ); function TPenStyleCombo.GetSelection: TPenStyle; begin result:=TPenStyle(ItemIndex); end; procedure TPenStyleCombo.SetSelection(Value: TPenStyle); var i: integer; begin for i:=0 to 6 do if TPenStyle(i) = Value then begin ItemIndex :=i; exit; end; end; procedure TPenStyleCombo.SetStyle(Value: TComboBoxStyle); begin inherited SetStyle(csOwnerDrawFixed); end; procedure TPenStyleCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var r: TRect; ItemColor, c: TColor; begin r.top := Rect.top + 3; r.bottom := Rect.bottom - 3; r.left := Rect.left ; r.right := Rect.right; with Canvas do begin FillRect(Rect); pen.style:=tpenstyle(index); pen.color:=clBlack; moveto(r.Left,r.top + (r.Bottom - r.top) div 2); lineto(r.right,r.top + (r.Bottom - r.top) div 2); FrameRect(r); end; r := Rect; r.left := r.left + rect.Right; //inherited DrawItem(Index, r, State); end; constructor TPenStyleCombo.Create(AOwner: TComponent); begin inherited Create(AOwner); Style := csOwnerDrawFixed; end; procedure TPenStyleCombo.SetStyleList; var c: integer; s: String; begin with items do begin clear; for c := 0 to 5 do Add(''); end; ItemIndex := 0; end; ///// TROWCOMBO // function TRowCombo.GetSelection: TRowStyle; begin result:=TRowStyle(ItemIndex); end; procedure TRowCombo.SetSelection(Value: TRowStyle); var i: integer; begin for i:=0 to 6 do if TRowStyle(i) = Value then begin ItemIndex :=i; exit; end; end; procedure TRowCombo.SetStyle(Value: TComboBoxStyle); begin inherited SetStyle(csOwnerDrawFixed); end; Procedure TRowCombo.DrawToCanvas(Canvasx:TCanvas;Index: Integer; Rect: TRect); var y: integer; begin with CanvasX do begin FillRect(Rect); Pen.Color := clBlack; Pen.Width := 1; Brush.Style := bsSolid; Brush.color := clBlack; y := Rect.Top + (Rect.Bottom-Rect.Top) div 2; MoveTo(rect.Left,y);LineTo(rect.right,y); Pen.Width := 1; if Index = 1 then begin polygon([point(rect.right,y),point(rect.right - 10, y - 5), point(rect.right - 10, y + 5)]); end else if Index = 2 then begin polygon([point(rect.left,y),point(rect.left + 10, y - 5), point(rect.left + 10, y + 5)]); end else if Index = 3 then begin polygon([point(rect.right,y),point(rect.right - 10, y - 5), point(rect.right - 10, y + 5)]); polygon([point(rect.left,y),point(rect.left + 10, y - 5), point(rect.left + 10, y + 5)]); end else if Index = 4 then begin polyline([point(rect.right - 10, y - 5),point(rect.right,y), point(rect.right - 10, y + 5)]); end else if Index = 5 then begin polyline([point(rect.left + 10, y - 5),point(rect.left,y), point(rect.left + 10, y + 5)]); end else if Index = 6 then begin polyline([point(rect.right - 10, y - 5),point(rect.right,y), point(rect.right - 10, y + 5)]); polyline([point(rect.left + 10, y - 5),point(rect.left,y), point(rect.left + 10, y + 5)]); end; //FrameRect(rect); end; end; procedure TRowCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var y: integer; begin with Canvas do begin FillRect(Rect); Pen.Color := clBlack; Pen.Width := 1; Brush.Style := bsSolid; Brush.color := clBlack; y := Rect.Top + (Rect.Bottom-Rect.Top) div 2; MoveTo(rect.Left,y);LineTo(rect.right,y); Pen.Width := 1; if Index = 1 then begin polygon([point(rect.right,y),point(rect.right - 10, y - 5), point(rect.right - 10, y + 5)]); end else if Index = 2 then begin polygon([point(rect.left,y),point(rect.left + 10, y - 5), point(rect.left + 10, y + 5)]); end else if Index = 3 then begin polygon([point(rect.right,y),point(rect.right - 10, y - 5), point(rect.right - 10, y + 5)]); polygon([point(rect.left,y),point(rect.left + 10, y - 5), point(rect.left + 10, y + 5)]); end else if Index = 4 then begin polyline([point(rect.right - 10, y - 5),point(rect.right,y), point(rect.right - 10, y + 5)]); end else if Index = 5 then begin polyline([point(rect.left + 10, y - 5),point(rect.left,y), point(rect.left + 10, y + 5)]); end else if Index = 6 then begin polyline([point(rect.right - 10, y - 5),point(rect.right,y), point(rect.right - 10, y + 5)]); polyline([point(rect.left + 10, y - 5),point(rect.left,y), point(rect.left + 10, y + 5)]); end; FrameRect(rect); end; //inherited DrawItem(Index, r, State); end; constructor TRowCombo.Create(AOwner: TComponent); begin inherited Create(AOwner); Style := csOwnerDrawFixed; end; procedure TRowCombo.SetStyleList; var c: integer; s: String; begin with items do begin clear; for c := 0 to 6 do Add(''); end; itemindex := 0; end; //////////////// TBRUSHSTYLE ////////////////////////////// function TBrushStyleCombo.GetSelection:TBrushStyle; begin result:=TBrushStyle(ItemIndex); end; procedure TBrushStyleCombo.SetSelection(Value: TBrushStyle); var i: integer; begin for i:=0 to 7 do if TBrushStyle(i) = Value then begin ItemIndex :=i; exit; end; end; procedure TBrushStyleCombo.SetStyle(Value: TComboBoxStyle); begin inherited SetStyle(csOwnerDrawFixed); end; procedure TBrushStyleCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var r :TRect; ItemColor :TColor; s :TShape; begin r.top := Rect.top; r.bottom := Rect.bottom; r.left := Rect.left; r.right := r.left + Rect.Right; with Canvas do begin FillRect(Rect); pen.color:=clBlack; canvas.brush.color:=clBlack; canvas.brush.style:=TBrushStyle(Index); rectangle(r.left,r.top,r.Right,r.Bottom); canvas.brush.style:=TBrushStyle(1); FrameRect(r); end; r := Rect; r.left := r.left + rect.Right; canvas.brush.style:=bsSolid; canvas.brush.color:=clSilver; //inherited DrawItem(Index, r, State); end; constructor TBrushStyleCombo.Create(AOwner: TComponent); begin inherited Create(AOwner); Style := csOwnerDrawFixed; end; procedure TBrushStyleCombo.SetStyleList; var c: integer; s: String; begin with items do begin clear; for c := 0 to 7 do Add(''); end; itemindex := 0; end; //////////////TPENWIDTH /////////////////////////////// function TPenWidthCombo.GetSelection: shortint; begin result:=ItemIndex+1; end; procedure TPenWidthCombo.SetSelection(Value:shortint); begin ItemIndex :=value-1; end; procedure TPenWidthCombo.SetStyle(Value: TComboBoxStyle); begin inherited SetStyle(csOwnerDrawFixed); end; procedure TPenWidthCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var r: TRect; ItemColor, c: TColor; begin r.top := Rect.top + 3; r.bottom := Rect.bottom - 3; r.left := Rect.left + 3; r.right := r.left + rect.right - 20; with Canvas do begin FillRect(Rect); pen.width:=index+1; pen.color:=clBlack; moveto(r.Left+5,r.top + (r.Bottom - r.top) div 2); lineto(r.right-5,r.top + (r.Bottom - r.top) div 2); FrameRect(r); end; r := Rect; r.left := r.left + rect.right - 20; inherited DrawItem(Index, r, State); end; constructor TPenWidthCombo.Create(AOwner: TComponent); begin inherited Create(AOwner); Style := csOwnerDrawFixed; end; procedure TPenWidthCombo.SetStyleList; var c: integer; s: String; begin with items do begin clear; for c := 0 to 9 do Add(inttostr(c+1)); end; itemindex := 0; end; //////////// //////////////////////////////////////////////////////////////////////////////// // private TColorCombo // function TColorCombo.GetSelection: TColor; begin result := 0; if ItemIndex >= 0 then if not IdentToColor(Items[ItemIndex], LongInt(result)) then result := 0; end; procedure TColorCombo.SetSelection(Value: TColor); var c: integer; i: Longint; begin ItemIndex := -1; for c := 0 to Items.count do if IdentToColor(Items[c], i) then if i = Value then ItemIndex := c; end; //////////////////////////////////////////////////////////////////////////////// // protected TColorCombo // procedure TColorCombo.SetStyle(Value: TComboBoxStyle); begin inherited SetStyle(csOwnerDrawFixed); end; procedure TColorCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var r: TRect; ItemColor, c: TColor; begin r.top := Rect.top + 3; r.bottom := Rect.bottom - 3; r.left := Rect.left + 3; r.right := r.left + 14; with Canvas do begin FillRect(Rect); c := Brush.Color; if IdentToColor(Items[Index], LongInt(ItemColor)) then Brush.Color := ItemColor; FillRect(r); Brush.Color := clBlack; FrameRect(r); Brush.Color := c; end; r := Rect; r.left := r.left + 20; inherited DrawItem(Index, r, State); end; procedure TColorCombo.CreateWnd; begin inherited CreateWnd; SetColorList; end; //////////////////////////////////////////////////////////////////////////////// // public TColorCombo // constructor TColorCombo.Create(AOwner: TComponent); begin inherited Create(AOwner); Style := csOwnerDrawFixed; end; procedure TColorCombo.SetColorList; var c: integer; s: String; begin with items do begin clear; for c := 0 to High(ColorArray) do if ColorToIdent(ColorArray[c], s) then Add(s); end; itemindex := 0; end; //////////////// constructor TFontComboBox.Create(AOwner: TComponent); begin inherited Create(AOwner); Font.Name := 'Tahoma'; Font.Size := 8; Sorted := True; Style := csOwnerDrawFixed; ItemHeight := Font.Size*2; {Create a bitmap for drawing} FBitmap := TBitmap.Create; FBitmap.Height := 12; FBitmap.Width := 12; {Create a Canvas for checking True Type property} FCanvas := TControlCanvas.Create; FCanvas.Control := Self; {added}DropDownCount := 16; FUpdateAllForms := False; end; procedure TFontComboBox.SetTTOnly(value : boolean); var I:longint; begin FTTonly := Value; if FTTonly = True then begin Items.clear; Items.Assign(Screen.Fonts); I := 0; repeat if Items[I] = 'Default' then begin Items.delete(I); end else inc(I); until I = Items.count; ItemIndex := 0; I := 0; if FTTonly then repeat if not IsTrueType(I) then begin Items.delete(I); end else inc(I); until I = Items.count; end else begin Items.clear; Items.Assign(Screen.Fonts); I := 0; repeat if Items[I] = 'Default' then begin Items.delete(I); end else inc(I); until I = Items.count; ItemIndex := 0; end; end; procedure TFontComboBox.SetUseItemFont(value : boolean); begin FUseItemFont := Value; SetTTOnly(FTTOnly); end; destructor TFontComboBox.Destroy; begin FBitmap.Free; FCanvas.Free; inherited Destroy; end; procedure TFontComboBox.CreateWnd; var I:longint; begin inherited CreateWnd; Items.Assign(Screen.Fonts); I := 0; repeat if Items[I] = 'Default' then begin Items.delete(I); end else inc(I); until I = Items.count; ItemIndex := 0; end; procedure TFontComboBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var lf: TLogFont; oldFont, newFont: HFont; begin NewFont := 0; OldFont := 0; if FUseItemFont then begin with lf do begin lfHeight := Font.Height; lfWidth := 0; lfEscapement := 0; if fsBold in Font.Style then lfWeight := FW_BOLD else lfWeight := FW_NORMAL; lfItalic := Byte(fsItalic in Font.Style); lfUnderline := Byte(fsUnderline in Font.Style); lfStrikeOut := Byte(fsStrikeOut in Font.Style); lfCharSet := DEFAULT_CHARSET; lfOutPrecision := OUT_DEFAULT_PRECIS; lfClipPrecision := CLIP_DEFAULT_PRECIS; lfQuality := DEFAULT_QUALITY; lfPitchAndFamily := DEFAULT_PITCH or FF_DONTCARE; StrPCopy(lfFaceName, Items[Index]); end; newFont := CreateFontIndirect(lf); oldFont := SelectObject(Canvas.Handle, newFont); end; { Rect.Left = 3 means drawing on the Static portion of the ComboBox } with Canvas do begin FillRect(Rect); if IsTrueType(Index) and (Rect.Left <> 3) then begin DrawTT(Brush.Color); Draw(Rect.Left+2, Rect.Top+2, FBitmap); end; //Canvas.Font.Name := Items[Index]; //Canvas.Font.Size := 10; if (Rect.Left <> 3) then TextOut(Rect.Left+16, Rect.Top, ' '+Items[Index]) else TextOut(Rect.Left, Rect.Top, ' '+Items[Index]) end; if FUseItemFont then begin SelectObject(Canvas.Handle, oldFont); DeleteObject(newFont); end; end; function TFontComboBox.IsTrueType(Index: Integer): Boolean; var Metrics: TTextMetric; lf: TLogFont; oldFont, newFont: HFont; begin with lf do begin lfHeight := 10; lfWidth := 10; lfEscapement := 0; lfWeight := FW_REGULAR; lfItalic := 0; lfUnderline := 0; lfStrikeOut := 0; lfCharSet := DEFAULT_CHARSET; lfOutPrecision := OUT_DEFAULT_PRECIS; lfClipPrecision := CLIP_DEFAULT_PRECIS; lfQuality := DEFAULT_QUALITY; lfPitchAndFamily := DEFAULT_PITCH or FF_DONTCARE; StrPCopy(lfFaceName, Items[Index]); end; newFont := CreateFontIndirect(lf); oldFont := SelectObject(FCanvas.Handle, newFont); GetTextMetrics(FCanvas.Handle, Metrics); Result := (Metrics.tmPitchAndFamily and TMPF_TRUETYPE) <> 0; SelectObject(FCanvas.Handle, oldFont); DeleteObject(newFont); end; procedure TFontComboBox.DrawTT(Background: TColor); procedure DrawT(OrgX, OrgY: Integer; Color: TColor); begin with FBitmap.Canvas do begin Brush.Style := bsSolid; Pen.Color := Color; MoveTo(OrgX,OrgY); LineTo(OrgX+7,OrgY); LineTo(OrgX+7,OrgY+3); MoveTo(OrgX,OrgY); LineTo(OrgX,OrgY+3); MoveTo(OrgX+1,OrgY); LineTo(OrgX+1,OrgY+1); MoveTo(OrgX+6,OrgY); LineTo(OrgX+6,OrgY+1); MoveTo(OrgX+3,OrgY); LineTo(OrgX+3,OrgY+8); MoveTo(OrgX+4,OrgY); LineTo(OrgX+4,OrgY+8); MoveTo(OrgX+1,OrgY+8); LineTo(OrgX+6,OrgY+8); end; end; begin with FBitmap.Canvas do begin Brush.Style := bsClear; Brush.Color := background; FillRect(Rect(0,0,12,12)); DrawT(0,0,clGray); DrawT(4,3,clBlack); end; end; procedure TFontComboBox.CMFontChanged(var Message); begin // without this, changing the font of the component had no effect ItemHeight := font.size*2; RecreateWnd;// on it's appearance (height wasn't adjusted) repaint; end; procedure TFontComboBox.Change; var i : integer; begin inherited Change; if FUpdateAllForms then // Changing font on all forms for i := 0 to Application.ComponentCount-1 do if Application.components[i] is TCustomForm then (Application.components[i] as TCustomForm).Font.Name := Text; end; /////////////// constructor TPictureComboBox.Create(AnOwner : TComponent); begin Inherited Create(AnOwner); Style := csOwnerDrawFixed; OnDrawItem := DrawItem; FBackgroundColour := clWhite; FShadowColour := clBlack; end;// destructor TPictureComboBox.Destroy; begin Inherited Destroy; end;// procedure TPictureComboBox.Loaded; begin inherited Loaded; if not (csDesigning in ComponentState) then Style := csOwnerDrawFixed; end;// function TPictureComboBox.GetImageIndex(AnIndex : Integer) : Integer; var P : Integer; begin result := 0; P := Pos('|',Items[AnIndex]); if P > 0 then result := StrToInt(Copy(Items[AnIndex],P + 1,Length(Items[AnIndex]) - P)); end;// function TPictureComboBox.DisplayString(AnIndex : Integer) : string; var P : Integer; begin result := Items[AnIndex]; P := Pos('|',Items[AnIndex]); if P > 0 then result := Copy(Items[AnIndex],1,P-1); end;// procedure TPictureComboBox.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); begin Height := Self.Font.Size; Canvas.Font := Font; Self.ItemHeight := Canvas.TextHeight('X'); end; procedure TPictureComboBox.Drawitem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var ImageIndex, TextOffset, ImageOffset : Integer; begin //Clear the area for drawing. This stops mouse moving tracers from been shown Canvas.Brush.Color := FBackgroundColour; Canvas.FillRect(Rect); TextOffset := 0; if Assigned(FImageList) then begin //Draw icon ImageIndex := GetImageIndex(Index); ImageOffset := Rect.Top + 2; FImageList.Draw(Canvas, Rect.Left, ImageOffset, ImageIndex); TextOffset := FImageList.Width + 4; end; //Display the shadow item text if FShadow then begin Canvas.Brush.Style := bsClear; Canvas.Font.Color := FShadowColour; Canvas.TextOut (Rect.Left + TextOffset - 1, Rect.Top + (ItemHeight div 2) - (Canvas.TextHeight('X') Div 2) - 1 , DisplayString(Index)); end;// //Display the item text Canvas.Font.Color := Font.Color; Canvas.TextOut (Rect.Left + TextOffset, Rect.Top + (ItemHeight div 2) - (Canvas.TextHeight('X') Div 2), DisplayString(Index)); end;// procedure TPictureComboBox.SetIconList (AnIconImageList : TImageList); begin if Assigned(AnIconImageList) then begin FImageList := AnIconImageList; if Font.Size < AnIconImageList.Height + 4 then ItemHeight := AnIconImageList.Height + 4; end; end;// function TPictureComboBox.GetIconList : TImageList; begin result := FImageList; end;// { TStyleCombo } procedure TStyleCombo.CreateWnd; begin inherited CreateWnd; SetStyleList; end; procedure TStyleCombo.SetStyleList; begin end; end.