Browse Source

* traling zero after . could not be inserted
* load/store was missing => CD not set on loading.
* log function was not implemented : ln is used,
should it rather be decimal logarithm ?

pierre 26 years ago
parent
commit
8c00a07def
1 changed files with 55 additions and 21 deletions
  1. 55 21
      ide/text/fpcalc.pas

+ 55 - 21
ide/text/fpcalc.pas

@@ -50,12 +50,12 @@ type
     function  CalcKey(Key: string): boolean;
     procedure Clear;
     procedure Draw; virtual;
-    function GetPalette: PPalette; virtual;
+    function  GetPalette: PPalette; virtual;
     procedure HandleEvent(var Event: TEvent); virtual;
     procedure Store(var S: TStream);
   private
     procedure GetDisplay(var R: extended);
-    procedure SetDisplay(R: extended);
+    procedure SetDisplay(R: extended;ShouldKeepZeroes : boolean);
     procedure Error;
   end;
 
@@ -66,6 +66,8 @@ type
     procedure   HandleEvent(var Event: TEvent); virtual;
     procedure   Show; virtual;
     procedure   Close; virtual;
+    constructor Load(var S: TStream);
+    procedure   Store(var S: TStream);
   end;
 
 {$ifndef NOOBJREG}
@@ -156,14 +158,26 @@ begin
   R:=DispNumber;
 end;
 
-procedure TCalcDisplay.SetDisplay(R: extended);
+procedure TCalcDisplay.SetDisplay(R: extended;ShouldKeepZeroes : boolean);
 var
   S: string[MaxDigits];
+  i,KeepZeroes : byte;
 begin
   DispNumber:=R;
+  KeepZeroes:=0;
+  if ShouldKeepZeroes and (pos('.',Number)>0) then
+    for i:=length(Number) downto pos('.',Number)+1 do
+      if Number[i]='0' then
+        inc(KeepZeroes)
+      else
+        break;
+
   Str(R: 0: MaxDecimals, S);
   if Pos('.',S)<>0 then
      while (length(S)>1) and (S[length(S)]='0') do Dec(S[0]);
+  if KeepZeroes>0 then
+    for i:=1 to KeepZeroes do
+      S:=S+'0';
   if S[1] <> '-' then Sign := ' ' else
   begin
     Delete(S, 1, 1);
@@ -193,9 +207,7 @@ begin
   if Status = csFirst then
   begin
     Status := csValid;
-{    Number := '0';
-    Sign := ' ';}
-    SetDisplay(0);
+    SetDisplay(0,false);
   end;
 end;
 begin
@@ -209,14 +221,15 @@ begin
         begin
 {          Status := csValid;}
           GetDisplay(R);
-          if Key='1/X' then begin if R=0 then Error else SetDisplay(1/R) end else
-          if Key='SQR' then begin if R<0 then Error else SetDisplay(sqrt(R)) end else
-          if Key='X^2' then SetDisplay(R*R) else
+          if Key='1/X' then begin if R=0 then Error else SetDisplay(1/R,false) end else
+          if Key='SQR' then begin if R<0 then Error else SetDisplay(sqrt(R),false) end else
+          if Key='LOG' then begin if R<=0 then Error else SetDisplay(ln(R),false) end else
+          if Key='X^2' then SetDisplay(R*R,false) else
           if Key='M+' then Memory:=Memory+R else
           if Key='M-' then Memory:=Memory-R else
-          if Key='M'#26 then SetDisplay(Memory) else
+          if Key='M'#26 then SetDisplay(Memory,false) else
           if Key='M'#27 then Memory:=R else
-          if Key='M'#29 then begin D:=Memory; Memory:=R; SetDisplay(D); end;
+          if Key='M'#29 then begin D:=Memory; Memory:=R; SetDisplay(D,false); end;
         end;
      end
   else
@@ -227,7 +240,7 @@ begin
         CheckFirst;
         if Number = '0' then Number := '';
         Number := Number + Key;
-        SetDisplay(StrToExtended(Number)); { !!! }
+        SetDisplay(StrToExtended(Number),true);
       end;
     '.':
       begin
@@ -238,7 +251,7 @@ begin
       begin
         CheckFirst;
         if Length(Number) = 1 then Number := '0' else Dec(Number[0]);
-        SetDisplay(StrToExtended(Number)); { !!! }
+        SetDisplay(StrToExtended(Number),true); { !!! }
       end;
     '_', #241:
       if Sign = ' ' then Sign := '-' else Sign := ' ';
@@ -254,11 +267,11 @@ begin
               '*', '/': R := R / 100;
             end;
           case _Operator of
-            '^': SetDisplay(Power(Operand,R));
-            '+': SetDisplay(Operand + R);
-            '-': SetDisplay(Operand - R);
-            '*': SetDisplay(Operand * R);
-            '/': if R = 0 then Error else SetDisplay(Operand / R);
+            '^': SetDisplay(Power(Operand,R),false);
+            '+': SetDisplay(Operand + R,false);
+            '-': SetDisplay(Operand - R,false);
+            '*': SetDisplay(Operand * R,false);
+            '/': if R = 0 then Error else SetDisplay(Operand / R,false);
           end;
         end;
         _Operator := Key[1];
@@ -400,7 +413,7 @@ begin
          begin
            CD^.GetDisplay(R);
            if R<>0 then begin
-                          CD^.SetDisplay(0);
+                          CD^.SetDisplay(0,false);
                           CD^.DrawView;
                         end
                    else Close;
@@ -408,9 +421,10 @@ begin
          end;
      end;
   end;
-  inherited HandleEvent(Event);
+  { lets CD try to handle this }
   if Event.What=evKeyDown then
      Message(CD,Event.What,Event.KeyCode,Event.InfoPtr);
+  inherited HandleEvent(Event);
 end;
 
 procedure TCalculator.Show;
@@ -424,6 +438,20 @@ begin
   Hide;
 end;
 
+constructor TCalculator.Load(var S: TStream);
+begin
+  inherited Load(S);
+  GetSubViewPtr(S,CD);
+end;
+
+procedure TCalculator.Store(var S: TStream);
+begin
+  inherited Store(S);
+  PutSubViewPtr(S,CD);
+end;                                                                                                                                                                                                                                                           
+
+                                                                                                                                                                                                                                                               
+
 procedure RegisterFPCalc;
 begin
 {$ifndef NOOBJREG}
@@ -436,7 +464,13 @@ end;
 end.
 {
   $Log$
-  Revision 1.5  1999-06-28 19:25:35  peter
+  Revision 1.6  1999-09-07 09:20:52  pierre
+    * traling zero after . could not be inserted
+    * load/store was missing => CD not set on loading.
+    * log function was not implemented : ln is used,
+      should it rather be decimal logarithm ?
+
+  Revision 1.5  1999/06/28 19:25:35  peter
     * fixes from gabor
 
   Revision 1.4  1999/04/07 21:55:41  peter