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

Delphi控件源码

开发平台:

Delphi

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