主要应用了:
1. 手动创建控件及释放;
2. 绑定控件事件;
代码如下:
unit uFormMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
const CalcCount = 5;
type
TFormMain = class(TForm)
edtExpression: TEdit;
pnlNum: TPanel;
btnClose: TButton;
pnlCalc: TPanel;
btnClear: TButton;
stat1: TStatusBar;
btnBackspace: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnNumClick(Sender: TObject);
procedure btnCalcClick(Sender: TObject);
procedure btnClearClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure edtExpressionKeyPress(Sender: TObject; var Key: Char);
procedure btnBackspaceClick(Sender: TObject);
private
{ Private declarations }
public
btnNum: array[0..9] of TButton;
btnCalc: array[0..CalcCount - 1] of TButton;
{ Public declarations }
end;
const
CalcOpts: array[0..CalcCount - 1] of Char = ('+', '-', '*', '/', '=');
var
FormMain: TFormMain;
Result: Integer = 0;
Opt: Char; // perior operator
implementation
{$R *.dfm}
procedure TFormMain.btnCalcClick(Sender: TObject);
var
c: Char;
begin
if edtExpression.Text ='' then Exit;
//edtExpression.Text := edtExpression.Text + (Sender as TButton).Caption;
c := (Sender as Tbutton).Caption[1];
if Opt <> '' then
begin
case Opt of
'+':
begin
Result := Result + StrToInt(edtExpression.Text);
end;
'-':
begin
Result := Result - StrToInt(edtExpression.Text);
end;
'*':
begin
Result := Result * StrToInt(edtExpression.Text);
end;
'/':
begin
if StrToInt(edtExpression.Text) = 0 then Exit;
Result := Result div StrToInt(edtExpression.Text);
end;
'=':
begin
end;
end;
end
else
Result := StrToInt(edtExpression.Text);
if (c <> '=') then
begin
edtExpression.Text := '0';
end
else
edtExpression.Text := IntToStr(Result);
Opt := c;
stat1.SimpleText := IntToStr(Result);
end;
procedure TFormMain.btnNumClick(Sender: TObject);
begin
edtExpression.Text := IntToStr(StrToInt(edtExpression.Text) * 10
+ StrToInt((Sender as TButton).Caption));
end;
procedure TFormMain.FormCreate(Sender: TObject);
var
i: Integer;
begin
{ TODO : 初始化数字键 }
for i := Low(btnNum) to High(btnNum) do
begin
btnNum[i] := TButton.Create(Self);
with btnNum[i] do
begin
Parent := pnlNum;
Left := 20 + (i mod 3) * 50;
Top := 10 + ( i div 3) * 40;
Width := 30;
Height := 30;
Caption := IntToStr((i+1) mod 10);
OnClick := btnNumClick;
end;
end;
// 初始化运算符键
for i := 0 to CalcCount - 1 do
begin
btnCalc[i] := TButton.Create(Self);
with btnCalc[i] do
begin
Parent := pnlCalc;
Left := 10;
Top := 5 + i * 35;
Width := 30;
Height := 30;
Caption := CalcOpts[i];
Font.Size := 12;
Font.Style := Font.Style + [fsBold];
OnClick := btnCalcClick;
end;
end;
stat1.SimplePanel := True;
edtExpression.Text := '0';
end;
procedure TFormMain.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i := Low(btnNum) to High(btnNum) do
begin
if Assigned(btnNum[i]) then
FreeAndNil(btnNum);
end;
for i := Low(btnCalc) to High(btnCalc) do
begin
if Assigned(btnCalc[i]) then
FreeAndNil(btnCalc);
end;
end;
procedure TFormMain.btnClearClick(Sender: TObject);
begin
edtExpression.Text := '0';
Result := 0;
stat1.SimpleText := IntToStr(Result);
end;
procedure TFormMain.btnCloseClick(Sender: TObject);
begin
Close;
end;
procedure TFormMain.edtExpressionKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0' .. '9']) then Key := #0;
end;
procedure TFormMain.btnBackspaceClick(Sender: TObject);
begin
edtExpression.Text := IntToStr(StrToInt(edtExpression.Text) div 10);
end;
end.
