begin ! Fil: ~in105/wndkalk.sim; external class Windowtools; ref(Register) reg; class Register; begin integer register, lager, operator, plus_op = 1, mult_op = 2, div_op = 3; procedure Sett(i); integer i; begin reg_vnd.Plasser(i); register := i end; procedure Siffer(s); integer s; Sett(register*10 + (if register < 0 then -s else +s)); procedure Null; Sett(0); procedure Tegn; Sett(-register); procedure Plus; Op(plus_op); procedure Mult; Op(mult_op); procedure Div; Op(div_op); procedure Op(O); integer o; begin lager := register; Null; operator := o end; procedure Equal; if operator = plus_op then Sett(lager + register) else if operator = mult_op then Sett(lager * register) else if operator = div_op and register ne 0 then Sett(lager / register) else reg_vnd.Feil; end; ref(RegisterVindu) reg_vnd; SubWindow class RegisterVindu; begin procedure Plasser(i); integer i; Vis(int_as_text(i)); procedure Feil; Vis("Feil!"); procedure Vis(t); text t; begin Clear; DrawTextPos(width - width_of_char('9'), height//2, t, RightPos, CenterPos); end; SetTypeFace("helvetica", 24, true, false); SetSize(width_of_text(" -1234567890 "), 3*font_height//2); Show; end; MainWindow class Kalkulator; begin ref(Button) null, tegn, lik, plus, mult, div, stopp; ref(Button) array Siffer(0 : 9); procedure ClickInButton(b); ref(Button) b; begin b.SetActive; Sleep(0.2); b.SetInactive; if b == null then reg.Null else if b == tegn then reg.Tegn else if b == plus then reg.Plus else if b == mult then reg.Mult else if b == div then reg.Div else if b == lik then reg.Equal else begin integer s; for s := 0 step 1 until 9 do if b == Siffer(s) then reg.Siffer(s); end; end; procedure LagTaster; begin integer taste_bredde, taste_hoyde; ref(Button) procedure LagTast(h); text h; LagTast :- MakeFancyButton(h) .SetTypeFace("helvetica", 24, true, false) .SetSize(taste_bredde, taste_hoyde); procedure SifTast(s); integer s; Siffer(s) :- LagTast(int_as_text(s)); taste_bredde := (reg_vnd.width - 2*(SubWindowSpacing + BorderWidth))//3; taste_hoyde := reg_vnd.height; stopp :- LagTast("Q").PlaceRightOf(reg_vnd); SetWidth(stopp.max_x + 2*SubWindowSpacing); SifTast(7); SifTast(8); SifTast(9); div :- LagTast("/"); SifTast(4); SifTast(5); SifTast(6); mult :- LagTast("*"); SifTast(1); SifTast(2); SifTast(3); plus :- LagTast("+"); SifTast(0); null :- LagTast("C"); tegn :- LagTast("+/-"); lik :- LagTast("="); end LagTaster; reg_vnd :- new RegisterVindu(this Kalkulator) .PlaceUpLeft; LagTaster; SetSizetoSubwindowsize; SetBackGround("gray25"); Show; stopp.Wait; end; reg :- new Register; new Kalkulator(" Kalkulator "); end;