/[projects]/dao/DelphiScanner/Components/tpsystools_4.04/examples/Delphi/monycal0.pas
ViewVC logotype

Contents of /dao/DelphiScanner/Components/tpsystools_4.04/examples/Delphi/monycal0.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2671 - (show annotations) (download)
Tue Aug 25 18:15:15 2015 UTC (8 years, 9 months ago) by torben
File size: 13376 byte(s)
Added tpsystools component
1 (* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Original Code is TurboPower SysTools
15 *
16 * The Initial Developer of the Original Code is
17 * TurboPower Software
18 *
19 * Portions created by the Initial Developer are Copyright (C) 1996-2002
20 * the Initial Developer. All Rights Reserved.
21 *
22 * Contributor(s):
23 *
24 * ***** END LICENSE BLOCK ***** *)
25
26 unit monycal0;
27
28 interface
29
30 uses
31 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
32 StdCtrls, Buttons, ExtCtrls, Menus, ClipBrd,
33
34 StStrL, StDecMth, StMoney;
35
36 const
37 DefaultCurrency = 'USD';
38 BaseFormCaption = 'Money Calculator';
39
40 type
41 MoneyCharSet = set of Char;
42 MoneyOperSet = set of Char;
43
44 type
45 TMoneyCalcDlg = class(TForm)
46 GroupBox1: TGroupBox;
47 ZeroBtn: TBitBtn;
48 DecKey: TBitBtn;
49 ThreeKey: TBitBtn;
50 OneKey: TBitBtn;
51 TwoKey: TBitBtn;
52 SixKey: TBitBtn;
53 FourKey: TBitBtn;
54 FiveKey: TBitBtn;
55 NineKey: TBitBtn;
56 SevenKey: TBitBtn;
57 EightKey: TBitBtn;
58 AddBtn: TBitBtn;
59 SubBtn: TBitBtn;
60 MulBtn: TBitBtn;
61 DivBtn: TBitBtn;
62 PlusMinusBtn: TBitBtn;
63 ClearBtn: TBitBtn;
64 EqualBtn: TBitBtn;
65 ClearEntryBtn: TBitBtn;
66 GroupBox2: TGroupBox;
67 Label1: TLabel;
68 ComboBox1: TComboBox;
69 ComboBox2: TComboBox;
70 ConvertBtn: TBitBtn;
71 ListBox1: TListBox;
72 ListBox2: TListBox;
73 Memo1: TMemo;
74 BSBtn: TBitBtn;
75 PopupMenu1: TPopupMenu;
76 Copy1: TMenuItem;
77 Paste1: TMenuItem;
78 procedure NumBtnClick(Sender: TObject);
79 procedure DecKeyClick(Sender: TObject);
80 procedure ClearBtnClick(Sender: TObject);
81 procedure ClearEntryBtnClick(Sender: TObject);
82 procedure AddBtnClick(Sender: TObject);
83 procedure SubBtnClick(Sender: TObject);
84 procedure MulBtnClick(Sender: TObject);
85 procedure DivBtnClick(Sender: TObject);
86 procedure PlusMinusBtnClick(Sender: TObject);
87 procedure FormKeyPress(Sender: TObject; var Key: Char);
88 procedure EqualBtnClick(Sender: TObject);
89 procedure FormCreate(Sender: TObject);
90 procedure FormDestroy(Sender: TObject);
91 procedure ComboBox1Change(Sender: TObject);
92 procedure ConvertBtnClick(Sender: TObject);
93 procedure ComboBox2Change(Sender: TObject);
94 procedure Memo1KeyDown(Sender: TObject; var Key: Word;
95 Shift: TShiftState);
96 procedure BSBtnClick(Sender: TObject);
97 procedure Copy1Click(Sender: TObject);
98 procedure Paste1Click(Sender: TObject);
99 private
100 procedure UpdateConversionCombo;
101 procedure UpdateCurrencyCombo;
102 procedure UpdateFormCaption;
103 procedure ShowExchangeData(const src, trg: string);
104 procedure ShowCurrencyData(const Name : string);
105 { Private declarations }
106 public
107 MoneyChar : MoneyCharSet;
108 MoneyOper : MoneyOperSet;
109 PendOp : Char;
110 DFHold : Integer;
111 XBuffer : string[20];
112 ClearOnNext, Converting : Boolean;
113 BaseCurrency : string;
114
115 Currencies : TStCurrencyList;
116 Conversions : TStExchangeRateList;
117
118 procedure SendKeyPress(Sender : TObject; C : Char);
119 procedure DoRateUpdate(Sender: TObject; NewRate: TStDecimal;
120 var NewDate: TDateTime);
121 { Public declarations }
122 end;
123
124 var
125 MoneyCalcDlg: TMoneyCalcDlg;
126
127 implementation
128
129 {$R *.DFM}
130
131 procedure TMoneyCalcDlg.UpdateFormCaption;
132 begin
133 if BaseCurrency <> '' then
134 Caption := BaseFormCaption + '-' + BaseCurrency
135 else
136 Caption := BaseFormCaption;
137 end;
138
139 procedure TMoneyCalcDlg.FormCreate(Sender: TObject);
140 begin
141 MoneyChar := ['0'..'9', SysUtils.DecimalSeparator, '~'];
142 MoneyOper := ['+', '-', '/', '*'];
143 DecKey.Caption := SysUtils.DecimalSeparator;
144 Memo1.Lines[0] := '0';
145
146 PendOp := #0;
147 DFHold := 0;
148 XBuffer := '0';
149 ClearOnNext := False;
150
151 Currencies := TStCurrencyList.Create;
152 Currencies.LoadFromFile('..\..\STCCY.DAT');
153 UpdateCurrencyCombo;
154 ComboBox1.Text := DefaultCurrency;
155 ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(ComboBox1.Text);
156 BaseCurrency := ComboBox1.Text;
157 ShowCurrencyData(ComboBox1.Text);
158
159 Conversions := TStExchangeRateList.Create;
160 Conversions.LoadFromFile('..\..\STCCYCNV.DAT');
161 UpdateConversionCombo;
162
163 UpdateFormCaption;
164 end;
165
166 procedure TMoneyCalcDlg.FormDestroy(Sender: TObject);
167 begin
168 Currencies.Free;
169 Conversions.Free;
170 end;
171
172 procedure TMoneyCalcDlg.SendKeyPress(Sender : TObject; C : Char);
173 var
174 KP : Char;
175 begin
176 KP := C;
177 FormKeyPress(Sender,KP);
178 end;
179
180 procedure TMoneyCalcDlg.NumBtnClick(Sender: TObject);
181 var
182 C : Char;
183 begin
184 C := IntToStr((Sender as TBitBtn).Tag)[1];
185 SendKeyPress(Sender, C);
186 end;
187
188 procedure TMoneyCalcDlg.DecKeyClick(Sender: TObject);
189 begin
190 SendKeyPress(Sender, SysUtils.DecimalSeparator);
191 end;
192
193 procedure TMoneyCalcDlg.ClearBtnClick(Sender: TObject);
194 begin
195 XBuffer := '0.';
196 Memo1.Lines[0] := '0.';
197 PendOp := #0;
198 ClearOnNext := True;
199 end;
200
201 procedure TMoneyCalcDlg.ClearEntryBtnClick(Sender: TObject);
202 begin
203 Memo1.Lines[0] := '0.';
204 ClearOnNext := True;
205 end;
206
207 procedure TMoneyCalcDlg.AddBtnClick(Sender: TObject);
208 begin
209 SendKeyPress(Sender,'+');
210 end;
211
212 procedure TMoneyCalcDlg.SubBtnClick(Sender: TObject);
213 begin
214 SendKeyPress(Sender,'-');
215 end;
216
217 procedure TMoneyCalcDlg.MulBtnClick(Sender: TObject);
218 begin
219 SendKeyPress(Sender,'*');
220
221 end;
222
223 procedure TMoneyCalcDlg.DivBtnClick(Sender: TObject);
224 begin
225 SendKeyPress(Sender,'/');
226 end;
227
228 procedure TMoneyCalcDlg.PlusMinusBtnClick(Sender: TObject);
229 begin
230 SendKeyPress(Sender,'~');
231 end;
232
233 procedure TMoneyCalcDlg.FormKeyPress(Sender: TObject; var Key: Char);
234 var
235 HldOp : Char;
236 L : Integer;
237 Money1 : TStMoney;
238 S : string[21];
239 begin
240 Money1 := TStMoney.Create;
241
242 if Memo1.Lines[0] = '0' then
243 Memo1.Lines[0] := '';
244
245 try
246
247 if Key = #13 then begin
248 if XBuffer = '0' then begin
249 XBuffer := Memo1.Lines[0];
250 end
251 else begin
252 EqualBtnClick(Sender);
253 XBuffer := '0';
254 end;
255 Key := #0;
256 ClearOnNext := True;
257 end;
258
259 if Key in MoneyChar then begin
260 if (Length(Memo1.Lines[0]) = 0) and (Key = SysUtils.DecimalSeparator) then
261 Memo1.Lines[0] := '0';
262 if (Key = '~') then begin
263 S := Memo1.Lines[0];
264
265 if (S[1] <> '-') then
266 Insert('-',S,1)
267 else
268 Delete(S,1,1);
269 Memo1.Lines[0] := S;
270 Money1.Amount.AsString := S;
271 Key := #0;
272 end else begin
273 if ClearOnNext then begin
274 Memo1.Lines[0] := '';
275 ClearOnNext := False;
276 end;
277 end;
278 end;
279
280 if Key in MoneyOper then begin
281 if not (Key in ['s', 'e', 'l']) then begin
282 if Memo1.Lines[0] = '' then
283 Memo1.Lines[0] := '0';
284 if (XBuffer <> '0') then
285 EqualBtnClick(Sender);
286 XBuffer := Memo1.Lines[0];
287 Money1.Amount.AsString := XBuffer;
288 PendOp := Key;
289 Key := #0;
290 ClearOnNext := True;
291 end else begin
292 HldOp := PendOp;
293 PendOp := Key;
294 EqualBtnClick(Sender);
295 PendOp := HldOp;
296 Key := #0;
297 end;
298 end;
299
300 if (Key in MoneyChar) then begin
301 S := Memo1.Lines[0];
302 L := Length(S);
303 if (L < Memo1.MaxLength) then begin
304 Memo1.Lines[0] := S + Key;
305 end;
306
307 Key := #0
308 end;
309
310 Memo1.SetFocus;
311 Memo1.SelStart := Length(Memo1.Lines[0]);
312 Memo1.SelLength := 0;
313
314 finally
315 Money1.Free;
316 end;
317 end;
318
319 procedure TMoneyCalcDlg.EqualBtnClick(Sender: TObject);
320 var
321 S : AnsiString;
322 RV, Money : TStMoney;
323 begin
324 RV := TStMoney.Create;
325 Money := TStMoney.Create;
326
327 try
328 if PendOp <> #0 then begin
329 S := Memo1.Lines[0];
330 if S = '' then begin
331 MessageBeep(0);
332 Exit;
333 end;
334
335 RV.Amount.AsString := XBuffer;
336 Money.Amount.AsString := S;
337
338 case PendOp of
339 '+' : begin
340 RV.Add(Money, RV);
341 Memo1.Lines[0] := RV.AsString;
342 end;
343
344 '-' : begin
345 RV.Subtract(Money, RV);
346 Memo1.Lines[0] := RV.AsString;
347 end;
348
349 '*' : begin
350 RV.Multiply(StrToFloat(S), RV);
351 Memo1.Lines[0] := RV.AsString;
352 end;
353
354 '/' : begin
355 if Money.IsZero then begin
356 Memo1.Lines[0] := 'Divide by zero error';
357 PendOp := #0;
358 ClearOnNext := False;
359 end else begin
360 RV.Divide(StrToFloat(S), RV);
361 Memo1.Lines[0] := RV.AsString;
362 end;
363 end;
364
365 end; { case }
366
367 end;
368
369 PendOp := #0;
370 ClearOnNext := True;
371
372 Memo1.SetFocus;
373 Memo1.SelStart := 0;
374 Memo1.SelLength := 0;
375 finally
376 Money.Free;
377 RV.Free;
378 end;
379 end;
380
381 procedure TMoneyCalcDlg.UpdateCurrencyCombo;
382 var
383 i : Integer;
384 begin
385 ComboBox1.Items.BeginUpdate;
386 ComboBox1.Items.Clear;
387 for i := 0 to Pred(Currencies.Count) do
388 ComboBox1.Items.Add(Currencies.Items[i].ISOName);
389 ComboBox1.Text := '';
390 ComboBox1.Items.EndUpdate;
391 end;
392
393 procedure TMoneyCalcDlg.UpdateConversionCombo;
394 var
395 i : Integer;
396 begin
397 ComboBox2.Items.BeginUpdate;
398 ComboBox2.Items.Clear;
399 for i := 0 to Pred(Conversions.Count) do
400 if Conversions.Items[i].Source = BaseCurrency then
401 ComboBox2.Items.Add(Conversions.Items[i].Target);
402 ComboBox2.Text := '';
403 ComboBox2.Items.EndUpdate;
404 ListBox2.Clear;
405 end;
406
407 procedure TMoneyCalcDlg.ShowCurrencyData(const Name : string);
408 var
409 Cur : TStCurrency;
410 begin
411 Cur := Currencies.Currencies[Name];
412 ListBox1.Items.Clear;
413 ListBox1.Items.Add('Name:' + #9 + Cur.Name);
414 ListBox1.Items.Add('ISOName:' + #9 + Cur.ISOName);
415 ListBox1.Items.Add('ISOCode:' + #9 + Cur.ISOCode);
416 ListBox1.Items.Add('Major:' + #9 + Cur.UnitMajor);
417 ListBox1.Items.Add('Minor:' + #9 + Cur.UnitMinor);
418
419 if ComboBox2.Text <> '' then
420 ShowExchangeData(Name, ComboBox2.Text);
421 end;
422
423 procedure TMoneyCalcDlg.ComboBox1Change(Sender: TObject);
424 begin
425 BaseCurrency := ComboBox1.Text;
426 UpdateConversionCombo;
427 UpdateFormCaption;
428 ShowCurrencyData(BaseCurrency);
429 end;
430
431 procedure TMoneyCalcDlg.ConvertBtnClick(Sender: TObject);
432 var
433 CV : TStMoney;
434 begin
435 CV := TStMoney.Create;
436
437 try
438 CV.ExchangeRates := Conversions;
439 CV.Amount.AsString := Memo1.Lines[0];
440 CV.Currency := ComboBox1.Text;
441
442 CV.Convert(ComboBox2.Text, CV);
443 Memo1.Lines[0] := CV.AsString;
444 finally
445 CV.Free;
446 end;
447 end;
448
449 procedure TMoneyCalcDlg.ShowExchangeData(const src, trg : string);
450 var
451 Cur : TStCurrency;
452 Rate : TStExchangeRate;
453 begin
454 Cur := Currencies.Currencies[trg];
455 Rate := Conversions.Rates[src, trg];
456
457 ListBox2.Items.Clear;
458 case Rate.ConversionType of
459 ctTriangular: begin
460 ListBox2.Items.Add('Name:' + #9 + Cur.Name);
461 ListBox2.Items.Add(src + '->' + trg + ' inter.: ' + Rate.Intermediate);
462 end;
463
464 ctMultiply: begin
465 ListBox2.Items.Add('Name: ' + #9 + Cur.Name);
466 ListBox2.Items.Add(src + '->' + trg + ' multiply by: ' + Rate.Rate.AsString);
467 end;
468
469 ctDivide: begin
470 ListBox2.Items.Add('Name: ' + #9 + Cur.Name);
471 ListBox2.Items.Add(src + '->' + trg + ' divide by: ' + Rate.Rate.AsString);
472 end;
473 end;
474
475 end;
476
477 procedure TMoneyCalcDlg.ComboBox2Change(Sender: TObject);
478 begin
479 ShowExchangeData(ComboBox1.Text, ComboBox2.Text);
480 end;
481
482 procedure GetRateAndDate(var Rate, Date: string);
483 begin
484
485 end;
486
487 procedure TMoneyCalcDlg.DoRateUpdate(Sender: TObject;
488 NewRate : TStDecimal; var NewDate : TDateTime);
489 var
490 ARate, ADate : string;
491 begin
492 GetRateAndDate(ARate, ADate);
493 NewRate.AsString := ARate;
494 NewDate := StrToDateTime(ADate);
495 end;
496
497
498
499 procedure TMoneyCalcDlg.Memo1KeyDown(Sender: TObject; var Key: Word;
500 Shift: TShiftState);
501 begin
502 if Key = VK_DOWN then
503 Key := 0;
504 end;
505
506 procedure TMoneyCalcDlg.BSBtnClick(Sender: TObject);
507 begin
508 Memo1.Lines[0] := Copy(Memo1.Lines[0], 1, Length(Memo1.Lines[0]) - 1);
509 if Length(Memo1.Lines[0]) = 0 then
510 ClearBtnClick(ClearBtn);
511 end;
512
513 procedure TMoneyCalcDlg.Copy1Click(Sender: TObject);
514 begin
515 Memo1.SelectAll;
516 Memo1.CopyToClipboard;
517 Memo1.SelStart := 0;
518 end;
519
520 procedure TMoneyCalcDlg.Paste1Click(Sender: TObject);
521 var
522 S : string;
523 IsNeg : Boolean;
524 begin
525 IsNeg := False;
526 S := Clipboard.AsText;
527 if (S[1] = '-') then begin
528 IsNeg := True;
529 S := Copy(S, 2, Length(S) - 1);
530 end;
531
532 if IsStrNumericL(S, '0123456789' + SysUtils.DecimalSeparator) then begin
533 if IsNeg then S := '-' + S;
534 Memo1.Lines[0] := S;
535 end;
536 end;
537
538 end.
539

  ViewVC Help
Powered by ViewVC 1.1.20