bsSkinBoxCtrls.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:315k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1.   then
  2.     begin
  3.       Button.MouseIn := True;
  4.       RePaint;
  5.     end
  6.   else
  7.   if not PtInRect(Button.R, Point(X, Y)) and Button.MouseIn
  8.   then
  9.     begin
  10.       Button.MouseIn := False;
  11.       RePaint;
  12.     end;
  13. end;
  14. procedure TbsSkinCustomComboBox.CloseUp;
  15. begin
  16.   if not FListBox.Visible then Exit;
  17.   FListBox.Hide;
  18.   if (FListBox.ItemIndex >= 0) and
  19.      (FListBox.ItemIndex < FListBox.Items.Count) and Value
  20.   then
  21.     begin
  22.       if FEdit <> nil
  23.       then
  24.         FEdit.Text := FListBox.Items[FListBox.ItemIndex]
  25.       else
  26.         begin
  27.           Text := FListBox.Items[FListBox.ItemIndex];
  28.           RePaint;
  29.         end;
  30.        if Assigned(FOnClick) then FOnClick(Self);
  31.        Change;
  32.      end
  33.   else
  34.     FListBox.ItemIndex := FOldItemIndex;
  35.   if Value
  36.   then
  37.     if Assigned(FOnCloseUp) then FOnCloseUp(Self);
  38. end;
  39. procedure TbsSkinCustomComboBox.DropDown;
  40. var
  41.   P: TPoint;
  42.   WorkArea: TRect;
  43. begin
  44.   if Items.Count = 0 then Exit;
  45.   FListBox.Width := Width;
  46.   if Items.Count < DropDownCount
  47.   then
  48.     FListBox.RowCount := Items.Count
  49.   else
  50.     FListBox.RowCount := DropDownCount;
  51.   P := Point(Left, Top + Height);
  52.   P := Parent.ClientToScreen (P);
  53.   SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
  54.   if P.Y + FListBox.Height > WorkArea.Bottom
  55.   then
  56.     P.Y := P.Y - Height - FListBox.Height;
  57.   if FEdit <> nil then FEdit.SetFocus;
  58.   FOldItemIndex := FListBox.ItemIndex;
  59.   if (FListBox.ItemIndex = 0) and (FListBox.Items.Count > 1)
  60.   then
  61.     begin
  62.       FListBox.ItemIndex := 1;
  63.       FListBox.ItemIndex := 0;
  64.     end;
  65.   FListBox.TopIndex := FListBox.ItemIndex;
  66.   FListBox.Show(P);
  67. end;
  68. procedure TbsSkinCustomComboBox.EditPageUp1(AChange: Boolean);
  69. var
  70.   Index: Integer;
  71. begin
  72.   Index := FListBox.ItemIndex - DropDownCount - 1;
  73.   if Index < 0 then Index := 0;
  74.   if AChange
  75.   then
  76.     ItemIndex := Index
  77.   else
  78.     FListBox.ItemIndex := Index;
  79. end;
  80. procedure TbsSkinCustomComboBox.EditPageDown1(AChange: Boolean);
  81. var
  82.   Index: Integer;
  83. begin
  84.   Index := FListBox.ItemIndex + DropDownCount - 1;
  85.   if Index > FListBox.Items.Count - 1
  86.   then
  87.     Index := FListBox.Items.Count - 1;
  88.   if AChange
  89.   then
  90.     ItemIndex := Index
  91.   else
  92.     FListBox.ItemIndex := Index;
  93. end;
  94. procedure TbsSkinCustomComboBox.EditUp1;
  95. begin
  96.   if FListBox.ItemIndex > 0
  97.   then
  98.     begin
  99.       if AChange
  100.       then
  101.         ItemIndex := ItemIndex - 1
  102.       else
  103.         FListBox.ItemIndex := FListBox.ItemIndex - 1;
  104.     end;
  105. end;
  106. procedure TbsSkinCustomComboBox.EditDown1;
  107. begin
  108.   if FListBox.ItemIndex < FListBox.Items.Count - 1
  109.   then
  110.     begin
  111.       if AChange
  112.       then
  113.         ItemIndex := ItemIndex + 1
  114.       else
  115.         FListBox.ItemIndex := FListBox.ItemIndex + 1;
  116.     end;    
  117. end;
  118. procedure TbsSkinCustomComboBox.EditUp;
  119. begin
  120.   if ItemIndex > 0
  121.   then
  122.     begin
  123.       ItemIndex := ItemIndex - 1;
  124.       if AChange
  125.       then
  126.         begin
  127.           Text := Items[ItemIndex];
  128.           if Assigned(FOnClick) then FOnClick(Self);
  129.         end;
  130.     end;
  131. end;
  132. procedure TbsSkinCustomComboBox.EditDown;
  133. begin
  134.   if ItemIndex < Items.Count - 1
  135.   then
  136.     begin
  137.       FListBox.ItemIndex := FListBox.ItemIndex + 1;
  138.       if AChange
  139.       then
  140.         begin
  141.           Text := FListBox.Items[FListBox.ItemIndex];
  142.           if Assigned(FOnClick) then FOnClick(Self);
  143.         end;
  144.     end;
  145. end;
  146. procedure TbsSkinCustomComboBox.EditChange(Sender: TObject);
  147. begin
  148.   FromEdit := True;
  149.   Text := FEdit.Text;
  150.   FromEdit := False;
  151. end;
  152. procedure TbsSkinCustomComboBox.ShowEditor;
  153. begin
  154.   FEdit := TbsCustomEdit.Create(Self);
  155.   FEdit.Parent := Self;
  156.   FEdit.AutoSize := False;
  157.   FEdit.Visible := True;
  158.   FEdit.EditTransparent := False;
  159.   FEdit.OnChange := EditChange;
  160.   FEditWindowProc := FEdit.WindowProc;
  161.   FEdit.WindowProc := EditWindowProcHook;
  162.   FEdit.OnEditCancelMode := EditCancelMode;
  163.   //
  164.   if FIndex <> -1
  165.   then
  166.     with FEdit.Font do
  167.     begin
  168.       Style := FontStyle;
  169.       Color := FontColor;
  170.       Height := FontHeight;
  171.       Name := FontName;
  172.     end
  173.   else
  174.     with FEdit.Font do
  175.     begin
  176.       Name := Self.Font.Name;
  177.       Style := Self.Font.Style;
  178.       Color := Self.Font.Color;
  179.       Height := Self.Font.Height;
  180.     end;
  181.     if FIndex <> -1
  182.     then FEdit.EditTransparent := True
  183.     else FEdit.EditTransparent := False;
  184.   //
  185.   CalcRects;
  186. end;
  187. procedure TbsSkinCustomComboBox.HideEditor;
  188. begin
  189.   FEdit.Visible := False;
  190.   FEdit.Free;
  191.   FEdit := nil;
  192. end;
  193. procedure TbsSkinCustomComboBox.CMTextChanged;
  194. begin
  195.   inherited;
  196.   if (FEdit <> nil) and not FromEdit then FEdit.Text := Text;
  197.   if Assigned(FOnChange) then FOnChange(Self);
  198.   if FromEdit then Change;
  199. end;
  200. procedure TbsSkinCustomComboBox.WMSIZE;
  201. begin
  202.   inherited;
  203.   CalcRects;
  204. end;
  205. procedure TbsSkinCustomComboBox.DrawButton;
  206. var
  207.   ArrowColor: TColor;
  208.   R1: TRect;
  209. begin
  210.   if FIndex = -1
  211.   then
  212.     with Button do
  213.     begin
  214.       R1 := R;  
  215.       if Down and MouseIn
  216.       then
  217.         begin
  218.           Frame3D(C, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  219.           C.Brush.Color := BS_XP_BTNDOWNCOLOR;
  220.           C.FillRect(R1);
  221.         end
  222.       else
  223.         if MouseIn
  224.         then
  225.           begin
  226.             Frame3D(C, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  227.             C.Brush.Color := BS_XP_BTNACTIVECOLOR;
  228.             C.FillRect(R1);
  229.           end
  230.         else
  231.           begin
  232.             Frame3D(C, R1, clBtnShadow, clBtnShadow, 1);
  233.             C.Brush.Color := clBtnFace;
  234.             C.FillRect(R1);
  235.           end;
  236.       if Enabled
  237.       then
  238.         ArrowColor := clBlack
  239.       else
  240.         ArrowColor := clBtnShadow;
  241.       DrawArrowImage(C, R, ArrowColor, 4);
  242.     end
  243.   else
  244.     with Button do
  245.     begin
  246.       R1 := NullRect;
  247.       if not Enabled and not IsNullRect(UnEnabledButtonRect)
  248.       then
  249.         R1 := UnEnabledButtonRect
  250.       else  
  251.       if Down and MouseIn
  252.       then R1 := DownButtonRect
  253.       else if MouseIn then R1 := ActiveButtonRect;
  254.       if not IsNullRect(R1)
  255.       then
  256.         C.CopyRect(R, Picture.Canvas, R1);
  257.     end;
  258. end;
  259. procedure TbsSkinCustomComboBox.DrawDefaultItem;
  260. var
  261.   Buffer: TBitMap;
  262.   R, R1: TRect;
  263.   Index, IIndex, IX, IY: Integer;
  264. begin
  265.   if RectWidth(CBItem.R) <=0 then Exit;
  266.   Buffer := TBitMap.Create;
  267.   Buffer.Width := RectWidth(CBItem.R);
  268.   Buffer.Height := RectHeight(CBItem.R);
  269.   R := Rect(0, 0, Buffer.Width, Buffer.Height);
  270.   with Buffer.Canvas do
  271.   begin
  272.     Font.Name := Self.Font.Name;
  273.     Font.Style := Self.Font.Style;
  274.     Font.Height := Self.Font.Height;
  275.     if Focused
  276.     then
  277.       begin
  278.         Brush.Color := clHighLight;
  279.         Font.Color := clHighLightText;
  280.       end
  281.     else
  282.       begin
  283.         Brush.Color := clWindow;
  284.         Font.Color := clWindowText;
  285.       end;
  286.     FillRect(R);
  287.   end;
  288.   if FListBox.Visible
  289.   then Index := FOldItemIndex
  290.   else Index := FListBox.ItemIndex;
  291.   CBItem.State := [];
  292.   if Focused then CBItem.State := [odFocused];
  293.   R1 := Rect(R.Left + 2, R.Top, R.Right - 2, R.Bottom);
  294.   if (Index > -1) and (Index < FListBox.Items.Count)
  295.   then
  296.     if Assigned(FOnComboBoxDrawItem)
  297.     then
  298.       FOnComboBoxDrawItem(Buffer.Canvas, Index, Buffer.Width, Buffer.Height,
  299.                           R1, CBItem.State)
  300.     else
  301.       begin
  302.         if Images <> nil
  303.         then
  304.           begin
  305.             if ImageIndex > -1
  306.             then IIndex := ImageIndex
  307.             else IIndex := Index;
  308.             if IIndex < Images.Count
  309.             then
  310.               begin
  311.                 IX := R1.Left;
  312.                 IY := R1.Top + RectHeight(R1) div 2 - Images.Height div 2;
  313.                 Images.Draw(Buffer.Canvas, IX, IY, IIndex);
  314.               end;
  315.             Inc(R1.Left, Images.Width + 2);
  316.           end;
  317.         SPDrawText2(Buffer.Canvas, FListBox.Items[Index], R1);
  318.       end;
  319.   if Focused then DrawFocusRect(Buffer.Canvas.Handle, R);
  320.   Cnvs.Draw(CBItem.R.Left, CBItem.R.Top, Buffer);
  321.   Buffer.Free;
  322. end;
  323. procedure TbsSkinCustomComboBox.DrawSkinItem;
  324. var
  325.   Buffer: TBitMap;
  326.   R, R2: TRect;
  327.   W, H: Integer;
  328.   Index, IIndex, IX, IY: Integer;
  329. begin
  330.   W := RectWidth(CBItem.R);
  331.   if W <= 0 then Exit;
  332.   H := RectHeight(SItemRect);
  333.   if H = 0 then H := RectHeight(FocusItemRect);
  334.   if H = 0 then H := RectWidth(CBItem.R);
  335.   Buffer := TBitMap.Create;
  336.   if Focused
  337.   then
  338.     begin
  339.       if not IsNullRect(FocusItemRect)
  340.       then
  341.         CreateHSkinImage(ItemLeftOffset, ItemRightOffset, Buffer, Picture,
  342.           FocusItemRect, W, H)
  343.       else
  344.         begin
  345.           Buffer.Width := W;
  346.           BUffer.Height := H;
  347.           Buffer.Canvas.CopyRect(Rect(0, 0, W, H), Cnvs, CBItem.R);
  348.         end;
  349.     end
  350.   else
  351.     begin
  352.       if not IsNullRect(SItemRect)
  353.       then
  354.         CreateHSkinImage(ItemLeftOffset, ItemRightOffset, Buffer, Picture,
  355.           SItemRect, W, H)
  356.       else
  357.         begin
  358.           Buffer.Width := W;
  359.           BUffer.Height := H;
  360.           Buffer.Canvas.CopyRect(Rect(0, 0, W, H), Cnvs, CBItem.R);
  361.         end;
  362.     end;
  363.   R := ItemTextRect;
  364.   if not IsNullRect(SItemRect)
  365.   then
  366.     Inc(R.Right, W - RectWidth(SItemRect))
  367.   else
  368.     Inc(R.Right, W - RectWidth(ClRect));
  369.   with Buffer.Canvas do
  370.   begin
  371.     if FUseSkinFont
  372.     then
  373.       begin
  374.         Font.Name := FontName;
  375.         Font.Style := FontStyle;
  376.         Font.Height := FontHeight;
  377.         Font.CharSet := FDefaultFont.CharSet;
  378.       end
  379.     else
  380.       Font.Assign(FDefaultFont);
  381.     if Focused
  382.     then
  383.       Font.Color := FocusFontColor
  384.     else
  385.       Font.Color := FontColor;
  386.     Brush.Style := bsClear;
  387.   end;
  388.   if FListBox.Visible
  389.   then Index := FOldItemIndex
  390.   else Index := FListBox.ItemIndex;
  391.   if (Index > -1) and (Index < FListBox.Items.Count)
  392.   then
  393.     if Assigned(FOnComboBoxDrawItem)
  394.     then
  395.       FOnComboBoxDrawItem(Buffer.Canvas, Index, Buffer.Width, Buffer.Height,
  396.                           R, CBItem.State)
  397.     else
  398.       begin
  399.         if Images <> nil
  400.         then
  401.           begin
  402.             if ImageIndex > -1
  403.             then IIndex := ImageIndex
  404.             else IIndex := Index;
  405.             if IIndex < Images.Count
  406.             then
  407.               begin
  408.                 IX := R.Left;
  409.                 IY := R.Top + RectHeight(R) div 2 - Images.Height div 2;
  410.                 Images.Draw(Buffer.Canvas, IX, IY, IIndex);
  411.               end;
  412.             Inc(R.Left, Images.Width + 2);
  413.           end;
  414.         SPDrawText2(Buffer.Canvas, FListBox.Items[Index], R);
  415.       end;
  416.   Cnvs.Draw(CBItem.R.Left, CBItem.R.Top, Buffer);
  417.   Buffer.Free;
  418. end;
  419. procedure TbsSkinCustomComboBox.CalcRects;
  420. const
  421.   ButtonW = 17;
  422. var
  423.   OX: Integer;
  424. begin
  425.   if FIndex = -1
  426.   then
  427.     begin
  428.       Button.R := Rect(Width - ButtonW - 2, 2, Width - 2, Height - 2);
  429.       CBItem.R := Rect(2, 2, Button.R.Left - 1 , Height -  2);
  430.     end
  431.   else
  432.     begin
  433.       OX := Width - RectWidth(SkinRect);
  434.       Button.R := ButtonRect;
  435.       if ButtonRect.Left >= RectWidth(SkinRect) - RTPt.X
  436.       then
  437.         OffsetRect(Button.R, OX, 0);
  438.       CBItem.R := ClRect;
  439.       Inc(CBItem.R.Right, OX);
  440.     end;
  441.   if FEdit <> nil
  442.   then
  443.     begin
  444.       FEdit.Left := CBItem.R.Left;
  445.       FEdit.Top := CBItem.R.Top;
  446.       FEdit.Width := RectWidth(CBItem.R);
  447.       FEdit.Height := RectHeight(CBItem.R);
  448.     end;
  449. end;
  450. procedure TbsSkinCustomComboBox.ChangeSkinData;
  451. begin
  452.   inherited;
  453.   CalcRects;
  454.   if FEdit <> nil
  455.   then
  456.     begin
  457.       if FIndex <> -1
  458.       then
  459.         with FEdit.Font do
  460.         begin
  461.           Style := FontStyle;
  462.           Color := FontColor;
  463.           Height := FontHeight;
  464.           Name := FontName;
  465.           CharSet := FDefaultFont.CharSet;
  466.         end
  467.       else
  468.         FEdit.Font.Assign(FDefaultFont);
  469.       if FIndex <> -1
  470.       then FEdit.EditTransparent := True
  471.       else FEdit.EditTransparent := False;
  472.     end;
  473.   RePaint;
  474.   if FIndex = -1
  475.   then
  476.     begin
  477.       FListBox.SkinDataName := '';
  478.     end  
  479.   else
  480.     FListBox.SkinDataName := ListBoxName;
  481.   FListBox.SkinData := SkinData;
  482.   FListBox.UpDateScrollBar;
  483.   //
  484. end;
  485. procedure TbsSkinCustomComboBox.CreateControlDefaultImage;
  486. var
  487.   R: TRect;
  488. begin
  489.   with B.Canvas do
  490.   begin
  491.     Brush.Color := clBtnFace;
  492.     R := ClientRect;
  493.     FillRect(R);
  494.   end;
  495.   Frame3D(B.Canvas, R, clbtnShadow, clbtnShadow, 1);
  496.   DrawButton(B.Canvas);
  497.   if FEdit = nil then  DrawDefaultItem(B.Canvas);
  498. end;
  499. procedure TbsSkinCustomComboBox.CreateControlSkinImage;
  500. begin
  501.   inherited;
  502.   DrawButton(B.Canvas);
  503.   if FEdit = nil then DrawSkinItem(B.Canvas);
  504. end;
  505. // ==================== TbsSkinFontComboBox ======================= //
  506. const
  507.   WRITABLE_FONTTYPE = 256;
  508. function IsValidFont(Box: TbsSkinFontComboBox; LogFont: TLogFont;
  509.   FontType: Integer): Boolean;
  510. begin
  511.   Result := True;
  512.   if (foAnsiOnly in Box.Options) then
  513.     Result := Result and (LogFont.lfCharSet = ANSI_CHARSET);
  514.   if (foTrueTypeOnly in Box.Options) then
  515.     Result := Result and (FontType and TRUETYPE_FONTTYPE = TRUETYPE_FONTTYPE);
  516.   if (foFixedPitchOnly in Box.Options) then
  517.     Result := Result and (LogFont.lfPitchAndFamily and FIXED_PITCH = FIXED_PITCH);
  518.   if (foOEMFontsOnly in Box.Options) then
  519.     Result := Result and (LogFont.lfCharSet = OEM_CHARSET);
  520.   if (foNoOEMFonts in Box.Options) then
  521.     Result := Result and (LogFont.lfCharSet <> OEM_CHARSET);
  522.   if (foNoSymbolFonts in Box.Options) then
  523.     Result := Result and (LogFont.lfCharSet <> SYMBOL_CHARSET);
  524.   if (foScalableOnly in Box.Options) then
  525.     Result := Result and (FontType and RASTER_FONTTYPE = 0);
  526. end;
  527. function EnumFonTbsroc(var EnumLogFont: TEnumLogFont;
  528.   var TextMetric: TNewTextMetric; FontType: Integer; Data: LPARAM): Integer;
  529.   export; stdcall;
  530. var
  531.   FaceName: string;
  532. begin
  533.   FaceName := StrPas(EnumLogFont.elfLogFont.lfFaceName);
  534.   with TbsSkinFontComboBox(Data) do
  535.     if (Items.IndexOf(FaceName) < 0) and
  536.       IsValidFont(TbsSkinFontComboBox(Data), EnumLogFont.elfLogFont, FontType) then
  537.     begin
  538.       if EnumLogFont.elfLogFont.lfCharSet <> SYMBOL_CHARSET then
  539.         FontType := FontType or WRITABLE_FONTTYPE;
  540.       Items.AddObject(FaceName, TObject(FontType));
  541.     end;
  542.   Result := 1;
  543. end;
  544. constructor TbsSkinFontComboBox.Create(AOwner: TComponent);
  545. begin
  546.   inherited Create(AOwner);
  547.   OnListBoxDrawItem := DrawLBFontItem;
  548.   OnComboBoxDrawItem := DrawCBFontItem;
  549.   FDevice := fdScreen;
  550.   Sorted := True;
  551. end;
  552. procedure TbsSkinFontComboBox.DrawTT;
  553. begin
  554.   with Cnvs do
  555.   begin
  556.     Pen.Color := C;
  557.     MoveTo(X, Y);
  558.     LineTo(X + 7, Y);
  559.     LineTo(X + 7, Y + 3);
  560.     MoveTo(X, Y);
  561.     LineTo(X, Y + 3);
  562.     MoveTo(X + 1, Y);
  563.     LineTo(X + 1, Y + 1);
  564.     MoveTo(X + 6, Y);
  565.     LineTo(X + 6, Y + 1);
  566.     MoveTo(X + 3, Y);
  567.     LineTo(X + 3, Y + 8);
  568.     MoveTo(X + 4, Y);
  569.     LineTo(X + 4, Y + 8);
  570.     MoveTo(X + 2, Y + 8);
  571.     LineTo(X + 6, Y + 8);
  572.   end;
  573. end;
  574. procedure TbsSkinFontComboBox.Reset;
  575. var
  576.   SaveName: TFontName;
  577. begin
  578.   if HandleAllocated then begin
  579.     FUpdate := True;
  580.     try
  581.       SaveName := FontName;
  582.       PopulateList;
  583.       FontName := SaveName;
  584.     finally
  585.       FUpdate := False;
  586.       if FontName <> SaveName
  587.       then
  588.         begin
  589.           if not (csReading in ComponentState) then
  590.           if not FUpdate and Assigned(FOnChange) then FOnChange(Self);
  591.         end;
  592.     end;
  593.   end;
  594. end;
  595. procedure TbsSkinFontComboBox.WMFontChange(var Message: TMessage);
  596. begin
  597.   inherited;
  598.   Reset;
  599. end;
  600. procedure TbsSkinFontComboBox.SetFontName(const NewFontName: TFontName);
  601. var
  602.   Item: Integer;
  603. begin
  604.   if FontName <> NewFontName then begin
  605.     if not (csLoading in ComponentState) then begin
  606.       HandleNeeded;
  607.       { change selected item }
  608.       for Item := 0 to Items.Count - 1 do
  609.         if AnsiCompareText(Items[Item], NewFontName) = 0 then begin
  610.           ItemIndex := Item;
  611.           //
  612.           if not (csReading in ComponentState) then
  613.             if not FUpdate and Assigned(FOnChange) then FOnChange(Self);
  614.           //
  615.           Exit;
  616.         end;
  617.       if Style = bscbFixedStyle then ItemIndex := -1
  618.       else Text := NewFontName;
  619.     end
  620.     else inherited Text := NewFontName;
  621.     //
  622.     if not (csReading in ComponentState) then
  623.     if not FUpdate and Assigned(FOnChange) then FOnChange(Self);
  624.     //
  625.   end;
  626. end;
  627. function TbsSkinFontComboBox.GetFontName: TFontName;
  628. begin
  629.   Result := inherited Text;
  630. end;
  631. function TbsSkinFontComboBox.GetTrueTypeOnly: Boolean;
  632. begin
  633.   Result := foTrueTypeOnly in FOptions;
  634. end;
  635. procedure TbsSkinFontComboBox.SetOptions;
  636. begin
  637.   if Value <> Options then begin
  638.     FOptions := Value;
  639.     Reset;
  640.   end;
  641. end;
  642. procedure TbsSkinFontComboBox.SetTrueTypeOnly(Value: Boolean);
  643. begin
  644.   if Value <> TrueTypeOnly then begin
  645.     if Value then FOptions := FOptions + [foTrueTypeOnly]
  646.     else FOptions := FOptions - [foTrueTypeOnly];
  647.     Reset;
  648.   end;
  649. end;
  650. procedure TbsSkinFontComboBox.SetDevice;
  651. begin
  652.   if Value <> FDevice then begin
  653.     FDevice := Value;
  654.     Reset;
  655.   end;
  656. end;
  657. procedure TbsSkinFontComboBox.SetUseFonts(Value: Boolean);
  658. begin
  659.   if Value <> FUseFonts then begin
  660.     FUseFonts := Value;
  661.     Invalidate;
  662.   end;
  663. end;
  664. procedure TbsSkinFontComboBox.DrawCBFontItem;
  665. var
  666.   FName: array[0..255] of Char;
  667.   R: TRect;
  668. begin
  669.   R := TextRect;
  670.   R.Left := R.Left + 2;
  671.   with Cnvs do
  672.   begin
  673.     StrPCopy(FName, Items[Index]);
  674.     SPDrawText2(Cnvs, FName, R);
  675.   end;
  676. end;
  677. procedure TbsSkinFontComboBox.DrawLBFontItem;
  678. var
  679.   FName: array[0..255] of Char;
  680.   R: TRect;
  681.   X, Y: Integer;
  682. begin
  683.   R := TextRect;
  684.   if (Integer(Items.Objects[Index]) and TRUETYPE_FONTTYPE) <> 0
  685.   then
  686.     begin
  687.       X := TextRect.Left;
  688.       Y := TextRect.Top + RectHeight(TextRect) div 2 - 7;
  689.       DrawTT(Cnvs, X, Y, clGray);
  690.       DrawTT(Cnvs, X + 4, Y + 4, clBlack);
  691.     end;
  692.   Inc(R.Left, 15);
  693.   with Cnvs do
  694.   begin
  695.     Font.Name := Items[Index];
  696.     Font.Style := [];
  697.     StrPCopy(FName, Items[Index]);
  698.     SPDrawText2(Cnvs, Items[Index], R);
  699.   end;
  700. end;
  701. procedure TbsSkinFontComboBox.PopulateList;
  702. var
  703.   DC: HDC;
  704.   Proc: TFarProc;
  705.   OldItemIndex: Integer;
  706. begin
  707.   if not HandleAllocated then Exit;
  708.   OldItemIndex := ItemIndex;
  709.   Items.BeginUpdate;
  710.   try
  711.     Items.Clear;
  712.     DC := GetDC(0);
  713.     try
  714.       if (FDevice = fdScreen) or (FDevice = fdBoth) then
  715.         EnumFontFamilies(DC, nil, @EnumFonTbsroc, Longint(Self));
  716.       if (FDevice = fdPrinter) or (FDevice = fdBoth) then
  717.       try
  718.         EnumFontFamilies(Printer.Handle, nil, @EnumFonTbsroc, Longint(Self));
  719.       except
  720.         { skip any errors }
  721.       end;
  722.     finally
  723.       ReleaseDC(0, DC);
  724.     end;
  725.   finally
  726.     Items.EndUpdate;
  727.   end;
  728.   ItemIndex := OldItemIndex;
  729. end;
  730. procedure TbsSkinFontComboBox.CreateWnd;
  731. var
  732.   OldFont: TFontName;
  733. begin
  734.   OldFont := FontName;
  735.   inherited CreateWnd;
  736.   FUpdate := True;
  737.   try
  738.     PopulateList;
  739.     inherited Text := '';
  740.     SetFontName(OldFont);
  741.   finally
  742.     FUpdate := False;
  743.   end;
  744. //  if AnsiCompareText(FontName, OldFont) <> 0 then DoChange;
  745. end;
  746. // ==================== TbsSkinColorComboBox ======================= //
  747. const
  748.   SColorBoxCustomCaption = 'Custom...';
  749.   NoColorSelected = TColor($FF000000);
  750.   StandardColorsCount = 16;
  751.   ExtendedColorsCount = 4;
  752. constructor TbsSkinColorComboBox.Create(AOwner: TComponent);
  753. begin
  754.   inherited Create(AOwner);
  755.   Style := bscbFixedStyle;
  756.   FExStyle := [bscbStandardColors, bscbExtendedColors, bscbSystemColors];
  757.   FSelectedColor := clBlack;
  758.   FDefaultColorColor := clBlack;
  759.   FNoneColorColor := clBlack;
  760.   OnListBoxDrawItem := DrawColorItem;
  761.   OnComboBoxDrawItem := DrawColorItem;
  762.   OnCloseUp := OnLBCloseUp;
  763.   FShowNames := True;
  764. end;
  765. procedure TbsSkinColorComboBox.SetShowNames(Value: Boolean);
  766. begin
  767.   FShowNames := Value;
  768.   RePaint;
  769. end;
  770. procedure TbsSkinColorComboBox.DrawColorItem;
  771. var
  772.   R: TRect;
  773.   MarkerRect: TRect;
  774. begin
  775.   if FShowNames
  776.   then
  777.     MarkerRect := Rect(TextRect.Left + 1, TextRect.Top + 1,
  778.       TextRect.Left + RectHeight(TextRect) - 1, TextRect.Bottom - 1)
  779.   else
  780.     MarkerRect := Rect(TextRect.Left + 1, TextRect.Top + 1,
  781.       TextRect.Right - 1, TextRect.Bottom - 1);
  782.   with Cnvs do
  783.   begin
  784.     Brush.Style := bsSolid;
  785.     Brush.Color := Colors[Index];
  786.     FillRect(MarkerRect);
  787.     Brush.Style := bsClear;
  788.   end;
  789.   if FShowNames
  790.   then
  791.     begin
  792.       R := TextRect;
  793.       R := Rect(R.Left + 5 + RectWidth(MarkerRect), R.Top, R.Right - 2, R.Bottom);
  794.       SPDrawText2(Cnvs, FListBox.Items[Index], R);
  795.     end;
  796. end;
  797. procedure TbsSkinColorComboBox.OnLBCloseUp;
  798. begin
  799.   if (bscbCustomColor in ExStyle) and (ItemIndex = 0) then
  800.    PickCustomColor;
  801. end;
  802. function TbsSkinColorComboBox.PickCustomColor: Boolean;
  803. var
  804.   LColor: TColor;
  805. begin
  806.   with TColorDialog.Create(nil) do
  807.     try
  808.       LColor := ColorToRGB(TColor(Items.Objects[0]));
  809.       Color := LColor;
  810.       CustomColors.Text := Format('ColorA=%.8x', [LColor]);
  811.       Result := Execute;
  812.       if Result then
  813.       begin
  814.         Items.Objects[0] := TObject(Color);
  815.         Self.Invalidate;
  816.         if Assigned(FOnClick) then FOnClick(Self);
  817.         if Assigned(FOnChange) then FOnChange(Self);
  818.       end;
  819.     finally
  820.       Free;
  821.     end;
  822. end;
  823. procedure TbsSkinColorComboBox.KeyDown;
  824. begin
  825.   if (bscbCustomColor in ExStyle) and (Key = VK_RETURN) and (ItemIndex = 0)
  826.   then
  827.   begin
  828.     PickCustomColor;
  829.     Key := 0;
  830.   end;
  831.   inherited;
  832. end;
  833. procedure TbsSkinColorComboBox.CreateWnd;
  834. begin
  835.   inherited;
  836.   PopulateList;
  837. end;
  838. procedure TbsSkinColorComboBox.SetDefaultColorColor(const Value: TColor);
  839. begin
  840.   if Value <> FDefaultColorColor then
  841.   begin
  842.     FDefaultColorColor := Value;
  843.     Invalidate;
  844.   end;
  845. end;
  846. procedure TbsSkinColorComboBox.SetNoneColorColor(const Value: TColor);
  847. begin
  848.   if Value <> FNoneColorColor then
  849.   begin
  850.     FNoneColorColor := Value;
  851.     Invalidate;
  852.   end;
  853. end;
  854. procedure TbsSkinColorComboBox.ColorCallBack(const AName: String);
  855. var
  856.   I, LStart: Integer;
  857.   LColor: TColor;
  858.   LName: string;
  859. begin
  860.   LColor := StringToColor(AName);
  861.   if bscbPrettyNames in ExStyle then
  862.   begin
  863.     if Copy(AName, 1, 2) = 'cl' then
  864.       LStart := 3
  865.     else
  866.       LStart := 1;
  867.     LName := '';
  868.     for I := LStart to Length(AName) do
  869.     begin
  870.       case AName[I] of
  871.         'A'..'Z':
  872.           if LName <> '' then
  873.             LName := LName + ' ';
  874.       end;
  875.       LName := LName + AName[I];
  876.     end;
  877.   end
  878.   else
  879.     LName := AName;
  880.   Items.AddObject(LName, TObject(LColor));
  881. end;
  882. procedure TbsSkinColorComboBox.SetSelected(const AColor: TColor);
  883. var
  884.   I: Integer;
  885. begin
  886.   if HandleAllocated and (FListBox <> nil) then
  887.   begin
  888.     I := FListBox.Items.IndexOfObject(TObject(AColor));
  889.     if (I = -1) and (bscbCustomColor in ExStyle) and (AColor <> NoColorSelected) then
  890.     begin
  891.       Items.Objects[0] := TObject(AColor);
  892.       I := 0;
  893.     end;
  894.     ItemIndex := I;
  895.   end;
  896.   FSelectedColor := AColor;
  897. end;
  898. procedure TbsSkinColorComboBox.PopulateList;
  899.   procedure DeleteRange(const AMin, AMax: Integer);
  900.   var
  901.     I: Integer;
  902.   begin
  903.     for I := AMax downto AMin do
  904.       Items.Delete(I);
  905.   end;
  906.   procedure DeleteColor(const AColor: TColor);
  907.   var
  908.     I: Integer;
  909.   begin
  910.     I := Items.IndexOfObject(TObject(AColor));
  911.     if I <> -1 then
  912.       Items.Delete(I);
  913.   end;
  914. var
  915.   LSelectedColor, LCustomColor: TColor;
  916. begin
  917.   if HandleAllocated then
  918.   begin
  919.     Items.BeginUpdate;
  920.     try
  921.       LCustomColor := clBlack;
  922.       if (bscbCustomColor in ExStyle) and (Items.Count > 0) then
  923.         LCustomColor := TColor(Items.Objects[0]);
  924.       LSelectedColor := FSelectedColor;
  925.       Items.Clear;
  926.       GetColorValues(ColorCallBack);
  927.       if not (bscbIncludeNone in ExStyle) then
  928.         DeleteColor(clNone);
  929.       if not (bscbIncludeDefault in ExStyle) then
  930.         DeleteColor(clDefault);
  931.       if not (bscbSystemColors in ExStyle) then
  932.         DeleteRange(StandardColorsCount + ExtendedColorsCount, Items.Count - 1);
  933.       if not (bscbExtendedColors in ExStyle) then
  934.         DeleteRange(StandardColorsCount, StandardColorsCount + ExtendedColorsCount - 1);
  935.       if not (bscbStandardColors in ExStyle) then
  936.         DeleteRange(0, StandardColorsCount - 1);
  937.       if bscbCustomColor in ExStyle then
  938.         Items.InsertObject(0, SColorBoxCustomCaption, TObject(LCustomColor));
  939.       Self.Selected := LSelectedColor;
  940.     finally
  941.       Items.EndUpdate;
  942.       FNeedToPopulate := False;
  943.     end;
  944.   end
  945.   else
  946.     FNeedToPopulate := True;
  947. end;
  948. procedure TbsSkinColorComboBox.SetExStyle(AStyle: TbsColorBoxStyle);
  949. begin
  950.   FExStyle := AStyle;
  951.   Enabled := ([bscbStandardColors, bscbExtendedColors, bscbSystemColors, bscbCustomColor] * FExStyle) <> [];
  952.   PopulateList;
  953.   if (Items.Count > 0) and (ItemIndex = -1) then ItemIndex := 0;
  954. end;
  955. function TbsSkinColorComboBox.GetColor(Index: Integer): TColor;
  956. begin
  957.   Result := TColor(Items.Objects[Index]);
  958. end;
  959. function TbsSkinColorComboBox.GetColorName(Index: Integer): string;
  960. begin
  961.   Result := Items[Index];
  962. end;
  963. function TbsSkinColorComboBox.GetSelected: TColor;
  964. begin
  965.   if HandleAllocated then
  966.     if ItemIndex <> -1 then
  967.       Result := Colors[ItemIndex]
  968.     else
  969.       Result := NoColorSelected
  970.   else
  971.     Result := FSelectedColor;
  972. end;
  973. //================= check listbox ===================//
  974. type
  975. TbsCheckListBoxDataWrapper = class
  976. private
  977.   FData: LongInt;
  978.   FState: TCheckBoxState;
  979.   procedure SetChecked(Check: Boolean);
  980.   function GetChecked: Boolean;
  981. public
  982.   class function GetDefaultState: TCheckBoxState;
  983.   property Checked: Boolean read GetChecked write SetChecked;
  984.   property State: TCheckBoxState read FState write FState;
  985. end;
  986. procedure TbsCheckListBoxDataWrapper.SetChecked(Check: Boolean);
  987. begin
  988.   if Check then FState := cbChecked else FState := cbUnchecked;
  989. end;
  990. function TbsCheckListBoxDataWrapper.GetChecked: Boolean;
  991. begin
  992.   Result := FState = cbChecked;
  993. end;
  994. class function TbsCheckListBoxDataWrapper.GetDefaultState: TCheckBoxState;
  995. begin
  996.   Result := cbUnchecked;
  997. end;
  998. constructor TbsCheckListBox.Create;
  999. begin
  1000.   inherited;
  1001.   SkinListBox := nil;
  1002.   Ctl3D := False;
  1003.   BorderStyle := bsNone;
  1004.   ControlStyle := [csCaptureMouse, csOpaque, csDoubleClicks];
  1005. end;
  1006. destructor TbsCheckListBox.Destroy;
  1007. begin
  1008.   inherited;
  1009. end;
  1010. procedure TbsCheckListBox.WMNCCALCSIZE;
  1011. begin
  1012. end;
  1013. procedure TbsCheckListBox.CMEnter;
  1014. begin
  1015.   if SkinListBox <> nil then SkinListBox.ListBoxEnter;
  1016.   inherited;
  1017. end;
  1018. procedure TbsCheckListBox.CMExit;
  1019. begin
  1020.   if SkinListBox <> nil then SkinListBox.ListBoxExit;
  1021.   inherited;
  1022. end;
  1023. procedure TbsCheckListBox.MouseUp(Button: TMouseButton; Shift: TShiftState;
  1024.       X, Y: Integer);
  1025. begin
  1026.   if SkinListBox <> nil then SkinListBox.ListBoxMouseUp(Button, Shift, X, Y);
  1027.   inherited;
  1028. end;
  1029. procedure TbsCheckListBox.MouseMove(Shift: TShiftState; X, Y: Integer);
  1030. begin
  1031.   if SkinListBox <> nil then SkinListBox.ListBoxMouseMove(Shift, X, Y);
  1032.   inherited;
  1033. end;
  1034. procedure TbsCheckListBox.KeyDown(var Key: Word; Shift: TShiftState);
  1035. begin
  1036.   if SkinListBox <> nil then SkinListBox.ListBoxKeyDown(Key, Shift);
  1037.   inherited;
  1038. end;
  1039. procedure TbsCheckListBox.Click;
  1040. begin
  1041.   if SkinListBox <> nil then SkinListBox.ListBoxClick;
  1042.   inherited;
  1043. end;
  1044. procedure TbsCheckListBox.PaintBGWH;
  1045. var
  1046.   X, Y, XCnt, YCnt, XO, YO, w, h, w1, h1: Integer;
  1047.   Buffer: TBitMap;
  1048. begin
  1049.   w1 := AW;
  1050.   h1 := AH;
  1051.   Buffer := TBitMap.Create;
  1052.   Buffer.Width := w1;
  1053.   Buffer.Height := h1;
  1054.   with Buffer.Canvas, SkinListBox do
  1055.   begin
  1056.     w := RectWidth(ClRect);
  1057.     h := RectHeight(ClRect);
  1058.     XCnt := w1 div w;
  1059.     YCnt := h1 div h;
  1060.     for X := 0 to XCnt do
  1061.     for Y := 0 to YCnt do
  1062.     begin
  1063.       if X * w + w > w1 then XO := X * w + w - w1 else XO := 0;
  1064.       if Y * h + h > h1 then YO := Y * h + h - h1 else YO := 0;
  1065.        CopyRect(Rect(X * w, Y * h, X * w + w - XO, Y * h + h - YO),
  1066.                 Picture.Canvas,
  1067.                 Rect(SkinRect.Left + ClRect.Left, SkinRect.Top + ClRect.Top,
  1068.                 SkinRect.Left + ClRect.Right - XO,
  1069.                 SkinRect.Top + ClRect.Bottom - YO));
  1070.     end;
  1071.   end;
  1072.   Cnvs.Draw(AX, AY, Buffer);
  1073.   Buffer.Free;
  1074. end;
  1075. function TbsCheckListBox.GetItemData(Index: Integer): LongInt;
  1076. begin
  1077.   Result := 0;
  1078.   if HaveWrapper(Index) then
  1079.     Result := TbsCheckListBoxDataWrapper(GetWrapper(Index)).FData;
  1080. end;
  1081. procedure TbsCheckListBox.SetItemData(Index: Integer; AData: LongInt);
  1082. var
  1083.   Wrapper: TbsCheckListBoxDataWrapper;
  1084. begin
  1085.   Wrapper := TbsCheckListBoxDataWrapper(GetWrapper(Index));
  1086.   Wrapper.FData := AData;
  1087.   if FSaveStates <> nil then
  1088.     if FSaveStates.Count > 0 then
  1089.     begin
  1090.      Wrapper.FState := TCheckBoxState(FSaveStates[0]);
  1091.      FSaveStates.Delete(0);
  1092.     end;
  1093. end;
  1094. procedure TbsCheckListBox.ResetContent;
  1095. var
  1096.   I: Integer;
  1097. begin
  1098.   for I := 0 to Items.Count - 1 do
  1099.     if HaveWrapper(I) then
  1100.       GetWrapper(I).Free;
  1101.   inherited;
  1102. end;
  1103. procedure TbsCheckListBox.CreateWnd;
  1104. begin
  1105.   inherited CreateWnd;
  1106.   if FSaveStates <> nil then
  1107.   begin
  1108.     FSaveStates.Free;
  1109.     FSaveStates := nil;
  1110.   end;
  1111. end;
  1112. procedure TbsCheckListBox.DestroyWnd;
  1113. var
  1114.   I: Integer;
  1115. begin
  1116.   if Items.Count > 0 then
  1117.   begin
  1118.     FSaveStates := TList.Create;
  1119.     for I := 0 to Items.Count -1 do
  1120.       FSaveStates.Add(TObject(State[I]));
  1121.   end;
  1122.   inherited DestroyWnd;
  1123. end;
  1124. procedure TbsCheckListBox.WMDestroy(var Msg: TWMDestroy);
  1125. var
  1126.   i: Integer;
  1127. begin
  1128.   for i := 0 to Items.Count -1 do
  1129.     ExtractWrapper(i).Free;
  1130.   inherited;
  1131. end;
  1132. procedure TbsCheckListBox.DeleteString(Index: Integer);
  1133. begin
  1134.   if HaveWrapper(Index) then
  1135.     GetWrapper(Index).Free;
  1136.   inherited;
  1137. end;
  1138. procedure TbsCheckListBox.KeyPress(var Key: Char);
  1139. begin
  1140.   inherited;
  1141.   if (Key = ' ') then ToggleClickCheck(ItemIndex);
  1142.   if SkinListBox <> nil then SkinListBox.ListBoxKeyPress(Key);
  1143. end;
  1144. procedure TbsCheckListBox.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1145.       X, Y: Integer);
  1146. function InCheckArea(IR: TRect): Boolean;
  1147. var
  1148.   R, R1: TRect;
  1149.   OX: Integer;
  1150. begin
  1151.   R := SkinListBox.ItemTextRect;
  1152.   OX :=  RectWidth(IR) - RectWidth(SkinListBox.SItemRect);
  1153.   Inc(R.Right, OX);
  1154.   R1 := SkinListBox.ItemCheckRect;
  1155.   if R1.Left >= SkinListBox.ItemTextRect.Right
  1156.   then OffsetRect(R1, OX, 0);
  1157.   OffsetRect(R1, IR.Left, IR.Top);
  1158.   Result := PtInRect(R1, Point(X, Y));
  1159. end;
  1160. var
  1161.   Index: Integer;
  1162. begin
  1163.   inherited;
  1164.   Index := ItemAtPos(Point(X,Y),True);
  1165.   if (Index <> -1)
  1166.   then 
  1167.     if (SkinListBox <> nil) and (SkinListBox.FIndex <> -1)
  1168.     then
  1169.       begin
  1170.         if InCheckArea(ItemRect(Index)) then ToggleClickCheck(Index);
  1171.       end
  1172.     else
  1173.       begin
  1174.         if X - ItemRect(Index).Left < 20 then ToggleClickCheck(Index);
  1175.       end;
  1176.   if SkinListBox <> nil then SkinListBox.ListBoxMouseDown(Button, Shift, X, Y);    
  1177. end;
  1178. procedure TbsCheckListBox.ToggleClickCheck;
  1179. var
  1180.   State: TCheckBoxState;
  1181. begin
  1182.   if (Index >= 0) and (Index < Items.Count) then
  1183.   begin
  1184.     State := Self.State[Index];
  1185.     case State of
  1186.       cbUnchecked: State := cbChecked;
  1187.       cbChecked: State := cbUnchecked;
  1188.     end;
  1189.     Self.State[Index] := State;
  1190.     if Assigned(FOnClickCheck) then FOnClickCheck(Self);
  1191.   end;
  1192. end;
  1193. procedure TbsCheckListBox.InvalidateCheck(Index: Integer);
  1194. var
  1195.   R: TRect;
  1196. begin
  1197.   R := ItemRect(Index);
  1198.   InvalidateRect(Handle, @R, not (csOpaque in ControlStyle));
  1199.   UpdateWindow(Handle);
  1200. end;
  1201. function TbsCheckListBox.GetWrapper(Index: Integer): TObject;
  1202. begin
  1203.   Result := ExtractWrapper(Index);
  1204.   if Result = nil then
  1205.     Result := CreateWrapper(Index);
  1206. end;
  1207. function TbsCheckListBox.ExtractWrapper(Index: Integer): TObject;
  1208. begin
  1209.   Result := TbsCheckListBoxDataWrapper(inherited GetItemData(Index));
  1210.   if LB_ERR = Integer(Result) then
  1211.     raise EListError.CreateFmt('List index out of bounds (%d)', [Index]);
  1212.   if (Result <> nil) and (not (Result is TbsCheckListBoxDataWrapper)) then
  1213.     Result := nil;
  1214. end;
  1215. function TbsCheckListBox.CreateWrapper(Index: Integer): TObject;
  1216. begin
  1217.   Result := TbsCheckListBoxDataWrapper.Create;
  1218.   inherited SetItemData(Index, LongInt(Result));
  1219. end;
  1220. function TbsCheckListBox.HaveWrapper(Index: Integer): Boolean;
  1221. begin
  1222.   Result := ExtractWrapper(Index) <> nil;
  1223. end;
  1224. procedure TbsCheckListBox.SetChecked(Index: Integer; Checked: Boolean);
  1225. begin
  1226.   if Checked <> GetChecked(Index) then
  1227.   begin
  1228.     TbsCheckListBoxDataWrapper(GetWrapper(Index)).SetChecked(Checked);
  1229.     InvalidateCheck(Index);
  1230.   end;
  1231. end;
  1232. procedure TbsCheckListBox.SetState(Index: Integer; AState: TCheckBoxState);
  1233. begin
  1234.   if AState <> GetState(Index) then
  1235.   begin
  1236.     TbsCheckListBoxDataWrapper(GetWrapper(Index)).State := AState;
  1237.     InvalidateCheck(Index);
  1238.   end;
  1239. end;
  1240. function TbsCheckListBox.GetChecked(Index: Integer): Boolean;
  1241. begin
  1242.   if HaveWrapper(Index) then
  1243.     Result := TbsCheckListBoxDataWrapper(GetWrapper(Index)).GetChecked
  1244.   else
  1245.     Result := False;
  1246. end;
  1247. function TbsCheckListBox.GetState(Index: Integer): TCheckBoxState;
  1248. begin
  1249.   if HaveWrapper(Index) then
  1250.     Result := TbsCheckListBoxDataWrapper(GetWrapper(Index)).State
  1251.   else
  1252.     Result := TbsCheckListBoxDataWrapper.GetDefaultState;
  1253. end;
  1254. function TbsCheckListBox.GetState1;
  1255. begin
  1256.   Result := [];
  1257.   if AItemID = ItemIndex
  1258.   then
  1259.     begin
  1260.       Result := Result + [odSelected];
  1261.       if Focused then Result := Result + [odFocused];
  1262.     end
  1263.   else
  1264.     if SelCount > 0
  1265.     then
  1266.       if Selected[AItemID] then Result := Result + [odSelected];
  1267. end;
  1268. procedure TbsCheckListBox.PaintBG(DC: HDC);
  1269. var
  1270.   C: TControlCanvas;
  1271. begin
  1272.   C := TControlCanvas.Create;
  1273.   C.Handle := DC;
  1274.   SkinListBox.GetSkinData;
  1275.   if SkinListBox.FIndex <> -1
  1276.   then
  1277.     PaintBGWH(C, Width, Height, 0, 0)
  1278.   else
  1279.     with C do
  1280.     begin
  1281.       C.Brush.Color := clWindow;
  1282.       FillRect(Rect(0, 0, Width, Height));
  1283.     end;
  1284.   C.Handle := 0;
  1285.   C.Free;
  1286. end;
  1287. procedure TbsCheckListBox.PaintColumnsList(DC: HDC);
  1288. var
  1289.   C: TCanvas;
  1290.   i, j, DrawCount: Integer;
  1291.   IR: TRect;
  1292. begin
  1293.   C := TCanvas.Create;
  1294.   C.Handle := DC;
  1295.   DrawCount := (Height div ItemHeight) * Columns;
  1296.   i := TopIndex;
  1297.   j := i + DrawCount;
  1298.   if j > Items.Count - 1 then j := Items.Count - 1;
  1299.   if Items.Count > 0
  1300.   then
  1301.     for i := TopIndex to j do
  1302.     begin
  1303.       IR := ItemRect(i);
  1304.       if SkinListBox.FIndex <> -1
  1305.       then
  1306.         DrawSkinItem(C, i, IR, GetState1(i))
  1307.       else
  1308.         DrawDefaultItem(C, i, IR, GetState1(i));
  1309.     end;
  1310.   C.Free;
  1311. end;
  1312. procedure TbsCheckListBox.PaintList(DC: HDC);
  1313. var
  1314.   C: TCanvas;
  1315.   i, j, k, DrawCount: Integer;
  1316.   IR: TRect;
  1317. begin
  1318.   C := TCanvas.Create;
  1319.   C.Handle := DC;
  1320.   DrawCount := Height div ItemHeight;
  1321.   i := TopIndex;
  1322.   j := i + DrawCount;
  1323.   if j > Items.Count - 1 then j := Items.Count - 1;
  1324.   k := 0;
  1325.   if Items.Count > 0
  1326.   then
  1327.     for i := TopIndex to j do
  1328.     begin
  1329.       IR := ItemRect(i);
  1330.       if SkinListBox.FIndex <> -1
  1331.       then
  1332.         DrawSkinItem(C, i, IR, GetState1(i))
  1333.       else
  1334.         DrawDefaultItem(C, i, IR, GetState1(i));
  1335.       k := IR.Bottom;
  1336.     end;
  1337.   if k < Height
  1338.   then
  1339.     begin
  1340.       SkinListBox.GetSkinData;
  1341.       if SkinListBox.FIndex <> -1
  1342.       then
  1343.         PaintBGWH(C, Width, Height - k, 0, k)
  1344.       else
  1345.         with C do
  1346.         begin
  1347.           C.Brush.Color := clWindow;
  1348.           FillRect(Rect(0, k, Width, Height));
  1349.         end;
  1350.     end;
  1351.   C.Free;
  1352. end;
  1353. procedure TbsCheckListBox.PaintWindow;
  1354. var
  1355.   SaveIndex: Integer;
  1356. begin
  1357.   if (Width <= 0) or (Height <=0) then Exit;
  1358.   SaveIndex := SaveDC(DC);
  1359.   try
  1360.     if Columns > 0
  1361.     then
  1362.       PaintColumnsList(DC)
  1363.     else
  1364.       PaintList(DC);
  1365.   finally
  1366.     RestoreDC(DC, SaveIndex);
  1367.   end;
  1368. end;
  1369. procedure TbsCheckListBox.WMPaint;
  1370. begin
  1371.   PaintHandler(Msg);
  1372. end;
  1373. procedure TbsCheckListBox.WMEraseBkgnd;
  1374. begin
  1375.   PaintBG(Message.DC);
  1376.   Message.Result := 1;
  1377. end;
  1378. procedure TbsCheckListBox.DrawDefaultItem;
  1379. var
  1380.   Buffer: TBitMap;
  1381.   R, R1, CR: TRect;
  1382.   AState: TCheckBoxState;
  1383.   IIndex, IX, IY: Integer;
  1384. begin
  1385.   if (ItemID < 0) or (ItemID > Items.Count - 1) then Exit;
  1386.   AState := GetState(itemID);
  1387.   Buffer := TBitMap.Create;
  1388.   Buffer.Width := RectWidth(rcItem);
  1389.   Buffer.Height := RectHeight(rcItem);
  1390.   R := Rect(20, 0, Buffer.Width, Buffer.Height);
  1391.   with Buffer.Canvas do
  1392.   begin
  1393.     Font.Name := SkinListBox.Font.Name;
  1394.     Font.Style := SkinListBox.Font.Style;
  1395.     Font.Height := SkinListBox.Font.Height;
  1396.     if odSelected in State1
  1397.     then
  1398.       begin
  1399.         Brush.Color := clHighLight;
  1400.         Font.Color := clHighLightText;
  1401.       end
  1402.     else
  1403.       begin
  1404.         Brush.Color := clWindow;
  1405.         Font.Color := SkinListBox.Font.Color;
  1406.       end;
  1407.     FillRect(R);
  1408.   end;
  1409.   R1 := Rect(R.Left + 2, R.Top, R.Right - 2, R.Bottom);
  1410.   CR := Rect(3, Buffer.Height div 2 - 6, 16, Buffer.Height div 2 + 7);
  1411.   Frame3D(Buffer.Canvas, CR, clBtnShadow, clBtnShadow, 1);
  1412.   
  1413.   if AState = cbChecked
  1414.   then
  1415.     DrawCheckImage(Buffer.Canvas, 6, Buffer.Height div 2 - 4, clWindowText);
  1416.   if Assigned(SkinListBox.FOnDrawItem)
  1417.   then
  1418.     SkinListBox.FOnDrawItem(Buffer.Canvas, ItemID, Buffer.Width, Buffer.Height,
  1419.     R1, State1)
  1420.   else
  1421.     begin
  1422.       if (SkinListBox.Images <> nil)
  1423.       then
  1424.         begin
  1425.           if SkinListBox.ImageIndex > -1
  1426.           then IIndex := SkinListBox.FImageIndex
  1427.           else IIndex := itemID;
  1428.           if IIndex < SkinListBox.Images.Count
  1429.           then
  1430.             begin
  1431.               IX := R1.Left;
  1432.               IY := R1.Top + RectHeight(R1) div 2 - SkinListBox.Images.Height div 2;
  1433.               SkinListBox.Images.Draw(Buffer.Canvas, IX, IY, IIndex);
  1434.             end;
  1435.           Inc(R1.Left, SkinListBox.Images.Width + 2);
  1436.         end;
  1437.       SPDrawText2(Buffer.Canvas, Items[ItemID], R1);
  1438.     end;
  1439.   if odFocused in State1 then DrawFocusRect(Buffer.Canvas.Handle, R);
  1440.   Cnvs.Draw(rcItem.Left, rcItem.Top, Buffer);
  1441.   Buffer.Free;
  1442. end;
  1443. procedure TbsCheckListBox.SkinDrawCheckImage(X, Y: Integer; Cnvs: TCanvas; IR: TRect; DestCnvs: TCanvas);
  1444. var
  1445.   B: TBitMap;
  1446. begin
  1447.   B := TBitMap.Create;
  1448.   B.Width := RectWidth(IR);
  1449.   B.Height := RectHeight(IR);
  1450.   B.Canvas.CopyRect(Rect(0, 0, B.Width, B.Height), Cnvs, IR);
  1451.   B.Transparent := True;
  1452.   DestCnvs.Draw(X, Y, B);
  1453.   B.Free;
  1454. end;
  1455. procedure TbsCheckListBox.DrawSkinItem;
  1456. var
  1457.   Buffer: TBitMap;
  1458.   R, R1: TRect;
  1459.   W, H: Integer;
  1460.   OX: Integer;
  1461.   AState: TCheckBoxState;
  1462.   cw, ch, cx, cy: Integer;
  1463.   IIndex, IX, IY: Integer;
  1464. begin
  1465.   if (SkinListBox.Picture = nil) or (ItemID < 0) or (ItemID > Items.Count - 1) then Exit;
  1466.   AState := GetState(itemID);
  1467.   Buffer := TBitMap.Create;
  1468.   with SkinListBox do
  1469.   begin
  1470.     W := RectWidth(rcItem);
  1471.     H := RectHeight(SItemRect);
  1472.     Buffer.Width := W;
  1473.     Buffer.Height := H;
  1474.     if odFocused in State1
  1475.     then
  1476.       CreateHSkinImage(ItemLeftOffset, ItemRightOffset, Buffer, Picture,
  1477.       FocusItemRect, W, H)
  1478.     else
  1479.     if odSelected in State1
  1480.     then
  1481.       CreateHSkinImage(ItemLeftOffset, ItemRightOffset, Buffer, Picture,
  1482.       ActiveItemRect, W, H)
  1483.     else
  1484.       CreateHSkinImage(ItemLeftOffset, ItemRightOffset, Buffer, Picture,
  1485.       SItemRect, W, H);
  1486.     R := ItemTextRect;
  1487.     OX :=  W - RectWidth(SItemRect);
  1488.     Inc(R.Right, OX);
  1489.     R1 := ItemCheckRect;
  1490.     if R1.Left >= ItemTextRect.Right then OffsetRect(R1, OX, 0);
  1491.     cw := RectWidth(CheckImageRect);
  1492.     ch := RectHeight(CheckImageRect);
  1493.     cx := R1.Left + RectWidth(R1) div 2;
  1494.     cy := R1.Top + RectHeight(R1) div 2;
  1495.     R1 := Rect(cx - cw div 2, cy - ch div 2,
  1496.                cx - cw div 2 + cw, cy - ch div 2 + ch);
  1497.     if AState = cbChecked
  1498.     then
  1499.       SkinDrawCheckImage(R1.Left, R1.Top, Picture.Canvas, CheckImageRect, Buffer.Canvas)
  1500.     else
  1501.       SkinDrawCheckImage(R1.Left, R1.Top, Picture.Canvas, UnCheckImageRect, Buffer.Canvas);
  1502.   end;
  1503.   with Buffer.Canvas do
  1504.   begin
  1505.     if SkinListBox.UseSkinFont
  1506.     then
  1507.       begin
  1508.         Font.Name := SkinListBox.FontName;
  1509.         Font.Style := SkinListBox.FontStyle;
  1510.         Font.Height := SkinListBox.FontHeight;
  1511.         Font.CharSet := SkinListBox.DefaultFont.CharSet;
  1512.       end
  1513.     else
  1514.       Font.Assign(SkinListBox.DefaultFont);
  1515.     if odFocused in State1
  1516.     then
  1517.       Font.Color := SkinListBox.FocusFontColor
  1518.     else
  1519.     if odSelected in State1
  1520.     then
  1521.       Font.Color := SkinListBox.ActiveFontColor
  1522.     else
  1523.       Font.Color := SkinListBox.FontColor;
  1524.     Brush.Style := bsClear;
  1525.   end;
  1526.   if Assigned(SkinListBox.FOnDrawItem)
  1527.   then
  1528.     SkinListBox.FOnDrawItem(Buffer.Canvas, ItemID, Buffer.Width, Buffer.Height,
  1529.     R, State1)
  1530.   else
  1531.     begin
  1532.       if (SkinListBox.Images <> nil)
  1533.       then
  1534.         begin
  1535.           if SkinListBox.ImageIndex > -1
  1536.           then IIndex := SkinListBox.FImageIndex
  1537.           else IIndex := itemID;
  1538.           if IIndex < SkinListBox.Images.Count
  1539.           then
  1540.             begin
  1541.               IX := R.Left;
  1542.               IY := R.Top + RectHeight(R) div 2 - SkinListBox.Images.Height div 2;
  1543.               SkinListBox.Images.Draw(Buffer.Canvas, IX, IY, IIndex);
  1544.             end;
  1545.           Inc(R.Left, SkinListBox.Images.Width + 2);
  1546.         end;
  1547.       SPDrawText2(Buffer.Canvas, Items[ItemID], R); 
  1548.     end;
  1549.   Cnvs.Draw(rcItem.Left, rcItem.Top, Buffer);
  1550.   Buffer.Free;
  1551. end;
  1552. procedure TbsCheckListBox.CreateParams;
  1553. begin
  1554.   inherited CreateParams(Params);
  1555.   with Params do
  1556.   begin
  1557.     Style := Style and not WS_BORDER;
  1558.     ExStyle := ExStyle and not WS_EX_CLIENTEDGE;
  1559.     WindowClass.style := CS_DBLCLKS;
  1560.     Style := Style or WS_TABSTOP;
  1561.   end;
  1562. end;
  1563. procedure TbsCheckListBox.CNDrawItem;
  1564. var
  1565.   State: TOwnerDrawState;
  1566. begin
  1567.   with Message.DrawItemStruct^ do
  1568.   begin
  1569.     {$IFDEF VER120}
  1570.       State := TOwnerDrawState(WordRec(LongRec(itemState).Lo).Lo);
  1571.     {$ELSE}
  1572.       {$IFDEF VER125}
  1573.         State := TOwnerDrawState(WordRec(LongRec(itemState).Lo).Lo);
  1574.       {$ELSE}
  1575.         State := TOwnerDrawState(LongRec(itemState).Lo);
  1576.       {$ENDIF}
  1577.     {$ENDIF}
  1578.     Canvas.Handle := hDC;
  1579.     Canvas.Font := Font;
  1580.     Canvas.Brush := Brush;
  1581.     if SkinListBox.FIndex <> -1
  1582.     then
  1583.       DrawSkinItem(Canvas, itemID, rcItem, State)
  1584.     else
  1585.       DrawDefaultItem(Canvas, itemID, rcItem, State);
  1586.     Canvas.Handle := 0;
  1587.   end;
  1588. end;
  1589. procedure TbsCheckListBox.WndProc;
  1590. var
  1591.   LParam, WParam: Integer;
  1592. begin
  1593.   inherited;
  1594.   case Message.Msg of
  1595.     WM_LBUTTONDBLCLK:
  1596.       begin
  1597.         if SkinListBox <> nil then SkinListBox.ListBoxDblClick;
  1598.       end;
  1599.     WM_MOUSEWHEEL:
  1600.       if (SkinListBox <> nil) and (SkinListBox.ScrollBar <> nil)
  1601.       then
  1602.       begin
  1603.         LParam := 0;
  1604.         if Message.WParam > 0
  1605.         then
  1606.           WParam := MakeWParam(SB_LINEUP, 0)
  1607.         else
  1608.           WParam := MakeWParam(SB_LINEDOWN, 0);
  1609.         SendMessage(Handle, WM_VSCROLL, WParam, LParam);
  1610.         SkinListBox.UpDateScrollBar;
  1611.       end;
  1612.    WM_ERASEBKGND:
  1613.       SkinListBox.UpDateScrollBar;
  1614.     LB_ADDSTRING, LB_INSERTSTRING,
  1615.     LB_DELETESTRING:
  1616.       begin
  1617.         if SkinListBox <> nil
  1618.         then
  1619.           SkinListBox.UpDateScrollBar;
  1620.       end;
  1621.   end;
  1622. end;
  1623. constructor TbsSkinCheckListBox.Create;
  1624. begin
  1625.   inherited;
  1626.   ControlStyle := [csCaptureMouse, csClickEvents,
  1627.     csOpaque, csDoubleClicks, csReplicatable];
  1628.   ControlStyle := ControlStyle + [csAcceptsControls];
  1629.   FRowCount := 0;
  1630.   FGlyph := TBitMap.Create;
  1631.   FNumGlyphs := 1;
  1632.   FSpacing := 2;
  1633.   FImageIndex := -1;
  1634.   FDefaultCaptionFont := TFont.Create;
  1635.   FDefaultCaptionFont.OnChange := OnDefaultCaptionFontChange;
  1636.   FDefaultCaptionFont.Name := 'Arial';
  1637.   FDefaultCaptionFont.Height := 14;
  1638.   FDefaultCaptionHeight := 20;
  1639.   ActiveButton := -1;
  1640.   OldActiveButton := -1;
  1641.   CaptureButton := -1;
  1642.   FCaptionMode := False;
  1643.   FDefaultItemHeight := 20;
  1644.   TimerMode := 0;
  1645.   WaitMode := False;
  1646.   Font.Name := 'Arial';
  1647.   Font.Height := 14;
  1648.   Font.Color := clWindowText;
  1649.   Font.Style := [];
  1650.   ScrollBar := nil;
  1651.   ListBox := TbsCheckListBox.Create(Self);
  1652.   ListBox.SkinListBox := Self;
  1653.   ListBox.Style := lbOwnerDrawFixed;
  1654.   ListBox.ItemHeight := FDefaultItemHeight;
  1655.   ListBox.Parent := Self;
  1656.   ListBox.Visible := True;
  1657.   Height := 120;
  1658.   Width := 120;
  1659.   FSkinDataName := 'checklistbox';
  1660. end;
  1661. procedure TbsSkinCheckListBox.SetOnClickCheck(const Value: TNotifyEvent);
  1662. begin
  1663.   FOnClickCheck := Value;
  1664.   Listbox.OnClickCheck := Value;
  1665. end;
  1666.  
  1667. function TbsSkinCheckListBox.GetListBoxDragMode: TDragMode;
  1668. begin
  1669.   Result := ListBox.DragMode;
  1670. end;
  1671. procedure TbsSkinCheckListBox.SetListBoxDragMode(Value: TDragMode);
  1672. begin
  1673.   ListBox.DragMode := Value;
  1674. end;
  1675. function TbsSkinCheckListBox.GetListBoxDragKind: TDragKind;
  1676. begin
  1677.   Result := ListBox.DragKind;
  1678. end;
  1679. procedure TbsSkinCheckListBox.SetListBoxDragKind(Value: TDragKind);
  1680. begin
  1681.   ListBox.DragKind := Value;
  1682. end;
  1683. function TbsSkinCheckListBox.GetListBoxDragCursor: TCursor;
  1684. begin
  1685.   Result := ListBox.DragCursor;
  1686. end;
  1687. procedure TbsSkinCheckListBox.SetListBoxDragCursor(Value: TCursor);
  1688. begin
  1689.   ListBox.DragCursor := Value;
  1690. end;
  1691. function  TbsSkinCheckListBox.GetColumns;
  1692. begin
  1693.   Result := ListBox.Columns;
  1694. end;
  1695. procedure TbsSkinCheckListBox.SetColumns;
  1696. begin
  1697.   ListBox.Columns := Value;
  1698.   UpDateScrollBar;
  1699. end;
  1700. procedure TbsSkinCheckListBox.SetRowCount;
  1701. begin
  1702.   FRowCount := Value;
  1703.   if FRowCount <> 0
  1704.   then
  1705.     Height := Self.CalcHeight(FRowCount);
  1706. end;
  1707. procedure TbsSkinCheckListBox.SetImages(Value: TCustomImageList);
  1708. begin
  1709.   FImages := Value;
  1710.   ListBox.RePaint;
  1711. end;
  1712. procedure TbsSkinCheckListBox.SetImageIndex(Value: Integer);
  1713. begin
  1714.   FImageIndex := Value;
  1715.   ListBox.RePaint;
  1716. end;
  1717. procedure TbsSkinCheckListBox.SetNumGlyphs;
  1718. begin
  1719.   FNumGlyphs := Value;
  1720.   RePaint;
  1721. end;
  1722. procedure TbsSkinCheckListBox.SetGlyph;
  1723. begin
  1724.   FGlyph.Assign(Value);
  1725.   RePaint;
  1726. end;
  1727. procedure TbsSkinCheckListBox.SetSpacing;
  1728. begin
  1729.   FSpacing := Value;
  1730.   RePaint;
  1731. end;
  1732. procedure TbsSkinCheckListBox.Notification(AComponent: TComponent;
  1733.   Operation: TOperation);
  1734. begin
  1735.   inherited Notification(AComponent, Operation);
  1736.   if (Operation = opRemove) and (AComponent = Images) then
  1737.     Images := nil;
  1738. end;
  1739. procedure TbsSkinCheckListBox.OnDefaultCaptionFontChange;
  1740. begin
  1741.   if (FIndex = -1) and FCaptionMode then RePaint;
  1742. end;
  1743. procedure TbsSkinCheckListBox.SetDefaultCaptionHeight;
  1744. begin
  1745.   FDefaultCaptionHeight := Value;
  1746.   if (FIndex = -1) and FCaptionMode
  1747.   then
  1748.     begin
  1749.       CalcRects;
  1750.       RePaint;
  1751.     end;
  1752. end;
  1753. procedure TbsSkinCheckListBox.SetDefaultCaptionFont;
  1754. begin
  1755.   FDefaultCaptionFont.Assign(Value);
  1756. end;
  1757. procedure TbsSkinCheckListBox.StartTimer;
  1758. begin
  1759.   KillTimer(Handle, 1);
  1760.   SetTimer(Handle, 1, 100, nil);
  1761. end;
  1762. procedure TbsSkinCheckListBox.SetDefaultItemHeight;
  1763. begin
  1764.   FDefaultItemHeight := Value;
  1765.   if FIndex = -1
  1766.   then
  1767.     ListBox.ItemHeight := FDefaultItemHeight;
  1768. end;
  1769. procedure TbsSkinCheckListBox.StopTimer;
  1770. begin
  1771.   KillTimer(Handle, 1);
  1772.   TimerMode := 0;
  1773. end;
  1774. procedure TbsSkinCheckListBox.WMTimer;
  1775. begin
  1776.   inherited;
  1777.   if WaitMode
  1778.   then
  1779.     begin
  1780.       WaitMode := False;
  1781.       StartTimer;
  1782.       Exit;
  1783.     end;
  1784.   case TimerMode of
  1785.     1: if ItemIndex > 0 then ItemIndex := ItemIndex - 1;
  1786.     2: ItemIndex := ItemIndex + 1;
  1787.   end;
  1788. end;
  1789. procedure TbsSkinCheckListBox.CreateControlSkinImage;
  1790. var
  1791.   GX, GY, GlyphNum, TX, TY, i, OffX, OffY: Integer;
  1792. function GetGlyphTextWidth: Integer;
  1793. begin
  1794.   Result := B.Canvas.TextWidth(Caption);
  1795.   if not FGlyph.Empty then Result := Result + FGlyph.Width div FNumGlyphs + FSpacing;
  1796. end;
  1797. function CalcBRect(BR: TRect): TRect;
  1798. var
  1799.   R: TRect;
  1800. begin
  1801.   R := BR;
  1802.   if BR.Top <= LTPt.Y
  1803.   then
  1804.     begin
  1805.       if BR.Left > RTPt.X then OffsetRect(R, OffX, 0);
  1806.     end
  1807.   else
  1808.     begin
  1809.       OffsetRect(R, 0, OffY);
  1810.       if BR.Left > RBPt.X then OffsetRect(R, OffX, 0);
  1811.     end;
  1812.   Result := R;
  1813. end;
  1814. begin
  1815.   inherited;
  1816.   // calc rects
  1817.   OffX := Width - RectWidth(SkinRect);
  1818.   OffY := Height - RectHeight(SkinRect);
  1819.   NewClRect := ClRect;
  1820.   Inc(NewClRect.Right, OffX);
  1821.   Inc(NewClRect.Bottom, OffY);
  1822.   if FCaptionMode
  1823.   then
  1824.     begin
  1825.       NewCaptionRect := CaptionRect;
  1826.       if CaptionRect.Right >= RTPt.X
  1827.       then
  1828.         Inc(NewCaptionRect.Right, OffX);
  1829.       Buttons[0].R := CalcBRect(UpButtonRect);
  1830.       Buttons[1].R := CalcBRect(DownButtonRect);
  1831.       Buttons[2].R := CalcBRect(CheckButtonRect);
  1832.     end;  
  1833.   // paint caption
  1834.   if not IsNullRect(CaptionRect)
  1835.   then
  1836.     with B.Canvas do
  1837.     begin
  1838.       Font.Name := CaptionFontName;
  1839.       Font.Height := CaptionFontHeight;
  1840.       Font.Color := CaptionFontColor;
  1841.       Font.Style := CaptionFontStyle;
  1842.       Font.CharSet := DefaultCaptionFont.CharSet;
  1843.       TY := NewCaptionRect.Top + RectHeight(NewCaptionRect) div 2 -
  1844.             TextHeight(Caption) div 2;
  1845.       TX := NewCaptionRect.Left + 2;
  1846.       case Alignment of
  1847.         taCenter: TX := TX + RectWidth(NewCaptionRect) div 2 - GetGlyphTextWidth div 2;
  1848.         taRightJustify: TX := NewCaptionRect.Right - GetGlyphTextWidth - 2;
  1849.       end;
  1850.       Brush.Style := bsClear;
  1851.       if not FGlyph.Empty
  1852.       then
  1853.       begin
  1854.         GY := NewCaptionRect.Top + RectHeight(NewCaptionRect) div 2 - FGlyph.Height div 2;
  1855.         GX := TX;
  1856.         TX := GX + FGlyph.Width div FNumGlyphs + FSpacing;
  1857.         GlyphNum := 1;
  1858.         if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  1859.        end;
  1860.       TextRect(NewCaptionRect, TX, TY, Caption);
  1861.       if not FGlyph.Empty
  1862.       then DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  1863.     end;
  1864.   // paint buttons
  1865.   for i := 0 to 2 do DrawButton(B.Canvas, i);
  1866. end;
  1867. procedure TbsSkinCheckListBox.CreateControlDefaultImage;
  1868. function GetGlyphTextWidth: Integer;
  1869. begin
  1870.   Result := B.Canvas.TextWidth(Caption);
  1871.   if not FGlyph.Empty then Result := Result + FGlyph.Width div FNumGlyphs + FSpacing;
  1872. end;
  1873. var
  1874.   BW, i, TX, TY: Integer;
  1875.   R: TRect;
  1876.   GX, GY: Integer;
  1877.   GlyphNum: Integer;
  1878. begin
  1879.   inherited;
  1880.   if FCaptionMode
  1881.   then
  1882.     begin
  1883.       BW := 17;
  1884.       if BW > FDefaultCaptionHeight - 3 then BW := FDefaultCaptionHeight - 3;
  1885.       Buttons[0].R := Rect(Width - BW - 2, 2, Width - 2, 1 + BW);
  1886.       Buttons[1].R := Rect(Buttons[0].R.Left - BW, 2, Buttons[0].R.Left, 1 + BW);
  1887.       Buttons[2].R := Rect(Buttons[1].R.Left - BW, 2, Buttons[1].R.Left, 1 + BW);
  1888.     end;  
  1889.   R := ClientRect;
  1890.   Frame3D(B.Canvas, R, clBtnShadow, clBtnShadow, 1);
  1891.   if FCaptionMode
  1892.   then
  1893.     with B.Canvas do
  1894.     begin
  1895.       R := Rect(3, 2, Width - BW * 3 - 3, FDefaultCaptionHeight - 2);
  1896.       Font.Assign(FDefaultCaptionFont);
  1897.       case Alignment of
  1898.         taLeftJustify: TX := R.Left;
  1899.         taCenter: TX := R.Left + RectWidth(R) div 2 - GetGlyphTextWidth div 2;
  1900.         taRightJustify: TX := R.Right - GetGlyphTextWidth;
  1901.       end;
  1902.       TY := (FDefaultCaptionHeight - 2) div 2 - TextHeight(Caption) div 2;
  1903.       if not FGlyph.Empty
  1904.       then
  1905.         begin
  1906.           GY := R.Top + RectHeight(R) div 2 - FGlyph.Height div 2 - 1;
  1907.           GX := TX;
  1908.           if FNumGlyphs = 0 then FNumGlyphs := 1; 
  1909.           TX := GX + FGlyph.Width div FNumGlyphs + FSpacing;
  1910.           GlyphNum := 1;
  1911.           if not Enabled and (NumGlyphs = 2) then GlyphNum := 2;
  1912.         end;
  1913.       TextRect(R, TX, TY, Caption);
  1914.       if not FGlyph.Empty
  1915.       then DrawGlyph(B.Canvas, GX, GY, FGlyph, NumGlyphs, GlyphNum);
  1916.       Pen.Color := clBtnShadow;
  1917.       MoveTo(1, FDefaultCaptionHeight - 1); LineTo(Width - 1, FDefaultCaptionHeight - 1);
  1918.       for i := 0 to 2 do DrawButton(B.Canvas, i);
  1919.     end;
  1920. end;
  1921. procedure TbsSkinCheckListBox.CMMouseEnter;
  1922. begin
  1923.   inherited;
  1924.   if FCaptionMode
  1925.   then
  1926.     TestActive(-1, -1);
  1927. end;
  1928. procedure TbsSkinCheckListBox.CMMouseLeave;
  1929. var
  1930.   i: Integer;
  1931. begin
  1932.   inherited;
  1933.   if FCaptionMode
  1934.   then
  1935.   for i := 0 to 1 do
  1936.     if Buttons[i].MouseIn
  1937.     then
  1938.        begin
  1939.          Buttons[i].MouseIn := False;
  1940.          RePaint;
  1941.        end;
  1942. end;
  1943. procedure TbsSkinCheckListBox.MouseDown;
  1944. begin
  1945.   if FCaptionMode
  1946.   then
  1947.     begin
  1948.       TestActive(X, Y);
  1949.       if ActiveButton <> -1
  1950.       then
  1951.         begin
  1952.           CaptureButton := ActiveButton;
  1953.           ButtonDown(ActiveButton, X, Y);
  1954.       end;
  1955.     end;
  1956.   inherited;
  1957. end;
  1958. procedure TbsSkinCheckListBox.MouseUp;
  1959. begin
  1960.   if FCaptionMode
  1961.   then
  1962.     begin
  1963.       if CaptureButton <> -1
  1964.       then ButtonUp(CaptureButton, X, Y);
  1965.       CaptureButton := -1;
  1966.     end;  
  1967.   inherited;
  1968. end;
  1969. procedure TbsSkinCheckListBox.MouseMove;
  1970. begin
  1971.   inherited;
  1972.   if FCaptionMode then TestActive(X, Y);
  1973. end;
  1974. procedure TbsSkinCheckListBox.TestActive(X, Y: Integer);
  1975. var
  1976.   i, j: Integer;
  1977. begin
  1978.   if (FIndex <> -1) and IsNullRect(UpButtonRect) and IsNullRect(DownButtonRect)
  1979.   then Exit; 
  1980.   j := -1;
  1981.   OldActiveButton := ActiveButton;
  1982.   for i := 0 to 2 do
  1983.   begin
  1984.     if PtInRect(Buttons[i].R, Point(X, Y))
  1985.     then
  1986.       begin
  1987.         j := i;
  1988.         Break;
  1989.       end;
  1990.   end;
  1991.   ActiveButton := j;
  1992.   if (CaptureButton <> -1) and
  1993.      (ActiveButton <> CaptureButton) and (ActiveButton <> -1)
  1994.   then
  1995.     ActiveButton := -1;
  1996.   if (OldActiveButton <> ActiveButton)
  1997.   then
  1998.     begin
  1999.       if OldActiveButton <> - 1
  2000.       then
  2001.         ButtonLeave(OldActiveButton);
  2002.       if ActiveButton <> -1
  2003.       then
  2004.         ButtonEnter(ActiveButton);
  2005.     end;
  2006. end;
  2007. procedure TbsSkinCheckListBox.ButtonDown;
  2008. begin
  2009.   Buttons[i].MouseIn := True;
  2010.   Buttons[i].Down := True;
  2011.   DrawButton(Canvas, i);
  2012.   case i of
  2013.     0: if Assigned(FOnUpButtonClick) then Exit;
  2014.     1: if Assigned(FOnDownButtonClick) then Exit;
  2015.     2: if Assigned(FOnCheckButtonClick) then Exit;
  2016.   end;
  2017.   TimerMode := 0;
  2018.   case i of
  2019.     0: TimerMode := 1;
  2020.     1: TimerMode := 2;
  2021.   end;
  2022.   if TimerMode <> 0
  2023.   then
  2024.     begin
  2025.       WaitMode := True;
  2026.       SetTimer(Handle, 1, 500, nil);
  2027.     end;
  2028. end;
  2029. procedure TbsSkinCheckListBox.ButtonUp;
  2030. begin
  2031.   Buttons[i].Down := False;
  2032.   if ActiveButton <> i then Buttons[i].MouseIn := False;
  2033.   DrawButton(Canvas, i);
  2034.   if Buttons[i].MouseIn
  2035.   then
  2036.   case i of
  2037.     0:
  2038.       if Assigned(FOnUpButtonClick)
  2039.       then
  2040.         begin
  2041.           FOnUpButtonClick(Self);
  2042.           Exit;
  2043.         end;
  2044.     1:
  2045.       if Assigned(FOnDownButtonClick)
  2046.       then
  2047.         begin
  2048.           FOnDownButtonClick(Self);
  2049.           Exit;
  2050.         end;
  2051.     2:
  2052.       if Assigned(FOnCheckButtonClick)
  2053.       then
  2054.         begin
  2055.           FOnCheckButtonClick(Self);
  2056.           Exit;
  2057.         end;
  2058.   end;
  2059.   case i of
  2060.     1: ItemIndex := ItemIndex + 1;
  2061.     0: if ItemIndex > 0 then ItemIndex := ItemIndex - 1;
  2062.     2: if ItemIndex > -1
  2063.        then
  2064.          begin
  2065.            Checked[ItemIndex] := not Checked[ListBox.ItemIndex];
  2066.            ListBoxOnClickCheck(Self);
  2067.         end;
  2068.   end;
  2069.   if TimerMode <> 0 then StopTimer;
  2070. end;
  2071. procedure TbsSkinCheckListBox.ButtonEnter(I: Integer);
  2072. begin
  2073.   Buttons[i].MouseIn := True;
  2074.   DrawButton(Canvas, i);
  2075.   if (TimerMode <> 0) and Buttons[i].Down
  2076.   then SetTimer(Handle, 1, 50, nil);
  2077. end;
  2078. procedure TbsSkinCheckListBox.ButtonLeave(I: Integer);
  2079. begin
  2080.   Buttons[i].MouseIn := False;
  2081.   DrawButton(Canvas, i);
  2082.   if (TimerMode <> 0) and Buttons[i].Down
  2083.   then KillTimer(Handle, 1);
  2084. end;
  2085. procedure TbsSkinCheckListBox.CMTextChanged;
  2086. begin
  2087.   inherited;
  2088.   if FCaptionMode then RePaint;
  2089. end;
  2090. procedure TbsSkinCheckListBox.SetAlignment(Value: TAlignment);
  2091. begin
  2092.   if FAlignment <> Value
  2093.   then
  2094.     begin
  2095.       FAlignment := Value;
  2096.       if FCaptionMode then RePaint;
  2097.     end;
  2098. end;
  2099. procedure TbsSkinCheckListBox.DrawButton;
  2100. var
  2101.   C: TColor;
  2102.   kf: Double;
  2103.   R1: TRect;
  2104. begin
  2105.   if FIndex = -1
  2106.   then
  2107.     with Buttons[i] do
  2108.     begin
  2109.       R1 := R;
  2110.       if Down and MouseIn
  2111.       then
  2112.         begin
  2113.           Frame3D(Cnvs, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2114.           Cnvs.Brush.Color := BS_XP_BTNDOWNCOLOR;
  2115.           Cnvs.FillRect(R1);
  2116.         end
  2117.       else
  2118.         if MouseIn
  2119.         then
  2120.           begin
  2121.             Frame3D(Cnvs, R1, BS_XP_BTNFRAMECOLOR, BS_XP_BTNFRAMECOLOR, 1);
  2122.             Cnvs.Brush.Color := BS_XP_BTNACTIVECOLOR;
  2123.             Cnvs.FillRect(R1);
  2124.           end
  2125.         else
  2126.           begin
  2127.             Cnvs.Brush.Color := clBtnFace;
  2128.             Cnvs.FillRect(R1);
  2129.           end;
  2130.       C := clBlack;
  2131.       case i of
  2132.         0: DrawArrowImage(Cnvs, R, C, 3);
  2133.         1: DrawArrowImage(Cnvs, R, C, 4);
  2134.         2: DrawCheckImage(Cnvs, R.Left + 4, R.Top + 4, C);
  2135.       end;
  2136.     end
  2137.   else
  2138.     with Buttons[i] do
  2139.     if not IsNullRect(R) then
  2140.     begin
  2141.       R1 := NullRect;
  2142.       case I of
  2143.         0:
  2144.           begin
  2145.             if Down and MouseIn
  2146.             then R1 := DownUpButtonRect
  2147.             else if MouseIn then R1 := ActiveUpButtonRect;
  2148.           end;
  2149.         1:
  2150.           begin
  2151.             if Down and MouseIn
  2152.             then R1 := DownDownButtonRect
  2153.             else if MouseIn then R1 := ActiveDownButtonRect;
  2154.           end;
  2155.         2: begin
  2156.             if Down and MouseIn
  2157.             then R1 := DownCheckButtonRect
  2158.             else if MouseIn then R1 := ActiveCheckButtonRect;
  2159.            end;
  2160.       end;
  2161.       if not IsNullRect(R1)
  2162.       then
  2163.         Cnvs.CopyRect(R, Picture.Canvas, R1)
  2164.       else
  2165.         begin
  2166.           case I of
  2167.             0: R1 := UpButtonRect;
  2168.             1: R1 := DownButtonRect;
  2169.             2: R1 := CheckButtonRect;
  2170.           end;
  2171.           OffsetRect(R1, SkinRect.Left, SkinRect.Top);
  2172.           Cnvs.CopyRect(R, Picture.Canvas, R1);
  2173.         end;
  2174.     end;
  2175. end;
  2176. procedure TbsSkinCheckListBox.SetCaptionMode;
  2177. begin
  2178.   FCaptionMode := Value;
  2179.   if FIndex = -1
  2180.   then
  2181.     begin
  2182.       CalcRects;
  2183.       RePaint;
  2184.     end;
  2185. end;
  2186. procedure TbsSkinCheckListBox.ListBoxOnClickCheck(Sender: TObject);
  2187. begin
  2188.   if Assigned(FOnClickCheck) then FOnClickCheck(Self);
  2189. end;
  2190. procedure TbsSkinCheckListBox.SetChecked;
  2191. begin
  2192.   ListBox.Checked[Index] := Checked;
  2193. end;
  2194. function TbsSkinCheckListBox.GetChecked;
  2195. begin
  2196.   Result := ListBox.Checked[Index];
  2197. end;
  2198. procedure TbsSkinCheckListBox.SetState;
  2199. begin
  2200.   ListBox.State[Index] := AState;
  2201. end;
  2202. function TbsSkinCheckListBox.GetState;
  2203. begin
  2204.   Result := ListBox.State[Index];
  2205. end;
  2206. function TbsSkinCheckListBox.CalcHeight;
  2207. begin
  2208.   if FIndex = -1
  2209.   then
  2210.     Result := AitemsCount * ListBox.ItemHeight + 4
  2211.   else
  2212.     Result := ClRect.Top + AitemsCount * ListBox.ItemHeight +
  2213.               RectHeight(SkinRect) - ClRect.Bottom;
  2214. end;
  2215. procedure TbsSkinCheckListBox.Clear;
  2216. begin
  2217.   ListBox.Clear;
  2218. end;
  2219. function TbsSkinCheckListBox.ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;
  2220. begin
  2221.   Result := ListBox.ItemAtPos(Pos, Existing);
  2222. end;
  2223. function TbsSkinCheckListBox.ItemRect(Item: Integer): TRect;
  2224. begin
  2225.   Result := ListBox.ItemRect(Item);
  2226. end;
  2227. function TbsSkinCheckListBox.GetListBoxPopupMenu;
  2228. begin
  2229.   Result := ListBox.PopupMenu;
  2230. end;
  2231. procedure TbsSkinCheckListBox.SetListBoxPopupMenu;
  2232. begin
  2233.   ListBox.PopupMenu := Value;
  2234. end;
  2235. function TbsSkinCheckListBox.GetCanvas: TCanvas;
  2236. begin
  2237.   Result := ListBox.Canvas;
  2238. end;
  2239. function TbsSkinCheckListBox.GetExtandedSelect: Boolean;
  2240. begin
  2241.   Result := ListBox.ExtendedSelect;
  2242. end;
  2243. procedure TbsSkinCheckListBox.SetExtandedSelect(Value: Boolean);
  2244. begin
  2245.   ListBox.ExtendedSelect := Value;
  2246. end;
  2247. function TbsSkinCheckListBox.GetSelCount: Integer;
  2248. begin
  2249.   Result := ListBox.SelCount;
  2250. end;
  2251. function TbsSkinCheckListBox.GetSelected(Index: Integer): Boolean;
  2252. begin
  2253.   Result := ListBox.Selected[Index];
  2254. end;
  2255. procedure TbsSkinCheckListBox.SetSelected(Index: Integer; Value: Boolean);
  2256. begin
  2257.   ListBox.Selected[Index] := Value;
  2258. end;
  2259. function TbsSkinCheckListBox.GetSorted: Boolean;
  2260. begin
  2261.   Result := ListBox.Sorted;
  2262. end;
  2263. procedure TbsSkinCheckListBox.SetSorted(Value: Boolean);
  2264. begin
  2265.   ListBox.Sorted := Value;
  2266. end;
  2267. function TbsSkinCheckListBox.GetTopIndex: Integer;
  2268. begin
  2269.   Result := ListBox.TopIndex;
  2270. end;
  2271. procedure TbsSkinCheckListBox.SetTopIndex(Value: Integer);
  2272. begin
  2273.   ListBox.TopIndex := Value;
  2274. end;
  2275. function TbsSkinCheckListBox.GetMultiSelect: Boolean;
  2276. begin
  2277.   Result := ListBox.MultiSelect;
  2278. end;
  2279. procedure TbsSkinCheckListBox.SetMultiSelect(Value: Boolean);
  2280. begin
  2281.   ListBox.MultiSelect := Value;
  2282. end;
  2283. function TbsSkinCheckListBox.GetListBoxFont: TFont;
  2284. begin
  2285.   Result := ListBox.Font;
  2286. end;
  2287. procedure TbsSkinCheckListBox.SetListBoxFont(Value: TFont);
  2288. begin
  2289.   ListBox.Font.Assign(Value);
  2290. end;
  2291. function TbsSkinCheckListBox.GetListBoxTabOrder: TTabOrder;
  2292. begin
  2293.   Result := ListBox.TabOrder;
  2294. end;
  2295. procedure TbsSkinCheckListBox.SetListBoxTabOrder(Value: TTabOrder);
  2296. begin
  2297.   ListBox.TabOrder := Value;
  2298. end;
  2299. function TbsSkinCheckListBox.GetListBoxTabStop: Boolean;
  2300. begin
  2301.   Result := ListBox.TabStop;
  2302. end;
  2303. procedure TbsSkinCheckListBox.SetListBoxTabStop(Value: Boolean);
  2304. begin
  2305.   ListBox.TabStop := Value;
  2306. end;
  2307. procedure TbsSkinCheckListBox.ShowScrollBar;
  2308. begin
  2309.   ScrollBar := TbsSkinScrollBar.Create(Self);
  2310.   with ScrollBar do
  2311.   begin
  2312.     if Columns > 0
  2313.     then
  2314.       Kind := sbHorizontal
  2315.     else
  2316.       Kind := sbVertical;
  2317.     Height := 100;
  2318.     Width := 20;
  2319.     Parent := Self;
  2320.     PageSize := 0;
  2321.     Min := 0;
  2322.     Position := 0;
  2323.     OnChange := SBChange;
  2324.     if Self.FIndex = -1
  2325.     then
  2326.       SkinDataName := ''
  2327.     else
  2328.       if Columns > 0
  2329.       then
  2330.         SkinDataName := HScrollBarName
  2331.       else
  2332.         SkinDataName := VScrollBarName;
  2333.     SkinData := Self.SkinData;
  2334.     CalcRects;
  2335.     Parent := Self;
  2336.     Visible := True;
  2337.   end;
  2338.   RePaint;
  2339. end;
  2340. procedure TbsSkinCheckListBox.ListBoxEnter;
  2341. begin
  2342. end;
  2343. procedure TbsSkinCheckListBox.ListBoxExit;
  2344. begin
  2345. end;
  2346. procedure TbsSkinCheckListBox.ListBoxKeyDown;
  2347. begin
  2348.   if Assigned(FOnListBoxKeyDown) then FOnListBoxKeyDown(Self, Key, Shift);
  2349. end;
  2350. procedure TbsSkinCheckListBox.ListBoxKeyUp;
  2351. begin
  2352.   if Assigned(FOnListBoxKeyUp) then FOnListBoxKeyUp(Self, Key, Shift);
  2353. end;
  2354. procedure TbsSkinCheckListBox.ListBoxKeyPress;
  2355. begin
  2356.   if Assigned(FOnListBoxKeyPress) then FOnListBoxKeyPress(Self, Key);
  2357. end;
  2358. procedure TbsSkinCheckListBox.ListBoxDblClick;
  2359. begin
  2360.   if Assigned(FOnListBoxDblClick) then FOnListBoxDblClick(Self);
  2361. end;
  2362. procedure TbsSkinCheckListBox.ListBoxClick;
  2363. begin
  2364.   if Assigned(FOnListBoxClick) then FOnListBoxClick(Self);
  2365. end;
  2366. procedure TbsSkinCheckListBox.ListBoxMouseDown;
  2367. begin
  2368.   if Assigned(FOnListBoxMouseDown) then FOnListBoxMouseDown(Self, Button, Shift, X, Y);
  2369. end;
  2370. procedure TbsSkinCheckListBox.ListBoxMouseMove;
  2371. begin
  2372.   if Assigned(FOnListBoxMouseMove) then FOnListBoxMouseMove(Self, Shift, X, Y);
  2373. end;
  2374. procedure TbsSkinCheckListBox.ListBoxMouseUp;
  2375. begin
  2376.   if Assigned(FOnListBoxMouseUp) then FOnListBoxMouseUp(Self, Button, Shift, X, Y);
  2377. end;
  2378. procedure TbsSkinCheckListBox.HideScrollBar;
  2379. begin
  2380.   ScrollBar.Visible := False;
  2381.   ScrollBar.Free;
  2382.   ScrollBar := nil;
  2383.   CalcRects;
  2384. end;
  2385. procedure TbsSkinCheckListBox.CreateParams(var Params: TCreateParams);
  2386. begin
  2387.   inherited CreateParams(Params);
  2388.   with Params do
  2389.   begin
  2390.     WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
  2391.   end;
  2392. end;
  2393. procedure TbsSkinCheckListBox.SBChange;
  2394. var
  2395.   LParam, WParam: Integer;
  2396. begin
  2397.   LParam := 0;
  2398.   WParam := MakeWParam(SB_THUMBPOSITION, ScrollBar.Position);
  2399.   if Columns > 0
  2400.   then
  2401.     SendMessage(ListBox.Handle, WM_HSCROLL, WParam, LParam)
  2402.   else
  2403.     SendMessage(ListBox.Handle, WM_VSCROLL, WParam, LParam);
  2404. end;
  2405. function TbsSkinCheckListBox.GetItemIndex;
  2406. begin
  2407.   Result := ListBox.ItemIndex;
  2408. end;
  2409. procedure TbsSkinCheckListBox.SetItemIndex;
  2410. begin
  2411.   ListBox.ItemIndex := Value;
  2412. end;
  2413. procedure TbsSkinCheckListBox.SetItems;
  2414. begin
  2415.   ListBox.Items.Assign(Value);
  2416.   UpDateScrollBar;
  2417. end;
  2418. function TbsSkinCheckListBox.GetItems;
  2419. begin
  2420.   Result := ListBox.Items;
  2421. end;
  2422. destructor TbsSkinCheckListBox.Destroy;
  2423. begin
  2424.   if ScrollBar <> nil then ScrollBar.Free;
  2425.   if ListBox <> nil then ListBox.Free;
  2426.   FDefaultCaptionFont.Free;
  2427.   FGlyph.Free;
  2428.   inherited;
  2429. end;
  2430. procedure TbsSkinCheckListBox.CalcRects;
  2431. var
  2432.   LTop: Integer;
  2433.   OffX, OffY: Integer;
  2434. begin
  2435.   if FIndex <> -1
  2436.   then
  2437.     begin
  2438.       OffX := Width - RectWidth(SkinRect);
  2439.       OffY := Height - RectHeight(SkinRect);
  2440.       NewClRect := ClRect;
  2441.       Inc(NewClRect.Right, OffX);
  2442.       Inc(NewClRect.Bottom, OffY);
  2443.     end
  2444.   else
  2445.     if FCaptionMode
  2446.     then
  2447.       LTop := FDefaultCaptionHeight
  2448.     else
  2449.       LTop := 1;
  2450.   if (ScrollBar <> nil) and ScrollBar.Visible
  2451.   then
  2452.     begin
  2453.       if FIndex = -1
  2454.       then
  2455.         begin
  2456.           if Columns > 0
  2457.           then
  2458.             begin
  2459.               ScrollBar.SetBounds(1, Height - 20, Width - 2, 19);
  2460.               ListRect := Rect(2, LTop + 1, Width - 2, ScrollBar.Top);
  2461.             end
  2462.           else
  2463.             begin
  2464.               ScrollBar.SetBounds(Width - 20, LTop, 19, Height - 1 - LTop);
  2465.               ListRect := Rect(2, LTop + 1, ScrollBar.Left, Height - 2);
  2466.             end;
  2467.         end
  2468.       else
  2469.         begin
  2470.           if Columns > 0
  2471.           then
  2472.             begin
  2473.               ScrollBar.SetBounds(NewClRect.Left,
  2474.                 NewClRect.Bottom - ScrollBar.Height,
  2475.                 RectWidth(NewClRect), ScrollBar.Height);
  2476.               ListRect := NewClRect;
  2477.               Dec(ListRect.Bottom, ScrollBar.Height);
  2478.             end
  2479.           else
  2480.             begin
  2481.               ScrollBar.SetBounds(NewClRect.Right - ScrollBar.Width,
  2482.                 NewClRect.Top, ScrollBar.Width, RectHeight(NewClRect));
  2483.               ListRect := NewClRect;
  2484.               Dec(ListRect.Right, ScrollBar.Width);
  2485.             end;
  2486.         end;
  2487.     end
  2488.   else
  2489.     begin
  2490.       if FIndex = -1
  2491.       then
  2492.         ListRect := Rect(2, LTop + 1, Width - 2, Height - 2)
  2493.       else
  2494.         ListRect := NewClRect;
  2495.     end;
  2496.   if ListBox <> nil
  2497.   then
  2498.     ListBox.SetBounds(ListRect.Left, ListRect.Top,
  2499.       RectWidth(ListRect), RectHeight(ListRect));
  2500. end;
  2501. procedure TbsSkinCheckListBox.GetSkinData;
  2502. begin
  2503.   inherited;
  2504.   if FIndex <> -1
  2505.   then
  2506.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinListBox
  2507.     then
  2508.       with TbsDataSkinCheckListBox(FSD.CtrlList.Items[FIndex]) do
  2509.       begin
  2510.         Self.FontName := FontName;
  2511.         Self.FontStyle := FontStyle;
  2512.         Self.FontHeight := FontHeight;
  2513.         Self.SItemRect := SItemRect;
  2514.         Self.ActiveItemRect := ActiveItemRect;
  2515.         if isNullRect(ActiveItemRect)
  2516.         then
  2517.           Self.ActiveItemRect := SItemRect;
  2518.         Self.FocusItemRect := FocusItemRect;
  2519.         if isNullRect(FocusItemRect)
  2520.         then
  2521.           Self.FocusItemRect := SItemRect;
  2522.         Self.UnCheckImageRect := UnCheckImageRect;
  2523.         Self.CheckImageRect := CheckImageRect;
  2524.         Self.ItemLeftOffset := ItemLeftOffset;
  2525.         Self.ItemRightOffset := ItemRightOffset;
  2526.         Self.ItemTextRect := ItemTextRect;
  2527.         Self.ItemCheckRect := ItemCheckRect;
  2528.         Self.FontColor := FontColor;
  2529.         Self.ActiveFontColor := ActiveFontColor;
  2530.         Self.FocusFontColor := FocusFontColor;
  2531.         Self.VScrollBarName := VScrollBarName;
  2532.         Self.HScrollBarName := HScrollBarName;
  2533.         Self.CaptionRect := CaptionRect;
  2534.         Self.CaptionFontName := CaptionFontName;
  2535.         Self.CaptionFontStyle := CaptionFontStyle;
  2536.         Self.CaptionFontHeight := CaptionFontHeight;
  2537.         Self.CaptionFontColor := CaptionFontColor;
  2538.         Self.UpButtonRect := UpButtonRect;
  2539.         Self.ActiveUpButtonRect := ActiveUpButtonRect;
  2540.         Self.DownUpButtonRect := DownUpButtonRect;
  2541.         if IsNullRect(Self.DownUpButtonRect)
  2542.         then Self.DownUpButtonRect := Self.ActiveUpButtonRect;
  2543.         Self.DownButtonRect := DownButtonRect;
  2544.         Self.ActiveDownButtonRect := ActiveDownButtonRect;
  2545.         Self.DownDownButtonRect := DownDownButtonRect;
  2546.         if IsNullRect(Self.DownDownButtonRect)
  2547.         then Self.DownDownButtonRect := Self.ActiveDownButtonRect;
  2548.         Self.CheckButtonRect := CheckButtonRect;
  2549.         Self.ActiveCheckButtonRect := ActiveCheckButtonRect;
  2550.         Self.DownCheckButtonRect := DownCheckButtonRect;
  2551.         if IsNullRect(Self.DownCheckButtonRect)
  2552.         then Self.DownCheckButtonRect := Self.ActiveCheckButtonRect;
  2553.       end;
  2554. end;
  2555. procedure TbsSkinCheckListBox.ChangeSkinData;
  2556. begin
  2557.   inherited;
  2558.   //
  2559.   if FIndex <> -1
  2560.   then
  2561.     ListBox.ItemHeight := RectHeight(sItemRect)
  2562.   else
  2563.     begin
  2564.       ListBox.ItemHeight := FDefaultItemHeight;
  2565.       Font.Assign(FDefaultFont);
  2566.     end;
  2567.   if ScrollBar <> nil
  2568.   then
  2569.     with ScrollBar do
  2570.     begin
  2571.       if Self.FIndex = -1
  2572.       then
  2573.         SkinDataName := ''
  2574.       else
  2575.         if Columns > 0
  2576.         then
  2577.           SkinDataName := HScrollBarName
  2578.         else
  2579.           SkinDataName := VScrollBarName;
  2580.       SkinData := Self.SkinData;
  2581.     end;
  2582.   if FRowCount <> 0
  2583.   then
  2584.     Height := Self.CalcHeight(FRowCount);
  2585.   CalcRects;
  2586.   UpDateScrollBar;
  2587.   ListBox.RePaint;
  2588. end;
  2589. procedure TbsSkinCheckListBox.WMSIZE;
  2590. begin
  2591.   inherited;
  2592.   CalcRects;
  2593.   UpDateScrollBar;
  2594.   if ScrollBar <> nil then ScrollBar.Repaint;
  2595. end;
  2596. procedure TbsSkinCheckListBox.SetBounds;
  2597. begin
  2598.   inherited;
  2599.   if FIndex = -1 then RePaint;
  2600. end;
  2601. procedure TbsSkinCheckListBox.UpDateScrollBar;
  2602. var
  2603.   Min, Max, Pos, Page: Integer;
  2604. begin
  2605.   if (ListBox = nil) or ((FRowCount > 0) and (RowCount = Items.Count))
  2606.   then Exit;
  2607.   if Columns > 0
  2608.   then
  2609.     begin
  2610.       GetScrollRange(ListBox.Handle, SB_HORZ, Min, Max);
  2611.       Pos := GetScrollPos(ListBox.Handle, SB_HORZ);
  2612.       Page := ListBox.Columns;
  2613.       if (Max > Min) and (Pos <= Max) and (Page <= Max)
  2614.       then
  2615.         begin
  2616.           if ScrollBar = nil
  2617.           then ShowScrollBar;
  2618.           ScrollBar.SetRange(Min, Max, Pos, Page);
  2619.         end
  2620.      else
  2621.        if (ScrollBar <> nil) and (ScrollBar.Visible) then HideScrollBar;
  2622.     end
  2623.   else
  2624.     begin
  2625.       if not ((FRowCount > 0) and (RowCount = Items.Count))
  2626.       then
  2627.         begin
  2628.           GetScrollRange(ListBox.Handle, SB_VERT, Min, Max);
  2629.           Pos := GetScrollPos(ListBox.Handle, SB_VERT);
  2630.           Page := ListBox.Height div ListBox.ItemHeight;
  2631.           if (Max > Min) and (Pos <= Max) and (Page < Items.Count)
  2632.           then
  2633.             begin
  2634.               if ScrollBar = nil then ShowScrollBar;
  2635.               ScrollBar.SetRange(Min, Max, Pos, Page);
  2636.             end
  2637.           else
  2638.             if (ScrollBar <> nil) and ScrollBar.Visible then HideScrollBar;
  2639.         end
  2640.       else
  2641.         if (ScrollBar <> nil) and ScrollBar.Visible then HideScrollBar;
  2642.     end;
  2643. end;
  2644. constructor TbsSkinScrollBox.Create(AOwner: TComponent);
  2645. begin
  2646.   inherited;
  2647.   ControlStyle := ControlStyle + [csAcceptsControls];
  2648.   FInCheckScrollBars := False;
  2649.   FVSizeOffset := 0;
  2650.   FHSizeOffset := 0;
  2651.   FVScrollBar := nil;
  2652.   FHScrollBar := nil;
  2653.   FOldVScrollBarPos := 0;
  2654.   FOldHScrollBarPos := 0;
  2655.   FDown := False;
  2656.   FSkinDataName := 'scrollbox';
  2657.   BGPictureIndex := -1;
  2658.   Width := 150;
  2659.   Height := 150;
  2660. end;
  2661. destructor TbsSkinScrollBox.Destroy;
  2662. begin
  2663.   inherited;
  2664. end;
  2665. procedure TbsSkinScrollBox.UpDateScrollRange;
  2666. begin
  2667.   GetHRange;
  2668.   GetVRange;
  2669. end;
  2670. procedure TbsSkinScrollBox.CMVisibleChanged;
  2671. begin
  2672.   inherited;
  2673.   if FVScrollBar <> nil then FVScrollBar.Visible := Self.Visible;
  2674.   if FHScrollBar <> nil then FHScrollBar.Visible := Self.Visible;
  2675. end;
  2676. procedure TbsSkinScrollBox.OnHScrollBarChange(Sender: TObject);
  2677. begin
  2678.   HScrollControls(FHScrollBar.Position - FOldHScrollBarPos);
  2679.   FOldHScrollBarPos := HScrollBar.Position;
  2680. end;
  2681. procedure TbsSkinScrollBox.OnVScrollBarChange(Sender: TObject);
  2682. begin
  2683.   VScrollControls(FVScrollBar.Position - FOldVScrollBarPos);
  2684.   FOldVScrollBarPos := VScrollBar.Position;
  2685. end;
  2686. procedure TbsSkinScrollBox.OnHScrollBarLastChange(Sender: TObject);
  2687. begin
  2688.   Invalidate;
  2689. end;
  2690. procedure TbsSkinScrollBox.OnVScrollBarLastChange(Sender: TObject);
  2691. begin
  2692.   Invalidate;
  2693. end;
  2694. procedure TbsSkinScrollBox.ChangeSkinData;
  2695. begin
  2696.   inherited;
  2697.   ReCreateWnd;
  2698.   if FVScrollBar <> nil then FVScrollBar.Align := FVScrollBar.Align;
  2699.   if FHScrollBar <> nil then FHScrollBar.Align := FHScrollBar.Align;
  2700. end;
  2701. procedure TbsSkinScrollBox.HScroll;
  2702. begin
  2703.   if (FHScrollBar <> nil) and (FHScrollBar.PageSize <> 0)
  2704.   then
  2705.     with FHScrollBar do
  2706.     begin
  2707.       HScrollControls(APosition - Position);
  2708.       Position := APosition;
  2709.     end;
  2710. end;
  2711. procedure TbsSkinScrollBox.VScroll;
  2712. begin
  2713.   if (FVScrollBar <> nil) and (FVScrollBar.PageSize <> 0)
  2714.   then
  2715.     with FVScrollBar do
  2716.     begin
  2717.       if APosition > Max - PageSize then APosition := Max - PageSize;
  2718.       VScrollControls(APosition - Position);
  2719.       Position := APosition;
  2720.     end;
  2721. end;
  2722. procedure TbsSkinScrollBox.SetBorderStyle;
  2723. begin
  2724.   FBorderStyle := Value;
  2725.   ReCreateWnd;
  2726. end;
  2727. procedure TbsSkinScrollBox.GetSkinData;
  2728. begin
  2729.   inherited;
  2730.   BGPictureIndex := -1;
  2731.   if FIndex <> -1
  2732.   then
  2733.     if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinScrollBoxControl
  2734.     then
  2735.       with TbsDataSkinScrollBoxControl(FSD.CtrlList.Items[FIndex]) do
  2736.       begin
  2737.         Self.BGPictureIndex := BGPictureIndex;
  2738.       end;
  2739. end;
  2740. procedure TbsSkinScrollBox.Notification;
  2741. begin
  2742.   inherited Notification(AComponent, Operation);
  2743.   if (Operation = opRemove) and (AComponent = FHScrollBar)
  2744.   then FHScrollBar := nil;
  2745.   if (Operation = opRemove) and (AComponent = FVScrollBar)
  2746.   then FVScrollBar := nil;
  2747. end;
  2748. procedure TbsSkinScrollBox.SetVScrollBar;
  2749. begin
  2750.   FVScrollBar := Value;
  2751.   if FVScrollBar <> nil
  2752.   then
  2753.     with FVScrollBar do
  2754.     begin
  2755.       CanFocused := False;
  2756.       OnChange := OnVScrollBarChange;
  2757.       OnLastChange := OnVScrollBarLastChange;
  2758.       Enabled := True;
  2759.       Visible := False;
  2760.     end;
  2761.   GetVRange;
  2762. end;
  2763. procedure TbsSkinScrollBox.SetHScrollBar;
  2764. begin
  2765.   FHScrollBar := Value;
  2766.   if FHScrollBar <> nil
  2767.   then
  2768.     with FHScrollBar do
  2769.     begin
  2770.       CanFocused := False;
  2771.       Enabled := True;
  2772.       Visible := False;
  2773.       OnChange := OnHScrollBarChange;
  2774.       OnLastChange := OnHScrollBarLastChange;
  2775.     end;
  2776.   GetHRange;
  2777. end;
  2778. procedure TbsSkinScrollBox.CreateControlDefaultImage;
  2779. var
  2780.   R: TRect;
  2781. begin
  2782.   with B.Canvas do
  2783.   begin
  2784.     Brush.Color := clBtnFace;
  2785.     R := ClientRect;
  2786.     FillRect(R);
  2787.   end;
  2788. end;
  2789. type
  2790.   TParentControl = class(TWinControl);
  2791. procedure TbsSkinScrollBox.GetVRange;
  2792. var
  2793.   i, MaxBottom, H, Offset: Integer;
  2794.   FMax: Integer;
  2795.   VisibleChanged, IsVisible: Boolean;
  2796.   R: TRect;
  2797. begin
  2798.   if (FVScrollBar = nil) or FInCheckScrollBars or (Parent = nil) then Exit;
  2799.   VisibleChanged := False;
  2800.   H := ClientHeight;
  2801.   MaxBottom := 0;
  2802.   for i := 0 to ControlCount - 1 do
  2803.   with Controls[i] do
  2804.   begin
  2805.    if Visible
  2806.    then
  2807.      if Top + Height > MaxBottom then MaxBottom := Top + Height;
  2808.   end;
  2809.   with FVScrollBar do
  2810.   begin
  2811.     FMax := MaxBottom + Position;
  2812.     if FMax > H
  2813.     then
  2814.       begin
  2815.         if not Visible
  2816.         then
  2817.           begin
  2818.             IsVisible := True;
  2819.             VisibleChanged := True;
  2820.           end;
  2821.         if (Position > 0) and (MaxBottom < H) and (FVSizeOffset > 0)
  2822.         then
  2823.           begin
  2824.             if FVSizeOffset > Position then FVSizeOffset := Position;
  2825.             SetRange(0, FMax - 1, Position - FVSizeOffset, H);
  2826.             VScrollControls(- FVSizeOffset);
  2827.             FVSizeOffset := 0;
  2828.             FOldVScrollBarPos := Position;
  2829.           end
  2830.         else
  2831.           begin
  2832.             if (FVSizeOffset = 0) and ((FMax - 1) < Max) and (Position > 0) and
  2833.                (MaxBottom < H)
  2834.             then
  2835.               begin
  2836.                 Offset := Max - (FMax - 1);
  2837.                 Offset := Offset + (Max - PageSize + 1) + Position;
  2838.                 if Offset > Position then  Offset := Position;
  2839.                 VScrollControls(-Offset);
  2840.                 SetRange(0, FMax - 1, Position - OffSet, H);
  2841.               end
  2842.             else
  2843.               SetRange(0, FMax - 1, Position, H);
  2844.             FVSizeOffset := 0;
  2845.             FOldVScrollBarPos := Position;
  2846.           end;
  2847.       end
  2848.     else
  2849.       begin
  2850.         if Position > 0
  2851.         then VScrollControls(-Position);
  2852.         FVSizeOffset := 0;
  2853.         FOldVScrollBarPos := 0;
  2854.         SetRange(0, 0, 0, 0);
  2855.         if Visible
  2856.         then
  2857.           begin
  2858.             IsVisible := False;
  2859.             VisibleChanged := True;
  2860.           end;
  2861.       end;
  2862.    end;
  2863.    if (FVScrollBar <> nil) and (FHScrollBar <> nil)
  2864.    then
  2865.     begin
  2866.       if not FVScrollBar.Visible and FHScrollBar.Both
  2867.       then
  2868.         FHScrollBar.Both := False
  2869.       else
  2870.       if FVScrollBar.Visible and not FHScrollBar.Both
  2871.       then
  2872.         FHScrollBar.Both := True;
  2873.     end;
  2874.   if VisibleChanged
  2875.   then
  2876.     begin
  2877.       FInCheckScrollBars := True;
  2878.       FVScrollBar.Visible := IsVisible;
  2879.       FInCheckScrollBars := False;
  2880.       if (Align <> alNone)
  2881.       then
  2882.         begin
  2883.           FInCheckScrollBars := True;
  2884.           R := Parent.ClientRect;
  2885.           TParentControl(Parent).AlignControls(nil, R);
  2886.           FInCheckScrollBars := False;
  2887.         end;
  2888.     end;
  2889. end;
  2890. procedure TbsSkinScrollBox.VScrollControls;
  2891. begin
  2892.   ScrollBy(0,  -AOffset);
  2893. end;
  2894. procedure TbsSkinScrollBox.AdjustClientRect(var Rect: TRect);
  2895. var
  2896.   RLeft, RTop, VMax, HMax: Integer;
  2897. begin
  2898.   if (VScrollbar <> nil) and VScrollbar.Visible
  2899.   then
  2900.     begin
  2901.       RTop := -VScrollbar.Position;
  2902.       VMax := Max(VScrollBar.Max, ClientHeight);
  2903.     end
  2904.   else
  2905.     begin
  2906.       RTop := 0;
  2907.       VMax := ClientHeight;
  2908.     end;
  2909.   if (HScrollbar <> nil) and HScrollbar.Visible
  2910.   then
  2911.     begin
  2912.       RLeft := -HScrollbar.Position;
  2913.       HMax := Max(HScrollBar.Max, ClientWidth);
  2914.     end
  2915.   else
  2916.     begin
  2917.       RLeft := 0;
  2918.       HMax := ClientWidth;
  2919.     end;
  2920.   Rect := Bounds(RLeft, RTop,  HMax, VMax);
  2921.   inherited AdjustClientRect(Rect);
  2922. end;
  2923. procedure TbsSkinScrollBox.GetHRange;
  2924. var
  2925.   i, MaxRight, W, Offset: Integer;
  2926.   FMax: Integer;
  2927.   VisibleChanged, IsVisible: Boolean;
  2928.   R: TRect;
  2929. begin
  2930.   if (FHScrollBar = nil) or FInCheckScrollBars or (Parent = nil)  then Exit;
  2931.   VisibleChanged := False;
  2932.   W := ClientWidth;
  2933.   MaxRight := 0;
  2934.   for i := 0 to ControlCount - 1 do
  2935.   with Controls[i] do
  2936.   begin
  2937.    if Visible
  2938.    then
  2939.      if Left + Width > MaxRight then MaxRight := left + Width;
  2940.   end;
  2941.   with FHScrollBar do
  2942.   begin
  2943.     FMax := MaxRight + Position;
  2944.     if FMax > W
  2945.     then
  2946.       begin
  2947.         if not Visible
  2948.         then
  2949.           begin
  2950.             IsVisible := True;
  2951.             VisibleChanged := True;
  2952.           end;
  2953.         if (Position > 0) and (MaxRight < W) and (FHSizeOffset > 0)
  2954.         then
  2955.           begin
  2956.             if FHSizeOffset > Position
  2957.             then FHSizeOffset := Position;
  2958.             SetRange(0, FMax - 1, Position - FHSizeOffset , W);
  2959.             HScrollControls(-FHSizeOffset);
  2960.             FOldHScrollBarPos := Position;
  2961.           end
  2962.         else
  2963.           begin
  2964.             if (FHSizeOffset = 0) and ((FMax - 1) < Max) and (Position > 0) and
  2965.                (MaxRight < W)
  2966.             then
  2967.               begin
  2968.                 Offset := Max - (FMax - 1);
  2969.                 Offset := Offset + (Max - PageSize + 1) + Position;
  2970.                 if Offset > Position then  Offset := Position;
  2971.                 HScrollControls(-Offset);
  2972.                 SetRange(0, FMax - 1, Position - Offset, W);
  2973.               end
  2974.             else
  2975.               SetRange(0, FMax - 1, Position, W);
  2976.             FHSizeOffset := 0;
  2977.             FOldHScrollBarPos := Position;
  2978.           end;
  2979.       end
  2980.     else
  2981.       begin
  2982.         if Position > 0
  2983.         then HScrollControls(-Position);
  2984.         FHSizeOffset := 0;
  2985.         FOldHScrollBarPos := 0;
  2986.         SetRange(0, 0, 0, 0);
  2987.         if Visible
  2988.         then
  2989.           begin
  2990.             IsVisible := False;
  2991.             VisibleChanged := True;
  2992.           end;
  2993.       end;
  2994.    end;
  2995.   if (FVScrollBar <> nil) and (FHScrollBar <> nil)
  2996.   then
  2997.     begin
  2998.       if not FVScrollBar.Visible and FHScrollBar.Both
  2999.       then
  3000.         FHScrollBar.Both := False
  3001.       else
  3002.       if FVScrollBar.Visible and not FHScrollBar.Both
  3003.       then
  3004.         FHScrollBar.Both := True;
  3005.     end;
  3006.   if VisibleChanged
  3007.   then
  3008.     begin
  3009.       FInCheckScrollBars := True;
  3010.       FHScrollBar.Visible := IsVisible;
  3011.       FInCheckScrollBars := False;
  3012.       if (Align <> alNone)
  3013.       then
  3014.         begin
  3015.           R := Parent.ClientRect;
  3016.           TParentControl(Parent).AlignControls(nil, R);
  3017.         end;
  3018.     end;
  3019. end;
  3020. procedure TbsSkinScrollBox.HScrollControls;
  3021. begin
  3022.   ScrollBy(-AOffset, 0);
  3023. end;
  3024. procedure TbsSkinScrollBox.SetBounds;
  3025. var
  3026.   OldHeight, OldWidth: Integer;
  3027.   R: TRect;
  3028. begin
  3029.   OldWidth := Width;
  3030.   OldHeight := Height;
  3031.   inherited;
  3032.   if (OldWidth <> Width)
  3033.   then
  3034.     begin
  3035.       if (OldWidth < Width) and (OldWidth <> 0)
  3036.       then FHSizeOffset := Width - OldWidth
  3037.       else FHSizeOffset := 0;
  3038.     end
  3039.   else
  3040.     FHSizeOffset := 0;
  3041.   if (OldHeight <> Height)
  3042.   then
  3043.     begin
  3044.       if (OldHeight < Height) and (OldHeight <> 0)
  3045.       then FVSizeOffset := Height - OldHeight
  3046.       else FVSizeOffset := 0;
  3047.     end
  3048.   else
  3049.     FVSizeOffset := 0;
  3050.   GetVRange;
  3051.   GetHRange;
  3052. end;
  3053. procedure TbsSkinScrollBox.WMNCCALCSIZE;
  3054. begin
  3055.   GetSkinData;
  3056.   if (FIndex = -1) and (FBorderStyle <> bvNone) 
  3057.   then
  3058.     with Message.CalcSize_Params^.rgrc[0] do
  3059.     begin
  3060.       if FBorderStyle <> bvNone
  3061.       then
  3062.         begin
  3063.           Inc(Left, 1);
  3064.           Inc(Top, 1);
  3065.           Dec(Right, 1);
  3066.           Dec(Bottom, 1);
  3067.         end;
  3068.     end
  3069.   else
  3070.     if (BGPictureIndex = -1) and (FBorderStyle <> bvNone) then
  3071.     with Message.CalcSize_Params^.rgrc[0] do
  3072.     begin
  3073.       Inc(Left, ClRect.Left);
  3074.       Inc(Top, ClRect.Top);
  3075.       Dec(Right, RectWidth(SkinRect) - ClRect.Right);
  3076.       Dec(Bottom, RectHeight(SkinRect) - ClRect.Bottom);
  3077.     end;
  3078. end;
  3079. procedure TbsSkinScrollBox.WMNCPAINT;
  3080. var
  3081.   DC: HDC;
  3082.   C: TCanvas;
  3083.   R: TRect;
  3084. begin
  3085.   if (BGPictureIndex <> -1) or (FBorderStyle = bvNone) then Exit;
  3086.   DC := GetWindowDC(Handle);
  3087.   C := TControlCanvas.Create;
  3088.   C.Handle := DC;
  3089.   try
  3090.     PaintFrame(C);
  3091.   finally
  3092.     C.Free;
  3093.     ReleaseDC(Handle, DC);
  3094.   end;
  3095. end;
  3096. procedure TbsSkinScrollBox.PaintFrame;
  3097. var
  3098.   NewLTPoint, NewRTPoint, NewLBPoint, NewRBPoint: TPoint;
  3099.   R, NewClRect: TRect;
  3100.   LeftB, TopB, RightB, BottomB: TBitMap;
  3101.   OffX, OffY: Integer;
  3102.   AW, AH: Integer;
  3103. begin
  3104.   GetSkinData;
  3105.   if (FIndex = -1)
  3106.   then
  3107.     with C do
  3108.     begin
  3109.       if FBorderStyle <> bvNone
  3110.       then
  3111.         begin
  3112.           Brush.Style := bsClear;
  3113.           R := Rect(0, 0, Width, Height);
  3114.           case FBorderStyle of
  3115.             bvLowered: Frame3D(C, R, clBtnHighLight, clBtnShadow, 1);
  3116.             bvRaised: Frame3D(C, R, clBtnShadow, clBtnHighLight, 1);
  3117.             bvFrame: Frame3D(C, R, clBtnShadow, clBtnShadow, 1);
  3118.           end;
  3119.         end;
  3120.       Exit;
  3121.     end;
  3122.   LeftB := TBitMap.Create;
  3123.   TopB := TBitMap.Create;
  3124.   RightB := TBitMap.Create;
  3125.   BottomB := TBitMap.Create;
  3126.   OffX := Width - RectWidth(SkinRect);
  3127.   OffY := Height - RectHeight(SkinRect);
  3128.   AW := Width;
  3129.   AH := Height;
  3130.   NewLTPoint := LTPt;
  3131.   NewRTPoint := Point(RTPt.X + OffX, RTPt.Y);
  3132.   NewLBPoint := Point(LBPt.X, LBPt.Y + OffY);
  3133.   NewRBPoint := Point(RBPt.X + OffX, RBPt.Y + OffY);
  3134.   NewClRect := Rect(ClRect.Left, ClRect.Top,
  3135.                     ClRect.Right + OffX, ClRect.Bottom + OffY);
  3136.   CreateSkinBorderImages(LTPt, RTPt, LBPt, RBPt, CLRect,
  3137.       NewLtPoint, NewRTPoint, NewLBPoint, NewRBPoint, NewCLRect,
  3138.       LeftB, TopB, RightB, BottomB, Picture, SkinRect, Width, Height);
  3139.   C.Draw(0, 0, TopB);
  3140.   C.Draw(0, TopB.Height, LeftB);
  3141.   C.Draw(Width - RightB.Width, TopB.Height, RightB);
  3142.   C.Draw(0, Height - BottomB.Height, BottomB);
  3143.   TopB.Free;
  3144.   LeftB.Free;
  3145.   RightB.Free;
  3146.   BottomB.Free;
  3147. end;
  3148. procedure TbsSkinScrollBox.Paint;
  3149. var
  3150.   X, Y, XCnt, YCnt, w, h,
  3151.   rw, rh, XO, YO: Integer;
  3152.   Buffer: TBitMap;
  3153.   R: TRect;
  3154. begin
  3155.   GetSkinData;
  3156.   if FIndex = -1
  3157.   then
  3158.     begin
  3159.       inherited;
  3160.       Exit;
  3161.     end;
  3162.   if (ClientWidth > 0) and (ClientHeight > 0) then
  3163.   if BGPictureIndex <> -1
  3164.   then
  3165.     begin
  3166.       Buffer := TBitMap(FSD.FActivePictures.Items[BGPictureIndex]);
  3167.       XCnt := Width div Buffer.Width;
  3168.       YCnt := Height div Buffer.Height;
  3169.       for X := 0 to XCnt do
  3170.       for Y := 0 to YCnt do
  3171.         Canvas.Draw(X * Buffer.Width, Y * Buffer.Height, Buffer);
  3172.     end
  3173.   else
  3174.     begin
  3175.       Buffer := TBitMap.Create;
  3176.       Buffer.Width := ClientWidth;
  3177.       Buffer.Height := ClientHeight;
  3178.       w := RectWidth(ClRect);
  3179.       h := RectHeight(ClRect);
  3180.       rw := Buffer.Width;
  3181.       rh := Buffer.Height;
  3182.       with Buffer.Canvas do
  3183.       begin
  3184.         XCnt := rw div w;
  3185.         YCnt := rh div h;
  3186.         for X := 0 to XCnt do
  3187.         for Y := 0 to YCnt do
  3188.         begin
  3189.           if X * w + w > rw then XO := X * W + W - rw else XO := 0;
  3190.           if Y * h + h > rh then YO := Y * h + h - rh else YO := 0;
  3191.             CopyRect(Rect(X * w, Y * h,X * w + w - XO, Y * h + h - YO),
  3192.                      Picture.Canvas,
  3193.                      Rect(SkinRect.Left + ClRect.Left,
  3194.                      SkinRect.Top + ClRect.Top,
  3195.                      SkinRect.Left + ClRect.Right - XO,
  3196.                      SkinRect.Top + ClRect.Bottom - YO));
  3197.         end;
  3198.         Canvas.Draw(0, 0, Buffer);
  3199.         Buffer.Free;
  3200.       end;
  3201.    end;
  3202. end;
  3203. procedure TbsSkinScrollBox.WMSIZE;
  3204. begin
  3205.   inherited;
  3206.   SendMessage(Handle, WM_NCPAINT, 0, 0);
  3207. end;
  3208. procedure TbsSkinScrollBox.CreateParams(var Params: TCreateParams);
  3209. begin
  3210.   inherited CreateParams(Params);
  3211.   with Params do
  3212.   begin
  3213.     WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
  3214.   end;
  3215. end;
  3216. constructor TbsSkinTrackEdit.Create(AOwner: TComponent);
  3217. begin
  3218.   inherited;
  3219.   FTrackBarSkinDataName := 'htrackbar';
  3220.   ButtonMode := True;
  3221.   FMinValue := 0;
  3222.   FMaxValue := 100;
  3223.   FValue := 0;
  3224.   StopCheck := True;
  3225.   Text := '0';
  3226.   StopCheck := False;
  3227.   Width := 120;
  3228.   Height := 20;
  3229.   FSkinDataName := 'buttonedit';
  3230.   OnButtonClick := ButtonClick;
  3231.   FAlphaBlend := False;
  3232.   FAlphaBlendValue := 0;
  3233.   FPopupTrackBar := TbsSkinPopupTrackBar.Create(Self);
  3234.   FPopupTrackBar.Visible := False;
  3235.   FPopupTrackBar.TrackEdit := Self;
  3236.   FPopupTrackBar.Parent := Self;
  3237.   FPopupTrackBar.OnChange := TrackBarChange
  3238. end;
  3239. destructor TbsSkinTrackEdit.Destroy;
  3240. begin
  3241.   FPopupTrackBar.Free;
  3242.   inherited;
  3243. end;
  3244. procedure TbsSkinTrackEdit.CMCancelMode(var Message: TCMCancelMode);
  3245. begin
  3246.  if (Message.Sender <> FPopupTrackBar)
  3247.  then
  3248.    CloseUp;
  3249. end;
  3250. procedure TbsSkinTrackEdit.CloseUp;
  3251. begin
  3252.   if FPopupTrackbar.Visible
  3253.   then
  3254.     begin
  3255.       SetWindowPos(FPopupTrackBar.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
  3256.                    SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW);
  3257.       FPopupTrackBar.Visible := False;
  3258.       if CheckW2KWXP and FAlphaBlend
  3259.       then
  3260.         SetWindowLong(FPopupTrackBar.Handle, GWL_EXSTYLE,
  3261.                       GetWindowLong(Handle, GWL_EXSTYLE) and not WS_EX_LAYERED);
  3262.     end;                  
  3263. end;
  3264. procedure TbsSkinTrackEdit.DropDown;
  3265. var
  3266.   P: TPoint;
  3267.   I, X, Y: Integer;
  3268. begin
  3269.   with FPopupTrackBar do
  3270.   begin
  3271.     Width := Self.Width ;
  3272.     DefaultHeight := Self.Height;
  3273.     SkinDataName := FTrackBarSkinDataName;
  3274.     SkinData := Self.SkinData;
  3275.     MinValue := Self.MinValue;
  3276.     MaxValue := Self.MaxValue;
  3277.     Value := Self.Value;
  3278.   end;
  3279.   P := Parent.ClientToScreen(Point(Left, Top));
  3280.   Y := P.Y + Height;
  3281.   if Y + FPopupTrackBar.Height > Screen.Height then Y := P.Y - FPopupTrackBar.Height;
  3282.   //
  3283.   if CheckW2KWXP and FAlphaBlend
  3284.   then
  3285.     begin
  3286.       SetWindowLong(FPopupTrackBar.Handle, GWL_EXSTYLE,
  3287.                     GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  3288.       if FAlphaBlendAnimation
  3289.       then
  3290.         SetAlphaBlendTransparent(FPopupTrackBar.Handle, 0)
  3291.       else
  3292.         SetAlphaBlendTransparent(FPopupTrackBar.Handle, FAlphaBlendValue);
  3293.     end;
  3294.   //
  3295.   SetWindowPos(FPopupTrackBar.Handle, HWND_TOP, P.X, Y, 0, 0,
  3296.       SWP_NOSIZE or SWP_NOACTIVATE or SWP_SHOWWINDOW);
  3297.   FPopupTrackBar.Visible := True;
  3298.   if FAlphaBlendAnimation and FAlphaBlend and CheckW2KWXP
  3299.   then
  3300.     begin
  3301.       Application.ProcessMessages;
  3302.       I := 0;
  3303.       repeat
  3304.         Inc(i, 1);
  3305.         if i > FAlphaBlendValue then i := FAlphaBlendValue;
  3306.         SetAlphaBlendTransparent(FPopupTrackBar.Handle, i);
  3307.       until i >= FAlphaBlendValue;
  3308.     end;
  3309.     
  3310. end;
  3311. procedure TbsSkinTrackEdit.ButtonClick(Sender: TObject);
  3312. begin
  3313.   SetFocus;
  3314.   if not FPopupTrackBar.Visible then DropDown else CloseUp;
  3315. end;
  3316. function TbsSkinTrackEdit.CheckValue;
  3317. begin
  3318.   Result := NewValue;
  3319.   if (FMaxValue <> FMinValue)
  3320.   then
  3321.     begin
  3322.       if NewValue < FMinValue then
  3323.       Result := FMinValue
  3324.       else if NewValue > FMaxValue then
  3325.       Result := FMaxValue;
  3326.     end;
  3327. end;
  3328. procedure TbsSkinTrackEdit.SetMinValue;
  3329. begin
  3330.   FMinValue := AValue;
  3331. end;
  3332. procedure TbsSkinTrackEdit.SetMaxValue;
  3333. begin
  3334.   FMaxValue := AValue;
  3335. end;
  3336. function TbsSkinTrackEdit.IsNumText;
  3337. function GetMinus: Boolean;
  3338. var
  3339.   i: Integer;
  3340.   S: String;
  3341. begin
  3342.   S := AText;
  3343.   i := Pos('-', S);
  3344.   if i > 1
  3345.   then
  3346.     Result := False
  3347.   else
  3348.     begin
  3349.       Delete(S, i, 1);
  3350.       Result := Pos('-', S) = 0;
  3351.     end;
  3352. end;
  3353. const
  3354.   EditChars = '01234567890-';
  3355. var
  3356.   i: Integer;
  3357.   S: String;
  3358. begin
  3359.   S := EditChars;
  3360.   Result := True;
  3361.   if (Text = '') or (Text = '-')
  3362.   then
  3363.     begin
  3364.       Result := False;
  3365.       Exit;
  3366.     end;
  3367.   for i := 1 to Length(Text) do
  3368.   begin
  3369.     if Pos(Text[i], S) = 0
  3370.     then
  3371.       begin
  3372.         Result := False;
  3373.         Break;
  3374.       end;
  3375.   end;
  3376.   Result := Result and GetMinus;
  3377. end;
  3378. procedure TbsSkinTrackEdit.Change;
  3379. var
  3380.   NewValue: Integer;
  3381. begin
  3382.   inherited;
  3383.   if not StopCheck and IsNumText(Text)
  3384.   then
  3385.     begin
  3386.       NewValue := CheckValue(StrToInt(Text));
  3387.       if NewValue <> FValue
  3388.       then
  3389.         begin
  3390.           FValue := NewValue;
  3391.           Change;
  3392.         end;
  3393.       if NewValue <> StrToInt(Text)
  3394.       then
  3395.         Text := IntToStr(Round(Value));
  3396.     end;
  3397. end;
  3398. procedure TbsSkinTrackEdit.CMTextChanged;
  3399. var
  3400.   NewValue: Integer;
  3401. begin
  3402.   inherited;
  3403.   if not StopCheck and IsNumText(Text)
  3404.   then
  3405.     begin
  3406.       NewValue := CheckValue(StrToInt(Text));
  3407.       if NewValue <> FValue
  3408.       then
  3409.         begin
  3410.           FValue := NewValue;
  3411.           StopCheck := True;
  3412.           Change;
  3413.           StopCheck := False;
  3414.         end;
  3415.       if NewValue <> StrToInt(Text)
  3416.       then
  3417.         Text := IntToStr(Round(Value));
  3418.     end;
  3419. end;
  3420. procedure TbsSkinTrackEdit.SetValue;
  3421. begin
  3422.   FValue := CheckValue(AValue);
  3423.   StopCheck := True;
  3424.   Text := IntToStr(Round(CheckValue(AValue)));
  3425.   StopCheck := False;
  3426.   Change;
  3427. end;
  3428. procedure TbsSkinTrackEdit.KeyPress(var Key: Char);
  3429. begin
  3430.   if Key = Char(VK_ESCAPE)
  3431.   then
  3432.     begin
  3433.       if FPopupTrackBar.Visible then CloseUp; 
  3434.     end
  3435.   else  
  3436.   if not IsValidChar(Key) then
  3437.   begin
  3438.     Key := #0;
  3439.     MessageBeep(0)
  3440.   end;
  3441.   inherited KeyPress(Key);
  3442. end;
  3443. function TbsSkinTrackEdit.IsValidChar(Key: Char): Boolean;
  3444. begin
  3445.   Result := (Key in ['-', '0'..'9']) or
  3446.             ((Key < #32) and (Key <> Chr(VK_RETURN)));
  3447.   if ReadOnly and Result and ((Key >= #32) or
  3448.      (Key = Char(VK_BACK)) or (Key = Char(VK_DELETE)))
  3449.   then
  3450.     Result := False;
  3451. end;
  3452. procedure TbsSkinTrackEdit.WMKillFocus(var Message: TWMKillFocus);
  3453. begin
  3454.   inherited;
  3455.   CloseUp;
  3456. end;
  3457. procedure TbsSkinTrackEdit.TrackBarChange(Sender: TObject);
  3458. begin
  3459.   Value := FPopupTrackBar.Value;
  3460. end;
  3461. constructor TbsSkinPopupTrackBar.Create(AOwner: TComponent);
  3462. begin
  3463.   inherited Create(AOwner);
  3464.   ControlStyle := ControlStyle + [csNoDesignVisible, csReplicatable];
  3465.   SkinDataName := 'htrackbar';
  3466. end;
  3467. procedure TbsSkinPopupTrackBar.CreateParams(var Params: TCreateParams);
  3468. begin
  3469.   inherited CreateParams(Params);
  3470.   with Params do
  3471.   begin
  3472.     Style := WS_POPUP;
  3473.     ExStyle := WS_EX_TOOLWINDOW;
  3474.     WindowClass.Style := CS_SAVEBITS;
  3475.   end;
  3476. end;
  3477. procedure TbsSkinPopupTrackBar.WMMouseActivate(var Message: TMessage);
  3478. begin
  3479.   Message.Result := MA_NOACTIVATE;
  3480. end;
  3481. constructor TbsSkinTimeEdit.Create(AOwner: TComponent);
  3482. begin
  3483.    inherited;
  3484.    fShowMSec := false;
  3485.    EditMask := '!90:00:00;1; ';
  3486.    Text := '00:00:00';
  3487.    OnKeyPress := HandleOnKeyPress;
  3488. end;
  3489. procedure TbsSkinTimeEdit.CheckSpace(var S: String);
  3490. var
  3491.   i: Integer;
  3492. begin
  3493.   for i := 0 to Length(S) do
  3494.   begin
  3495.     if S[i] = ' ' then S[i] := '0';
  3496.   end;
  3497. end;
  3498. procedure TbsSkinTimeEdit.HandleOnKeyPress(Sender: TObject; var Key: Char);
  3499. var
  3500.   TimeStr: string;
  3501.   aHour, aMinute, aSecond, aMillisecond: Word;
  3502.   aHourSt, aMinuteSt, aSecondSt, aMillisecondSt: string;
  3503. begin
  3504.    if (Key <> #13) and (Key <> #8)
  3505.    then
  3506.    begin
  3507.    TimeStr := Text;
  3508.    if SelLength > 1 then SelLength := 1;
  3509.    if IsValidChar(Key)
  3510.    then
  3511.      begin
  3512.        Delete(TimeStr,SelStart + 1, 1);
  3513.        Insert(string(Key), TimeStr, SelStart + 1);
  3514.      end;
  3515.       try
  3516.          aHourSt := Copy(TimeStr, 1, 2);
  3517.          CheckSpace(aHourSt);
  3518.          aMinuteSt := Copy(TimeStr, 4, 2);
  3519.          CheckSpace(aMinuteSt);
  3520.          aSecondSt := Copy(TimeStr, 7, 2);
  3521.          CheckSpace(aSecondSt);
  3522.          if fShowMSec then begin
  3523.             aMillisecondSt := Copy(TimeStr, 10, 3);
  3524.          end else begin
  3525.             aMillisecondSt := '0';
  3526.          end;
  3527.          CheckSpace(aMillisecondSt);
  3528.          aHour := StrToInt(aHourSt);
  3529.          aMinute := StrToInt(aMinuteSt);
  3530.          aSecond := StrToInt(aSecondSt);
  3531.          aMillisecond := StrToInt(aMillisecondSt);
  3532.          if not IsValidTime(aHour, aMinute, aSecond, aMillisecond) then begin
  3533.             Key := #0;
  3534.          end;
  3535.       except
  3536.          Key := #0;
  3537.       end;
  3538.    end;
  3539. end;
  3540. procedure TbsSkinTimeEdit.SetShowMilliseconds(const Value: Boolean);
  3541. begin
  3542.    if fShowMSec <> Value then begin
  3543.       fShowMSec := Value;
  3544.       if fShowMSec then begin
  3545.          EditMask := '!90:00:00.000;1; ';
  3546.          Text := '00:00:00.000';
  3547.       end else begin
  3548.          EditMask := '!90:00:00;1; ';
  3549.          Text := '00:00:00';
  3550.       end;
  3551.    end;
  3552. end;
  3553. procedure TbsSkinTimeEdit.SetMilliseconds(const Value: integer);
  3554. var
  3555.    aHour, aMinute, aSecond, aMillisecond: integer;
  3556.    St: string;
  3557. begin
  3558.    aSecond := Value div 1000;
  3559.    aMillisecond := Value mod 1000;
  3560.    aMinute := aSecond div 60;
  3561.    aSecond := aSecond mod 60;
  3562.    aHour := aMinute div 60;
  3563.    aMinute := aMinute mod 60;
  3564.    St := Format('%2.2d:%2.2d:%2.2d.%3.3d', [aHour, aMinute, aSecond, aMillisecond]);
  3565.    try
  3566.       Text := St;
  3567.    except
  3568.       Text := '00:00:00.000';
  3569.    end;
  3570. end;
  3571. function TbsSkinTimeEdit.GetMilliseconds: integer;
  3572. var
  3573.    TimeStr: string;
  3574.    aHour, aMinute, aSecond, aMillisecond: integer;
  3575.    aHourSt, aMinuteSt, aSecondSt, aMillisecondSt: string;
  3576. begin
  3577.    TimeStr := Text;
  3578.    try
  3579.       aHourSt := Copy(TimeStr, 1, 2);
  3580.       CheckSpace(aHourSt);
  3581.       aMinuteSt := Copy(TimeStr, 4, 2);
  3582.       CheckSpace(aMinuteSt);
  3583.       aSecondSt := Copy(TimeStr, 7, 2);
  3584.       CheckSpace(aSecondSt);
  3585.       aMillisecondSt := Copy(TimeStr, 10, 3);
  3586.       CheckSpace(aMillisecondSt);
  3587.       aHour := StrToInt(aHourSt);
  3588.       aMinute := StrToInt(aMinuteSt);
  3589.       aSecond := StrToInt(aSecondSt);
  3590.       aMillisecond := StrToInt(aMillisecondSt);
  3591.       Result := ((((aHour * 60) + aMinute) * 60) + aSecond) * 1000 + aMillisecond;
  3592.    except
  3593.       Result := 0;
  3594.    end;
  3595. end;
  3596. procedure TbsSkinTimeEdit.SetTime(const Value: string);
  3597. var
  3598.    TimeStr: string;
  3599.    aHour, aMinute, aSecond, aMillisecond: integer;
  3600.    aHourSt, aMinuteSt, aSecondSt, aMillisecondSt: string;
  3601. begin
  3602.    TimeStr := Value;
  3603.    try
  3604.       aHourSt := Copy(TimeStr, 1, 2);
  3605.       CheckSpace(aHourSt);
  3606.       aMinuteSt := Copy(TimeStr, 4, 2);
  3607.       CheckSpace(aMinuteSt);
  3608.       aSecondSt := Copy(TimeStr, 7, 2);
  3609.       CheckSpace(aSecondSt);
  3610.       aHour := StrToInt(aHourSt);
  3611.       aMinute := StrToInt(aMinuteSt);
  3612.       aSecond := StrToInt(aSecondSt);
  3613.       if fShowMSec then begin
  3614.          aMillisecondSt := Copy(TimeStr, 10, 3);
  3615.          CheckSpace(aMillisecondSt);
  3616.          aMillisecond := StrToInt(aMillisecondSt);
  3617.          Text := Format('%2.2d:%2.2d:%2.2d.%3.3d', [aHour, aMinute, aSecond, aMillisecond]);
  3618.       end else begin
  3619.          Text := Format('%2.2d:%2.2d:%2.2d', [aHour, aMinute, aSecond]);
  3620.       end;
  3621.    except
  3622.       if fShowMSec then begin
  3623.          Text := '00:00:00.000';
  3624.       end else begin
  3625.          Text := '00:00:00';
  3626.       end;
  3627.    end;
  3628. end;
  3629. function TbsSkinTimeEdit.GetTime: string;
  3630. begin
  3631.   Result := Text;
  3632. end;
  3633. function TbsSkinTimeEdit.IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;
  3634. begin
  3635.   Result := ((AHour < 24) and (AMinute < 60) and
  3636.              (ASecond < 60) and (AMilliSecond < 1000)) or
  3637.             ((AHour = 24) and (AMinute = 0) and
  3638.              (ASecond = 0) and (AMilliSecond = 0));
  3639. end;
  3640. function TbsSkinTimeEdit.IsValidChar(Key: Char): Boolean;
  3641. begin
  3642.   Result := Key in ['0'..'9'];
  3643. end;
  3644. procedure TbsSkinTimeEdit.DecodeTime(var Hour, Min, Sec, MSec: Word);
  3645. var
  3646.   TimeStr: string;
  3647.   aHourSt, aMinuteSt, aSecondSt, aMillisecondSt: string;
  3648. begin
  3649.   TimeStr := Text;
  3650.   aHourSt := Copy(TimeStr, 1, 2);
  3651.   CheckSpace(aHourSt);
  3652.   aMinuteSt := Copy(TimeStr, 4, 2);
  3653.   CheckSpace(aMinuteSt);
  3654.   aSecondSt := Copy(TimeStr, 7, 2);
  3655.   CheckSpace(aSecondSt);
  3656.   Hour := StrToInt(aHourSt);
  3657.   Min := StrToInt(aMinuteSt);
  3658.   Sec := StrToInt(aSecondSt);
  3659.   if fShowMSec
  3660.   then
  3661.     aMillisecondSt := Copy(TimeStr, 10, 3)
  3662.   else
  3663.     aMillisecondSt := '000';
  3664.   CheckSpace(aMillisecondSt);
  3665.   Msec := StrToInt(aMillisecondSt);
  3666. end;
  3667. procedure TbsSkinTimeEdit.EncodeTime(Hour, Min, Sec, MSec: Word);
  3668. begin
  3669.   if not IsValidTime(Hour, Min, Sec, MSec) then Exit;
  3670.   try
  3671.     if fShowMSec
  3672.     then
  3673.       Text := Format('%2.2d:%2.2d:%2.2d.%3.3d', [Hour, Min, Sec, MSec])
  3674.     else
  3675.       Text := Format('%2.2d:%2.2d:%2.2d', [Hour, Min, Sec]);
  3676.   except
  3677.     if fShowMSec
  3678.     then
  3679.       Text := '00:00:00.000'
  3680.     else
  3681.       Text := '00:00:00';
  3682.   end;
  3683. end;
  3684. end.