home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sibdemo3.zip / SOURCE.DAT / SOURCE / ADDON / SPIN.PAS < prev    next >
Pascal/Delphi Source File  |  1998-05-02  |  13KB  |  429 lines

  1. Unit Spin;
  2.  
  3. Interface
  4.  
  5. Uses SysUtils,Classes,Forms,Graphics,StdCtrls,Buttons,ComCtrls;
  6.  
  7. Type
  8.      TSpinButton=Class(TUpDown)
  9.         Private
  10.               FUpButton:TSpeedButton;
  11.               FDownButton:TSpeedButton;
  12.         Private
  13.               Procedure ButtonOnPaint(Sender:TObject;Const rec:TRect);
  14.               Function GetDownGlyph:TBitmap;
  15.               Procedure SetDownGlyph(NewValue:TBitmap);
  16.               Function GetDownNumGlyphs:TNumGlyphs;
  17.               Procedure SetDownNumGlyphs(NewValue:TNumGlyphs);
  18.               Function GetUpGlyph:TBitmap;
  19.               Procedure SetUpGlyph(NewValue:TBitmap);
  20.               Function GetUpNumGlyphs:TNumGlyphs;
  21.               Procedure SetUpNumGlyphs(NewValue:TNumGlyphs);
  22.         Public
  23.               Procedure SetupComponent;Override;
  24.         Published
  25.               Property DownGlyph:TBitmap read GetDownGlyph write SetDownGlyph;
  26.               Property DownNumGlyphs:TNumGlyphs read GetDownNumGlyphs write SetDownNumGlyphs;
  27.               Property UpGlyph:TBitmap read GetUpGlyph write SetUpGlyph;
  28.               Property UpNumGlyphs:TNumGlyphs read GetUpNumGlyphs write SetUpNumGlyphs;
  29.      End;
  30.  
  31.  
  32.      TSpinMode=(spSpinNumbers,spSpinList);
  33.  
  34.      TSpinEdit=Class(TControl)
  35.         Private
  36.               FEditorEnabled:Boolean;
  37.               FButton:TSpinButton;
  38.               FEdit:TEdit;
  39.               FMinValue,FMaxValue:LongInt;
  40.               FIncrement:LongInt;
  41.               FItems:TStrings;
  42.               FSpinMode:TSpinMode;
  43.               FValue:LongInt;
  44.         Private
  45.               Procedure SetMaxValue(NewValue:LongInt);
  46.               Procedure SetMinValue(NewValue:LongInt);
  47.               Procedure SetValue(NewValue:LongInt);
  48.               Procedure SetEditorEnabled(NewValue:Boolean);
  49.               Procedure SetItems(NewValue:TStrings);
  50.               Procedure SetSpinMode(NewValue:TSpinMode);
  51.               Procedure ButtonClick(Sender:TObject);
  52.               Procedure EditResize(Sender:TObject);
  53.               Procedure EditChange(Sender:TObject);
  54.         Public
  55.               Procedure SetupComponent;Override;
  56.               Procedure SetupShow;Override;
  57.               Destructor Destroy;Override;
  58.               Procedure Resize;Override;
  59.               Procedure ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);Override;
  60.               Function WriteSCUResource(Stream:TResourceStream):Boolean;Override;
  61.         Public
  62.               Property Button:TSpinButton read FButton;
  63.               Property Edit:TEdit read FEdit;
  64.         Published
  65.               Property Increment:LongInt read FIncrement write FIncrement;
  66.               Property MaxValue:LongInt read FMaxValue write SetMaxValue;
  67.               Property MinValue:LongInt read FMinValue write SetMinValue;
  68.               Property Value:LongInt read FValue write SetValue;
  69.               Property EditorEnabled:Boolean read FEditorEnabled write SetEditorEnabled;
  70.               Property Items:TStrings read FItems write SetItems;
  71.               Property SpinMode:TSpinMode read FSpinMode write SetSpinMode;
  72.               Property Align;
  73.               Property ClientHeight;
  74.               Property ClientWidth;
  75.               Property Enabled;
  76.               Property OnBeforePaint;
  77.               Property OnAfterPaint;
  78.               Property TabOrder;
  79.               Property TabStop;
  80.               Property PopUpMenu;
  81.               Property OnSetupShow;
  82.               Property OnShow;
  83.               Property Visible;
  84.               Property Font;
  85.               Property ParentFont;
  86.               Property Color;
  87.               Property ParentColor;
  88.               Property PenColor;
  89.               Property ParentPenColor;
  90.      End;
  91.  
  92. Implementation
  93.  
  94. {$R Spin}
  95.  
  96. {
  97. ╔═══════════════════════════════════════════════════════════════════════════╗
  98. ║                                                                           ║
  99. ║ Speed-Pascal/2 Version 2.0                                                ║
  100. ║                                                                           ║
  101. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  102. ║                                                                           ║
  103. ║ This section: TSpinButton Class Implementation                            ║
  104. ║                                                                           ║
  105. ║ (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited !       ║
  106. ║                                                                           ║
  107. ╚═══════════════════════════════════════════════════════════════════════════╝
  108. }
  109.  
  110.  
  111. Type TSpdBtn=Class(TBitBtn)
  112.            Procedure DoRedraw(Const rec:TRect);
  113.      End;
  114.  
  115.  
  116. Procedure TSpdBtn.DoRedraw(Const rec:TRect);
  117. Begin
  118.      TBitBtn.Redraw(rec);
  119. End;
  120.  
  121. Procedure TSpinButton.ButtonOnPaint(Sender:TObject;Const rec:TRect);
  122. Begin
  123.      TSpdBtn(Sender).DoRedraw(rec);
  124. End;
  125.  
  126. Procedure TSpinButton.SetupComponent;
  127. Var Up,Down:TSpeedButton;
  128.     Bitmap:TBitmap;
  129. Begin
  130.      Inherited SetupComponent;
  131.  
  132.      Name:='SpinButton';
  133.      Width:=20;
  134.      Height:=25;
  135.  
  136.      //Get the buttons
  137.      //because they are declared as private, we have to use ASM :-(
  138.      Asm
  139.         PUSH DWORD PTR SELF
  140.         CALLN32 ComCtrls.GetUpRightButton
  141.         MOV Up,EAX
  142.  
  143.         PUSH DWORD PTR SELF
  144.         CALLN32 ComCtrls.GetDownLeftButton
  145.         MOV Down,EAX
  146.      End;
  147.  
  148.      Up.OnPaint:=ButtonOnPaint;
  149.      Bitmap.Create;
  150.      Bitmap.LoadFromResourceName('SpUp');
  151.      Up.NumGlyphs:=1;
  152.      Up.Glyph:=Bitmap;
  153.      Bitmap.Destroy;
  154.      Down.OnPaint:=ButtonOnPaint;
  155.      Bitmap.Create;
  156.      Bitmap.LoadFromResourceName('SpDown');
  157.      Down.NumGlyphs:=1;
  158.      Down.Glyph:=Bitmap;
  159.      Bitmap.Destroy;
  160.  
  161.      FUpButton:=Up;
  162.      FDownButton:=Down;
  163. End;
  164.  
  165. Function TSpinButton.GetDownGlyph:TBitmap;
  166. Begin
  167.      Result:=FDownButton.Glyph;
  168. End;
  169.  
  170. Procedure TSpinButton.SetDownGlyph(NewValue:TBitmap);
  171. Begin
  172.      FDownButton.Glyph:=NewValue;
  173. End;
  174.  
  175. Function TSpinButton.GetDownNumGlyphs:TNumGlyphs;
  176. Begin
  177.      Result:=FDownButton.NumGlyphs;
  178. End;
  179.  
  180. Procedure TSpinButton.SetDownNumGlyphs(NewValue:TNumGlyphs);
  181. Begin
  182.      FDownButton.NumGlyphs:=NewValue;
  183. End;
  184.  
  185. Function TSpinButton.GetUpGlyph:TBitmap;
  186. Begin
  187.      result:=FUpButton.Glyph;
  188. End;
  189.  
  190. Procedure TSpinButton.SetUpGlyph(NewValue:TBitmap);
  191. Begin
  192.      FUpButton.Glyph:=NewValue;
  193. End;
  194.  
  195. Function TSpinButton.GetUpNumGlyphs:TNumGlyphs;
  196. Begin
  197.      Result:=FUpButton.NumGlyphs;
  198. End;
  199.  
  200. Procedure TSpinButton.SetUpNumGlyphs(NewValue:TNumGlyphs);
  201. Begin
  202.      FUpButton.NumGlyphs:=NewValue;
  203. End;
  204.  
  205. {
  206. ╔═══════════════════════════════════════════════════════════════════════════╗
  207. ║                                                                           ║
  208. ║ Speed-Pascal/2 Version 2.0                                                ║
  209. ║                                                                           ║
  210. ║ Speed-Pascal Component Classes (SPCC)                                     ║
  211. ║                                                                           ║
  212. ║ This section: TSpinEdit Class Implementation                              ║
  213. ║                                                                           ║
  214. ║ (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited !       ║
  215. ║                                                                           ║
  216. ╚═══════════════════════════════════════════════════════════════════════════╝
  217. }
  218.  
  219.  
  220. Procedure TSpinEdit.SetupComponent;
  221. Begin
  222.      Inherited SetupComponent;
  223.  
  224.      Name:='SpinEdit';
  225.      Width:=100;
  226.  
  227.      FMinValue:=0;
  228.      FMaxValue:=100;
  229.      FIncrement:=1;
  230.      FSpinMode:=spSpinNumbers;
  231.      FEditorEnabled:=True;
  232.  
  233.      FItems:=TStringList.Create;
  234.  
  235.      FEdit:=TEdit.Create(Self);
  236.      Include(FEdit.ComponentState,csDetail);
  237.      FEdit.Width:=100-12;
  238.      FEdit.NumbersOnly:=True;
  239.      FEdit.OnResize:=EditResize;
  240.      FEdit.OnChange:=EditChange;
  241.      FEdit.ParentFont:=True;
  242.      FEdit.ParentColor:=True;
  243.      FEdit.ParentPenColor:=True;
  244.      FEdit.Parent:=Self;
  245.      Height:=FEdit.Height;
  246.  
  247.      FButton.Create(Self);
  248.      Include(FButton.ComponentState,csDetail);
  249.      FButton.SetWindowPos(80,0,12,Height);
  250.      FButton.FUpButton.OnClick:=ButtonClick;
  251.      FButton.FDownButton.OnClick:=ButtonClick;
  252.      FButton.ParentColor:=False;
  253.      FButton.ParentPenColor:=False;
  254.      FButton.Parent:=Self;
  255. End;
  256.  
  257. Procedure TSpinEdit.EditChange(Sender:TObject);
  258. Var i:LongInt;
  259.     c:Integer;
  260. Begin
  261.      If SpinMode<>spSpinNumbers Then exit;
  262.  
  263.      Val(FEdit.Text,i,c);
  264.      If ((c<>0)Or(i<MinValue)Or(i>MaxValue)) Then
  265.      Begin
  266.           If ((c=0)And(i<MinValue)) Then Value:=MinValue
  267.           Else If ((c=0)And(i>MaxValue)) Then Value:=MaxValue;
  268.      End
  269.      Else
  270.      Begin
  271.           FValue:=i;
  272.           If FEdit.Text<>tostr(FValue) Then FEdit.Text:=tostr(FValue);
  273.      End;
  274. End;
  275.  
  276. Procedure TSpinEdit.ButtonClick(Sender:TObject);
  277. Begin
  278.      If Sender=FButton.FUpButton Then
  279.      Begin
  280.           If SpinMode=spSpinNumbers Then
  281.           Begin
  282.                If Value<MaxValue Then Value:=Value+1;
  283.           End
  284.           Else
  285.           Begin
  286.                If Value<FItems.Count-1 Then Value:=Value+1;
  287.           End;
  288.      End
  289.      Else
  290.      Begin
  291.           If SpinMode=spSpinNumbers Then
  292.           Begin
  293.                If Value>MinValue Then Value:=Value-1;
  294.           End
  295.           Else
  296.           Begin
  297.                If Value>0 Then Value:=Value-1;
  298.           End;
  299.      End;
  300. End;
  301.  
  302. Procedure TSpinEdit.EditResize(Sender:TObject);
  303. Begin
  304.      If Height<>FEdit.Height Then Height:=FEdit.Height;
  305. End;
  306.  
  307. Procedure TSpinEdit.SetupShow;
  308. Begin
  309.      Inherited SetupShow;
  310.  
  311.      FEdit.Width:=Width-12;
  312.      FButton.Left:=Width-12;
  313.      Height:=FEdit.Height;
  314.      FButton.Height:=FEdit.Height;
  315.      If SpinMode=spSpinNumbers Then FEdit.Text:=tostr(Value)
  316.      Else If Value<FItems.Count Then FEdit.Text:=FItems[Value];
  317. End;
  318.  
  319. Destructor TSpinEdit.Destroy;
  320. Begin
  321.      FItems.Destroy;
  322.      FItems:=Nil;
  323.      Inherited Destroy;
  324. End;
  325.  
  326. Procedure TSpinEdit.Resize;
  327. Begin
  328.      Inherited Resize;
  329.  
  330.      If FEdit.Height<>Height Then FEdit.Height:=Height;
  331.      FEdit.Width:=Width-12;
  332.      FButton.Left:=Width-12;
  333.      FButton.Height:=Height;
  334. End;
  335.  
  336. Procedure TSpinEdit.SetMaxValue(NewValue:LongInt);
  337. Begin
  338.      FMaxValue:=NewValue;
  339.      If Value>FMaxValue Then Value:=FMaxValue;
  340. End;
  341.  
  342. Procedure TSpinEdit.SetMinValue(NewValue:LongInt);
  343. Begin
  344.      FMinValue:=NewValue;
  345.      If Value<FMinValue Then Value:=FMinValue;
  346. End;
  347.  
  348. Procedure TSpinEdit.SetValue(NewValue:LongInt);
  349. Begin
  350.      If SpinMode=spSpinNumbers Then
  351.      Begin
  352.           If ((NewValue<FMinValue)Or(NewValue>FMaxValue)) Then exit;
  353.      End
  354.      Else
  355.      Begin
  356.           If ((NewValue<0)Or(NewValue>FItems.Count-1)) Then exit;
  357.      End;
  358.      FValue:=NewValue;
  359.      If SpinMode=spSpinNumbers Then FEdit.Text:=tostr(FValue)
  360.      Else If FValue<FItems.Count Then FEdit.Text:=FItems[FValue];
  361. End;
  362.  
  363. Procedure TSpinEdit.SetEditorEnabled(NewValue:Boolean);
  364. Begin
  365.      FEditorEnabled:=NewValue;
  366.      FEdit.ReadOnly:=not NewValue;
  367. End;
  368.  
  369. Procedure TSpinEdit.SetItems(NewValue:TStrings);
  370. Begin
  371.      If NewValue <> FItems Then FItems.Assign(NewValue);
  372.      If SpinMode=spSpinList Then
  373.      Begin
  374.           If Value<0 Then Value:=0
  375.           Else If Value>FItems.Count-1 Then Value:=FItems.Count-1
  376.           Else FEdit.Text:=FItems[Value];
  377.      End;
  378. End;
  379.  
  380. Procedure TSpinEdit.SetSpinMode(NewValue:TSpinMode);
  381. Begin
  382.      FSpinMode:=NewValue;
  383.      If SpinMode=spSpinNumbers Then
  384.      Begin
  385.           If Value<MinValue Then Value:=MinValue
  386.           Else If Value>MaxValue Then Value:=MaxValue
  387.           Else FEdit.Text:=tostr(Value);
  388.           FEdit.ReadOnly:=not EditorEnabled;
  389.      End
  390.      Else
  391.      Begin
  392.           If Value<0 Then Value:=0
  393.           Else If Value>FItems.Count-1 Then Value:=FItems.Count-1
  394.           Else If Value<FItems.Count Then FEdit.Text:=FItems[Value];
  395.           FEdit.ReadOnly:=True;
  396.      End;
  397. End;
  398.  
  399. Const rnSpinEditItems='rnSpinEditItems';
  400.  
  401. Procedure TSpinEdit.ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);
  402. Var aText:PChar;
  403. Begin
  404.      If ResName = rnSpinEditItems Then
  405.      Begin
  406.           aText := @Data;
  407.           Items.SetText(aText);
  408.      End
  409.      Else Inherited ReadSCUResource(ResName,Data,DataLen);
  410. End;
  411.  
  412. Function TSpinEdit.WriteSCUResource(Stream:TResourceStream):Boolean;
  413. Var aText:PChar;
  414. Begin
  415.      Result:=Inherited WriteSCUResource(Stream);
  416.      If not Result Then exit;
  417.  
  418.      aText := Items.GetText;
  419.      If aText <> Nil Then
  420.      Begin
  421.           Result := Stream.NewResourceEntry(rnSpinEditItems,aText^,Length(aText^)+1);
  422.           StrDispose(aText);
  423.      End;
  424. End;
  425.  
  426. Begin
  427.      RegisterClasses([TSpinButton,TSpinEdit]);
  428. End.
  429.