iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 4
0
自我挑戰組

delphi 菜鳥入門日記系列 第 4

delphi 菜鳥入門日記-Day4計算機補充說明

大家好!我是Kiang很高興又見到大家,
不過我要先跟大家講一個不好的消息,我確定要進去軍中盡我應當的義務QQ
也有看到網友留言,一中斷就重算....
不過想我還是會盡量撥空找時間更新的,
就算我事情多到必須要加班嗚嗚/images/emoticon/emoticon06.gif

由於今天我加班比較晚下班,沒有時間準備我的東西,
所以我就來講解一下昨天的計算機我後來發現的BUG吧!!(趕工出來的東西...看來我還差的遠呢)
不知道認真的各位有沒有發現呢?
其實昨天的計算機沒辦法算小數點、在特定情況時按下 = 時會刪除運算元!?
OK!首先小數點就請幫我建立一個新的按鍵事件

procedure TForm5.btn16Click(Sender: TObject);
begin
  edt1.Text:=edt1.Text+'.';
end;

然後改一下我們計算的公式

procedure TForm5.CalResult;
var
  num1,num2:Double;    //請幫我把型態從Int變成Double
begin
  if (Pos('+',edt1.text)>0) then
    if Pos('+',edt1.text)<>Length(edt1.Text) then
      NumL.Delimiter:='+'
    else
      edt1.Text:=Copy(edt1.Text,1,Length(edt1.Text)-1);
  if (Pos('-',edt1.text)>0) then
    if Pos('-',edt1.text)<>Length(edt1.Text) then
      NumL.Delimiter:='-'
    else
      edt1.Text:=Copy(edt1.Text,1,Length(edt1.Text)-1);
  if (Pos('*',edt1.text)>0) then
    if Pos('*',edt1.text)<>Length(edt1.Text) then
      NumL.Delimiter:='*'
    else
      edt1.Text:=Copy(edt1.Text,1,Length(edt1.Text)-1);
  if (Pos('/',edt1.text)>0) then
    if Pos('/',edt1.text)<>Length(edt1.Text) then
      NumL.Delimiter:='/'
    else
      edt1.Text:=Copy(edt1.Text,1,Length(edt1.Text)-1);

  NumL.DelimitedText:=edt1.Text;

  if (NumL.Count<2) then
    Exit;                                         //停止涵式

  num1:=StrToFloat(NumL[0]);      //改成StrToFloat
  num2:=StrToFloat(NumL[1]);      //改成StrToFloat
  if (Pos('+',edt1.text)>0) then
    edt1.Text:=FloatToStr(num1+num2);      //改成StrToFloat
  if (Pos('-',edt1.text)>0) then
    edt1.Text:=FloatToStr(num1-num2);      //改成StrToFloat
  if (Pos('*',edt1.text)>0) then
    edt1.Text:=FloatToStr(num1*num2);      //改成StrToFloat
  if (Pos('/',edt1.text)>0) then
  begin
    edt1.Text:=FloatToStr(num1/num2);
  end;
end;

好現在大家一定有疑惑,為什麼不直接宣告成Float就好了呢!!?
因為

delphi沒有float型態

不要問我為什麼,我也很疑惑!!
然後下面型態轉換還使用StrToFloat.....WTF/images/emoticon/emoticon04.gif
既然沒有那我們只好使用Double,可是卻沒有StrToDouble...

delphi你TM在耍人嗎!!!!/images/emoticon/emoticon03.gif

總之這樣就可以算有小數點的數值了!!
再來就是 = 按鍵事件

procedure TForm5.btn15Click(Sender: TObject);
var
  i:Integer;  //涵式需求
begin
  CalCheck;
  if NumC=1 then
  begin
    if TryStrToInt(Copy(edt1.Text,Length(edt1.Text),1),i) then //判斷最後一位是不是數值
      CalResult;
  end;
end;

TryStrToInt(字串,存值得變數)
Copy(字串,起始位置,取幾位)
這樣就可以避免在沒有第二數值時刪除運算元囉!!

再來還有一個很重要的事!!
除數不得為0,所以我們必須把她擋起來~

  num1:=StrToFloat(NumL[0]);      //改成StrToFloat
  num2:=StrToFloat(NumL[1]);      //改成StrToFloat
  if (Pos('+',edt1.text)>0) then
    edt1.Text:=FloatToStr(num1+num2);      //改成StrToFloat
  if (Pos('-',edt1.text)>0) then
    edt1.Text:=FloatToStr(num1-num2);      //改成StrToFloat
  if (Pos('*',edt1.text)>0) then
    edt1.Text:=FloatToStr(num1*num2);      //改成StrToFloat
  if (Pos('/',edt1.text)>0) then
    begin
      if num2<>0 then   //數值2不等於0時
        edt1.Text:=FloatToStr(num1/num2)
      else
        ShowMessage('除數不得為0');  //等於0時顯示訊息
    end;

然後你就會發現,挖 ~ / 越按越多(恩..bug就是這樣越來越多哈哈哈哈
所以

//在算成績的位置
  if (Pos('/',edt1.text)>0) then
    begin
     if num2<>0 then
       edt1.Text:=FloatToStr(num1/num2)
     else
     begin
       ShowMessage('除數不得為0');
       edt1.Text:=FloatToStr(num1);
     end;
    end;

這樣就可以確定部會一值新增 / 了

今天就到這裡,有想到甚麼要補充的東西會再回來補充,
總之我會盡力維持PO文習慣,就算我不能連續30天,
那我們下次見囉!!~睡覺去~


上一篇
delphi 菜鳥入門日記-Day3簡易計算機!?
系列文
delphi 菜鳥入門日記4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
彭偉鎧
iT邦研究生 3 級 ‧ 2017-12-07 23:55:39

加油!

0
彭偉鎧
iT邦研究生 3 級 ‧ 2017-12-07 23:55:41

加油!

我要留言

立即登入留言