source: trunk/Sibyl/Addon/SPIN.PAS@ 7

Last change on this file since 7 was 7, checked in by RBRi, 19 years ago

+ sibyl staff

  • Property svn:eol-style set to native
File size: 12.3 KB
Line 
1Unit Spin;
2
3Interface
4
5Uses SysUtils,Classes,Forms,Graphics,StdCtrls,Buttons,ComCtrls;
6
7Type
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
92Implementation
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
111Type TSpdBtn=Class(TBitBtn)
112 Procedure DoRedraw(Const rec:TRect);
113 End;
114
115
116Procedure TSpdBtn.DoRedraw(Const rec:TRect);
117Begin
118 TBitBtn.Redraw(rec);
119End;
120
121Procedure TSpinButton.ButtonOnPaint(Sender:TObject;Const rec:TRect);
122Begin
123 TSpdBtn(Sender).DoRedraw(rec);
124End;
125
126Procedure TSpinButton.SetupComponent;
127Var Up,Down:TSpeedButton;
128 Bitmap:TBitmap;
129Begin
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;
163End;
164
165Function TSpinButton.GetDownGlyph:TBitmap;
166Begin
167 Result:=FDownButton.Glyph;
168End;
169
170Procedure TSpinButton.SetDownGlyph(NewValue:TBitmap);
171Begin
172 FDownButton.Glyph:=NewValue;
173End;
174
175Function TSpinButton.GetDownNumGlyphs:TNumGlyphs;
176Begin
177 Result:=FDownButton.NumGlyphs;
178End;
179
180Procedure TSpinButton.SetDownNumGlyphs(NewValue:TNumGlyphs);
181Begin
182 FDownButton.NumGlyphs:=NewValue;
183End;
184
185Function TSpinButton.GetUpGlyph:TBitmap;
186Begin
187 result:=FUpButton.Glyph;
188End;
189
190Procedure TSpinButton.SetUpGlyph(NewValue:TBitmap);
191Begin
192 FUpButton.Glyph:=NewValue;
193End;
194
195Function TSpinButton.GetUpNumGlyphs:TNumGlyphs;
196Begin
197 Result:=FUpButton.NumGlyphs;
198End;
199
200Procedure TSpinButton.SetUpNumGlyphs(NewValue:TNumGlyphs);
201Begin
202 FUpButton.NumGlyphs:=NewValue;
203End;
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
220Procedure TSpinEdit.SetupComponent;
221Begin
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;
255End;
256
257Procedure TSpinEdit.EditChange(Sender:TObject);
258Var i:LongInt;
259 c:Integer;
260Begin
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;
274End;
275
276Procedure TSpinEdit.ButtonClick(Sender:TObject);
277Begin
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;
300End;
301
302Procedure TSpinEdit.EditResize(Sender:TObject);
303Begin
304 If Height<>FEdit.Height Then Height:=FEdit.Height;
305End;
306
307Procedure TSpinEdit.SetupShow;
308Begin
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];
317End;
318
319Destructor TSpinEdit.Destroy;
320Begin
321 FItems.Destroy;
322 FItems:=Nil;
323 Inherited Destroy;
324End;
325
326Procedure TSpinEdit.Resize;
327Begin
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;
334End;
335
336Procedure TSpinEdit.SetMaxValue(NewValue:LongInt);
337Begin
338 FMaxValue:=NewValue;
339 If Value>FMaxValue Then Value:=FMaxValue;
340End;
341
342Procedure TSpinEdit.SetMinValue(NewValue:LongInt);
343Begin
344 FMinValue:=NewValue;
345 If Value<FMinValue Then Value:=FMinValue;
346End;
347
348Procedure TSpinEdit.SetValue(NewValue:LongInt);
349Begin
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];
361End;
362
363Procedure TSpinEdit.SetEditorEnabled(NewValue:Boolean);
364Begin
365 FEditorEnabled:=NewValue;
366 FEdit.ReadOnly:=not NewValue;
367End;
368
369Procedure TSpinEdit.SetItems(NewValue:TStrings);
370Begin
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;
378End;
379
380Procedure TSpinEdit.SetSpinMode(NewValue:TSpinMode);
381Begin
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;
397End;
398
399Const rnSpinEditItems='rnSpinEditItems';
400
401Procedure TSpinEdit.ReadSCUResource(Const ResName:TResourceName;Var Data;DataLen:LongInt);
402Var aText:PChar;
403Begin
404 If ResName = rnSpinEditItems Then
405 Begin
406 aText := @Data;
407 Items.SetText(aText);
408 End
409 Else Inherited ReadSCUResource(ResName,Data,DataLen);
410End;
411
412Function TSpinEdit.WriteSCUResource(Stream:TResourceStream):Boolean;
413Var aText:PChar;
414Begin
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;
424End;
425
426Begin
427 RegisterClasses([TSpinButton,TSpinEdit]);
428End.
Note: See TracBrowser for help on using the repository browser.