home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 January / Pcwk0198.iso / Dcomplib / ALPHAPNL.LZH / ALPHABAR.PAS < prev    next >
Pascal/Delphi Source File  |  1995-05-22  |  12KB  |  431 lines

  1. {+--------------------------------------------------------------+}
  2. {| Unit AlphaBar.                                               |}
  3. {|                                                              |}
  4. {| This unit includes the following VCL components:             |}
  5. {|    o tAlphaPanel                                             |}
  6. {|                                                              |}
  7. {| Version 1.0 - May 1995.                                      |}
  8. {| (c) Ingo Humann                                              |}
  9. {|     Mⁿhlstr. 3                                               |}
  10. {|     67105 Schifferstadt                                      |}
  11. {|     GERMANY                                                  |}
  12. {|     CIS: 100116,3354  Internet: 100116.3354@compuserve.com   |}
  13. {+--------------------------------------------------------------+}
  14.  
  15. {$A+,B-,D-,F-,G+,I-,K+,P+,Q-,R-,S-,T-,V-,W-,X+,Y+}
  16.  
  17. unit Alphabar;
  18.  
  19. interface
  20.  
  21. uses
  22.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  23.   Forms, Dialogs, ExtCtrls, Buttons, Menus;
  24.  
  25. type
  26.   TAlphaPanel = class(TCustomPanel)
  27.   private
  28.     { Private-Deklarationen }
  29.     fActiveButton : char;
  30.     fAlphaButtons : tStringList;
  31.     fButtonFont : tFont;
  32.     fBlankXSize, fBlankYSize, fButtonHeight, fButtonLeftMargin, fButtonTopMargin,
  33.       fButtonWidth : word;
  34.     fButtonXSpacing, fButtonYSpacing : integer;
  35.     fAllowAllUp, fCatchButtons : boolean;
  36.     firstButton : tSpeedButton;
  37.     fOnValueChange : tNotifyEvent;
  38.     procedure HandleButton(Sender :tObject);
  39.     procedure SetActiveButton(value :char);
  40.     procedure SetAllowAllUp(value :boolean);
  41.     procedure SetAlphaButtons(value :tStringList);
  42.     procedure SetBlankXSize(value :word);
  43.     procedure SetBlankYSize(value :word);
  44.     procedure SetButtonFont(value :tFont);
  45.     procedure SetButtonHeight(value :word);
  46.     procedure SetButtonLeftMargin(value :word);
  47.     procedure SetButtonTopMargin(value :word);
  48.     procedure SetButtonWidth(value :word);
  49.     procedure SetCatchStates;
  50.     procedure SetCatchButtons(value :boolean);
  51.     procedure SetButtonXSpacing(value :integer);
  52.     procedure SetButtonYSpacing(value :integer);
  53.   protected
  54.     { Protected-Deklarationen }
  55.     procedure AddLetterButtons; virtual;
  56.     procedure DestroyButtons;
  57.     procedure Loaded; override;
  58.   public
  59.     { Public-Deklarationen }
  60.     constructor Create(aOwner :tComponent); override;
  61.     destructor Destroy; override;
  62.     function GetButton(value :char) :tSpeedButton;
  63.   published
  64.     { Published-Deklarationen }
  65.     property Align;
  66.     property BevelInner;
  67.     property BevelOuter;
  68.     property BorderStyle;
  69.     property BevelWidth;
  70.     property Color;
  71.     property Ctl3D;
  72.     property Cursor;
  73.     property Enabled;
  74.     property Height default 22;
  75.     property Locked;
  76.     property ParentColor;
  77.     property ParentCtl3D;
  78.     property ParentShowHint;
  79.     property PopupMenu;
  80.     property ShowHint;
  81.     property Width default 448;
  82.     property Visible;
  83.     property ActiveButton :char read fActiveButton write SetActiveButton default #0;
  84.     property AllowAllUp :boolean read fAllowAllUp write SetAllowAllUp default false;
  85.     property AlphaButtons :tStringList read fAlphaButtons write SetAlphaButtons;
  86.     property BlankXSize :word read fBlankXSize write SetBlankXSize default 9;
  87.     property BlankYSize :word read fBlankYSize write SetBlankYSize default 9;
  88.     property ButtonFont :tFont read fButtonFont write SetButtonFont;
  89.     property ButtonHeight :word read fButtonHeight write SetButtonHeight default 18;
  90.     property ButtonLeftMargin :word read fButtonLeftMargin write SetButtonLeftMargin default 2;
  91.     property ButtonTopMargin :word read fButtonTopMargin write SetButtonTopMargin default 2;
  92.     property ButtonWidth :word read fButtonWidth write SetButtonWidth default 18;
  93.     property ButtonXSpacing :integer read fButtonXSpacing write SetButtonXSpacing default -1;
  94.     property ButtonYSpacing :integer read fButtonYSpacing write SetButtonYSpacing default -1;
  95.     property CatchButtons :boolean read fCatchButtons write SetCatchButtons;
  96.     property OnValueChange :tNotifyEvent read fOnValueChange write fOnValueChange;
  97.   end;
  98.  
  99. procedure Register;
  100.  
  101. implementation
  102.  
  103. {+--------------------------------------------------------------+}
  104. {| Def: tAlphaPanel                                             |}
  105. {+--------------------------------------------------------------+}
  106.  
  107. constructor TAlphaPanel.Create;
  108. var
  109.   aButton : tSpeedButton;
  110. begin
  111.   inherited Create(aOwner);
  112.   Width := 448; Height := 22;
  113.   ControlStyle := ControlStyle - [csSetCaption];
  114.   fActiveButton := #0;
  115.   fButtonFont := tFont.Create;
  116.   fBlankXSize := 9; fBlankYSize := 9;
  117.   fButtonWidth := 18; fButtonHeight := 18;
  118.   fButtonXSpacing := -1; fButtonYSpacing := -1;
  119.   fButtonLeftMargin := 2;
  120.   fButtonTopMargin := 2;
  121.   aButton := tSpeedButton.Create(Self);
  122.   fButtonFont.Assign(aButton.Font);
  123.   aButton.Destroy;
  124.   fAlphaButtons := tStringList.Create;
  125. end;
  126.  
  127. destructor TAlphaPanel.Destroy;
  128. begin
  129.   fAlphaButtons.Destroy;
  130.   fButtonFont.Destroy;
  131.   inherited Destroy;
  132. end;
  133.  
  134. procedure TAlphaPanel.AddLetterButtons;
  135. var
  136.   aButton : tSpeedButton;
  137.   ButtonCount, i, m, n, aXPos, aYPos : word;
  138.   sign : char;
  139.   isblank : boolean;
  140. begin
  141.   aXPos := fButtonLeftMargin; aYPos := fButtonTopMargin;
  142.   aButton := NIL; ButtonCount := 0;
  143.   for n := 1 to fAlphaButtons.Count do
  144.   begin
  145.     m := Length(fAlphaButtons.Strings[n - 1]);
  146.     if m = 0 then {* empty line }
  147.     begin
  148.       inc(aYPos, fBlankYSize);
  149.       aXPos := fButtonLeftMargin;
  150.       isBlank := true;
  151.     end else
  152.       for i := 1 to m do
  153.       begin
  154.         sign := fAlphaButtons.Strings[n - 1][i];
  155.         if sign = #32 then {* blank character = horizontal blank... }
  156.         begin
  157.           inc(aXPos, fBlankXSize);
  158.           isBlank := true;
  159.         end
  160.         else {* ...otherwise: insert button }
  161.         begin
  162.           isBlank := false;
  163.           aButton := tSpeedButton.Create(Self);
  164.           InsertControl(aButton);
  165.           with aButton do
  166.           begin
  167.             Left := axPos; Top := aYPos;
  168.             width := fButtonWidth; height := fButtonHeight;
  169.             Caption := sign;
  170.             tag := ord(sign);
  171.             OnClick := HandleButton;
  172.             font.Assign(fButtonFont);
  173.             visible := true;
  174.           end;
  175.           if not isBlank then
  176.             inc(aXPos, fButtonWidth);
  177.           inc(aXPos, fButtonXSpacing);
  178.           inc(ButtonCount);
  179.         end;
  180.       end;
  181.     if not isBlank then
  182.       inc(aYPos, fButtonHeight);
  183.     inc(aYPos, fButtonYSpacing);
  184.     aXPos := fButtonLeftMargin;
  185.   end;
  186.   firstButton := aButton;
  187.   SetCatchStates;
  188. end;
  189.  
  190. procedure TAlphaPanel.DestroyButtons;
  191. var
  192.   i, n : integer;
  193.   aButton : tSpeedButton;
  194. begin
  195.   n := ControlCount;
  196.   for i := 1 to n do
  197.   begin
  198.     aButton := tSpeedButton(Controls[0]);
  199.     RemoveControl(aButton);
  200.     aButton.Destroy;
  201.   end;
  202.   firstButton := NIL;
  203. end;
  204.  
  205. function TAlphaPanel.GetButton(value :char) :tSpeedButton;
  206. var
  207.   i : integer;
  208. begin
  209.   Result := NIL;
  210.   i := ControlCount;
  211.   while (i <> 0) and (result = NIL) do
  212.   begin
  213.     if Controls[i - 1] is tSpeedButton then
  214.       if (Controls[i - 1] as tSpeedButton).Tag = ord(value) then
  215.         Result := tSpeedButton(Controls[i - 1]);
  216.     dec(i);
  217.   end;
  218. end;
  219.  
  220. procedure TAlphaPanel.HandleButton;
  221. var
  222.   SenderBtn : tSpeedButton;
  223. begin
  224.   SenderBtn := Sender as tSpeedButton;
  225.   case fCatchButtons of
  226.     true  : if SenderBtn.Down then
  227.               fActiveButton := chr(SenderBtn.Tag)
  228.             else
  229.               fActiveButton := #0;
  230.     false : fActiveButton := chr(SenderBtn.Tag);
  231.   end;
  232.   if Assigned(FOnValueChange) then
  233.     FOnValueChange(Self);
  234. end;
  235.  
  236. procedure tAlphaPanel.Loaded;
  237. begin
  238.   inherited Loaded;
  239.   AddLetterButtons;
  240. end;
  241.  
  242. procedure TAlphaPanel.SetActiveButton;
  243. var
  244.   aButton : tSpeedButton;
  245. begin
  246.   if (value = #0) and fCatchButtons then
  247.   begin
  248.     aButton := GetButton(fActiveButton);
  249.     if aButton <> NIL then
  250.       aButton.Down := false;
  251.     fActiveButton := #0;
  252.     if Assigned(FOnValueChange) then
  253.       FOnValueChange(Self);
  254.     Exit;
  255.   end;
  256.   aButton := GetButton(value);
  257.   begin
  258.     fActiveButton := value;
  259.     if fCatchButtons then
  260.       aButton.Down := true;
  261.     if Assigned(FOnValueChange) then
  262.       FOnValueChange(Self);
  263.   end;
  264. end;
  265.  
  266. procedure TAlphaPanel.SetAllowAllUp(value :boolean);
  267. begin
  268.   if fAllowAllUp <> value then
  269.   begin
  270.     fAllowAllUp := value;
  271.     if fCatchButtons then
  272.       SetCatchStates;
  273.   end;
  274. end;
  275.  
  276. procedure TAlphaPanel.SetAlphaButtons;
  277. begin
  278.   DestroyButtons;
  279.   fAlphaButtons.Clear;
  280.   fAlphaButtons.Assign(value);
  281.   AddLetterButtons;
  282.   fActiveButton := #0;
  283.   SetCatchStates;
  284.   if Assigned(FOnValueChange) then
  285.     FOnValueChange(Self);
  286. end;
  287.  
  288. procedure TAlphaPanel.SetBlankXSize;
  289. begin
  290.   if fBlankXSize <> value then
  291.   begin
  292.     fBlankXSize := value;
  293.     DestroyButtons;
  294.     AddLetterButtons;
  295.   end;
  296. end;
  297.  
  298. procedure TAlphaPanel.SetBlankYSize;
  299. begin
  300.   if fBlankYSize <> value then
  301.   begin
  302.     fBlankYSize := value;
  303.     DestroyButtons;
  304.     AddLetterButtons;
  305.   end;
  306. end;
  307.  
  308. procedure TAlphaPanel.SetButtonFont;
  309. var
  310.   i : integer;
  311.   aButton : tSpeedButton;
  312. begin
  313.   for i := 0 to ControlCount - 1 do
  314.   begin
  315.     aButton := NIL;
  316.     if Controls[i] is tSpeedButton then
  317.       tSpeedButton(Controls[i]).Font.Assign(value);
  318.   end;
  319.   fButtonFont.Assign(value);
  320. end;
  321.  
  322. procedure TAlphaPanel.SetButtonHeight;
  323. begin
  324.   if fButtonHeight <> value then
  325.   begin
  326.     fButtonHeight := value;
  327.     DestroyButtons;
  328.     AddLetterButtons;
  329.   end;
  330. end;
  331.  
  332. procedure TAlphaPanel.SetButtonLeftMargin;
  333. begin
  334.   if fButtonLeftMargin <> value then
  335.   begin
  336.     fButtonLeftMargin := value;
  337.     DestroyButtons;
  338.     AddLetterButtons;
  339.   end;
  340. end;
  341.  
  342. procedure TAlphaPanel.SetButtonTopMargin;
  343. begin
  344.   if fButtonTopMargin <> value then
  345.   begin
  346.     fButtonTopMargin := value;
  347.     DestroyButtons;
  348.     AddLetterButtons;
  349.   end;
  350. end;
  351.  
  352. procedure TAlphaPanel.SetButtonXSpacing;
  353. begin
  354.   if fButtonXSpacing <> value then
  355.   begin
  356.     fButtonXSpacing := value;
  357.     DestroyButtons;
  358.     AddLetterButtons;
  359.   end;
  360. end;
  361.  
  362. procedure TAlphaPanel.SetButtonYSpacing;
  363. begin
  364.   if fButtonYSpacing <> value then
  365.   begin
  366.     fButtonYSpacing := value;
  367.     DestroyButtons;
  368.     AddLetterButtons;
  369.   end;
  370. end;
  371.  
  372. procedure TAlphaPanel.SetButtonWidth;
  373. begin
  374.   if fButtonWidth <> value then
  375.   begin
  376.     fButtonWidth := value;
  377.     DestroyButtons;
  378.     AddLetterButtons;
  379.   end;
  380. end;
  381.  
  382. procedure TAlphaPanel.SetCatchButtons;
  383. begin
  384.   if value = fCatchButtons then
  385.     Exit;
  386.   fCatchButtons := value;
  387.   SetCatchStates;
  388. end;
  389.  
  390. procedure TAlphaPanel.SetCatchStates;
  391. var
  392.   i : integer;
  393.   aButton : tSpeedButton;
  394. begin
  395.   if firstButton <> NIL then
  396.     firstButton.AllowAllUp := true;
  397.   for i := 0 to ControlCount - 1 do
  398.   begin
  399.     aButton := NIL;
  400.     if Controls[i] is tSpeedButton then
  401.     begin
  402.       aButton := tSpeedButton(Controls[i]);
  403.       aButton.Down := false;
  404.       if fCatchButtons then
  405.         aButton.GroupIndex := 1
  406.       else
  407.         aButton.GroupIndex := 0;
  408.     end;
  409.   end;
  410.   if firstButton <> NIL then
  411.     if not fAllowAllUp then
  412.       firstButton.AllowAllUp := false;
  413.   if fActiveButton <> #0 then
  414.   begin
  415.     aButton := GetButton(fActiveButton);
  416.     if aButton <> NIL then
  417.       aButton.Down := fCatchButtons;
  418.   end;
  419. end;
  420.  
  421. {+--------------------------------------------------------------+}
  422. {| Register the components                                      |}
  423. {+--------------------------------------------------------------+}
  424.  
  425. procedure Register;
  426. begin
  427.   RegisterComponents('Beispiele', [TAlphaPanel]);
  428. end;
  429.  
  430. end.
  431.