Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

Каким же должен быть калькулятор ?   Найти похожие ветки 

 
Нуб   (2007-03-13 16:22) [0]

Вообщем :), дописал я свое детище-калькулятище , кто хочет может юзать бесплатно, код корявый , но за то почти все работает , спервого взгляда :), прошу сильно не ругать , если кто-то что то допишет, гив ит ту ми плиз :)

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TCalc = class(TForm)
   btnSeven: TButton;
   btnEight: TButton;
   btnNine: TButton;
   btnFour: TButton;
   btnFive: TButton;
   btnSix: TButton;
   btnOne: TButton;
   btnTwo: TButton;
   btnThree: TButton;
   btnZero: TButton;
   btnPlus: TButton;
   btnMinus: TButton;
   btnEqual: TButton;
   Edit1: TEdit;
   Memo1: TMemo;
   btnCancel: TButton;
   Label1: TLabel;
   btnMultiply: TButton;
   Button1: TButton;
   btnDivide: TButton;
   btnBackspace: TButton;
   Label2: TLabel;
   procedure FormShow(Sender: TObject);
   procedure btnCancelClick(Sender: TObject);

   procedure onbtnClick(Sender : TObject);           // on click   0..9
   function btnName(Sender: TObject) : TButton;      // return name of the button
   procedure onSummaMinusClick (Sender : TObject);   // 1,+,34  res = 35; 32,-,12 res = 20
   procedure btnEqualClick(Sender: TObject);
   function summaminus(str1: String; str2: String; str3: String) : string;
   procedure Button1Click(Sender: TObject);
   procedure ErrorMessage;
   procedure btnBackspaceClick(Sender: TObject);

 private

   { Private declarations }
 public
   { Public declarations }
 end;

var
 Calc: TCalc;
 bolequal : boolean;
 bolclick : Boolean;
 bolonSummaMinusClick : boolean;
 error : boolean;
 backspace : boolean;

implementation

{$R *.dfm}
//******************************************************************************** ***
procedure TCalc.onbtnClick(Sender : TObject);
var btn : TButton;
begin
  bolclick := true;
  backspace := false;
  if bolonSummaMinusClick then begin
     Edit1.Text := "";
     bolonSummaMinusClick := false;
  end;
  btn := btnName(Sender);
  if (Sender as TButton) = btnZero  then begin
     if Trim(Edit1.Text) = "0" then
        Edit1.Text := "0"
     else begin
              Edit1.Text := Edit1.Text + "0";
              Label1.Caption := Label1.Caption + "0";
          end;
  end else
  if (Sender as TButton) = btn then  begin
     if Edit1.Text <> "0" then begin
         Edit1.Text := Edit1.Text + btn.Caption;
         Label1.Caption := Label1.Caption + btn.Caption;
     end
     else begin Edit1.Text := btn.Caption;
           Label1.Caption := Label1.Caption + btn.Caption;
     end;
  end;
end;
//******************************************************************************** ***
function TCalc.btnName(Sender: TObject) : TButton;       // return name of the button
begin

  if (Sender as TButton) = btnOne then result := btnOne else
  if (Sender as TButton) = btnTwo then result := btnTwo else
  if (Sender as TButton) = btnThree then result := btnThree else
  if (Sender as TButton) = btnFour then result := btnFour else
  if (Sender as TButton) = btnFive then result := btnFive else
  if (Sender as TButton) = btnSix then result := btnSix else
  if (Sender as TButton) = btnSeven then result := btnSeven else
  if (Sender as TButton) = btnEight then result := btnEight else
  if (Sender as TButton) = btnNine then result := btnNine else
  if (Sender as TButton) = btnPlus then result := btnPlus else  // for result on onSummaMinusClick
  if (Sender as TButton) = btnMinus then result := btnMinus else
  if (Sender as TButton) = btnMultiply then result := btnMultiply else
  if (Sender as TButton) = btnDivide then result := btnDivide
  else result := nil ;

end;
//******************************************************************************** ***
procedure TCalc.onSummaMinusClick (Sender : TObject);
var btn : TButton;
begin
  backspace := false;
  if bolclick <> true then exit;
  if bolequal then begin     // if click on equal button then clear memo1 for new enter;
     memo1.Clear;
     bolequal := false;
  end;
  bolonSummaMinusClick := true;     // on click "+" or "-"

  btn := btnName(Sender);                // vnosim v memo zna4eniya 1+2+56+223-4566 i t.d.
  if (Sender as TButton) = btn then begin
   //  if Edit1.Text <> "0" then begin
        Memo1.Lines.Add(Trim(Edit1.Text));  // add number to memo
        if (Sender as TButton) = btnPlus then  begin
           if Memo1.Lines.Strings[Memo1.Lines.Count-1] = "" then Memo1.Lines.Strings[Memo1.Lines.Count-1] := "+" else
           Memo1.Lines.Add("+");
           Label1.Caption := Label1.Caption + "+";
           bolclick := false;
        end
        else if (Sender as TButton) = btnMinus then begin
           if Memo1.Lines.Strings[Memo1.Lines.Count-1] = "" then Memo1.Lines.Strings[Memo1.Lines.Count-1] := "-" else
                 Memo1.Lines.Add("-");
                 Label1.Caption := Label1.Caption + "-";
                 bolclick := false;
        end
        else if (Sender as TButton) = btnMultiply then  begin
           if Memo1.Lines.Strings[Memo1.Lines.Count-1] = "" then Memo1.Lines.Strings[Memo1.Lines.Count-1] := "*" else
               Memo1.Lines.Add("*");
               Label1.Caption := Label1.Caption + "*";
               bolclick := false;
        end
        else begin
           if Memo1.Lines.Strings[Memo1.Lines.Count-1] = "" then Memo1.Lines.Strings[Memo1.Lines.Count-1] := "/" else
               Memo1.Lines.Add("/");
               Label1.Caption := Label1.Caption + "/";
               bolclick := false;
             end;
        end;
   //  end;
end;
//********************************************************
........


 
Нуб   (2007-03-13 16:23) [1]


//******************************************************************************** ***
procedure TCalc.FormShow(Sender: TObject);
begin
  Edit1.Text := IntToStr(0);
  bolequal := false;
  bolonSummaMinusClick := false;
end;
//******************************************************************************** ***
procedure TCalc.btnEqualClick(Sender: TObject);           // click on "="
var i,  n: integer;
   line: array of string;
   kol : integer; // koli4estvo vseh operaciy
   summa : double;
begin
  error := false;
  kol := 0;
  summa := 0;
  n := 3;
  if (memo1.Lines.Count = 0) or (bolequal) then exit;
//   if Edit1.Text <> "0" then begin
     Memo1.Lines.Add(Trim(Edit1.Text));
//  end
//   else Memo1.Lines.Delete(Memo1.Lines.Count-1); // delete last "+" or "-" or "*"
  SetLength(line,Memo1.Lines.Count); // length of massiv
  for i:=0 to Memo1.Lines.Count-1 do begin
     line[i] := Memo1.Lines.Strings[i];
     if (line[i] = "+") or (line[i] = "-") or (line[i] = "*") or (line[i] = "/") then kol := kol + 1;   // kol operation
  end;
  try
  summa := StrToFloat(summaminus(line[0],line[1],line[2])); // first operation
  except
   on E : Exception do ErrorMessage;
  end;

  for i:=1 to kol-1 do begin
    try
     summa := StrToFloat(summaminus(FloatToStr(summa),line[n],line[n+1]));   //  summa(0,2),3,4 ; summa(0,2,4),5,6; summa(0,2,4,6) gde 1,3,5 - "+" ili "-"
    except
     on E : Exception do ErrorMessage;
    end;
     n := n + 2;    // 3,5,7       danie v memo    0,1,2,3,4,5,6,7,8,9
  end;
  if error <> true then begin   // if ne bilo divide on zero
  Label1.Caption := Label1.Caption + " = " + FloatToStr(summa);
  Edit1.Text := FloatToStr(summa);
  Memo1.Clear;
  Memo1.Lines.Strings[0] := FloatToStr(summa);
  end;                          // end if
  bolequal := true;
//   btnEqual.Enabled := false;
end;
//******************************************************************************** ***
function TCalc.summaminus(str1: String; str2: String; str3: String) : string;     // 1,+,34  res = 35; 32,-,12 res = 20
var d: Double;
begin
   if str2 = "+" then result := FloatToStr(StrToFloat(str1) + StrToFloat(str3))
   else if str2 = "-" then result := FloatToStr(StrToFloat(str1) - StrToFloat(str3))
    else if str2 = "*" then result := FloatToStr(StrToFloat(str1) * StrToFloat(str3))
     else result := FloatToStr(StrToFloat(str1) / StrToFloat(str3));
end;                                                                               // end function
//******************************************************************************** ***
procedure TCalc.btnCancelClick(Sender: TObject);  // o4istka vsego calculyatora
begin
   Memo1.Clear;
   Edit1.Text := "0";
   Label1.Caption := "";

end;
//******************************************************************************** ***
procedure TCalc.Button1Click(Sender: TObject);
begin
   if bolclick <> true then exit;

   if (Label1.Caption = "") and (Edit1.Text = "0") then begin      // dlya vvoda 1-go 4isla vvida 0,43545
     Edit1.Text := "0,";
     Label1.Caption := Label1.Caption + "0,";
     end else begin                                                 // end dlya vvoda 1-go 4isla vvida 0,43545
          Edit1.Text := Edit1.Text + ",";
          Label1.Caption := Label1.Caption + ",";
         end;
   bolclick := false;
end;

procedure TCalc.ErrorMessage;
begin
 ShowMessage("&Auml;&aring;&euml;&aring;&iacute;&egrave;&aring; &iacute;&agrave; &iacute;&icirc;&euml;&uuml; &iacute;&aring; &auml;&icirc;&iuml;&oacute;&ntilde;&ograve;&egrave;&igrave;&icirc;");
 Memo1.Clear;
 Edit1.Text := "0";
 Label1.Caption := "";
 error := true;
end;

procedure TCalc.btnBackspaceClick(Sender: TObject);
var
 Buffer, Buffer2: PChar;
begin
 if (Edit1.Text = "") and (Label1.Caption = "") then begin
     Memo1.Clear;
     exit;
 end;
 if (Edit1.Text = "") and (backspace = false)  then begin
    Memo1.Lines.Delete(memo1.Lines.Count-1);    // delete from memo "+" or  "-"  or "*" or "/"
    GetMem(Buffer2,Length(Label1.Caption));   // bilo 80+
    StrLCopy(Buffer2, PChar(Label1.Caption),Length(Label1.Caption)-1 );
    Label1.Caption := Buffer2;                // stalo 80
    FreeMem(Buffer2);
    backspace := true;
 exit;
 end;
 if backspace = true then exit;

  GetMem(Buffer2,Length(Label1.Caption));
  StrLCopy(Buffer2, PChar(Label1.Caption),Length(Label1.Caption)-1 );
  Label1.Caption := Buffer2;
  GetMem(Buffer,Length(Edit1.Text));
  StrLCopy(Buffer, PChar(Edit1.Text),Length(Edit1.Text)-1 );
  Edit1.Text := Buffer;
  FreeMem(Buffer);
  FreeMem(Buffer2);
end;

end.


 
Kolan ©   (2007-03-13 16:25) [2]

Ну ни нафиг код сюда постить? Выложи скриншоты, описания, программу. Скриншоты лично я люблю смотреть...


 
Сергей М. ©   (2007-03-13 16:27) [3]


> дописал я

Аминь !


 
Сергей М. ©   (2007-03-13 16:29) [4]


> function TCalc.btnName(Sender: TObject) : TButton;      
>  // return name of the button


С каких пор и с какого перепугу тип TButton стал "именем кнопки" ?


 
Нуб   (2007-03-13 16:36) [5]


> Сергей М. ©  


ну подумаешь, думал одно писал другое :)


 
Сергей М. ©   (2007-03-13 16:38) [6]


> подумаешь, думал одно писал другое :)
>


Вот поэтому все в Державе и хреново - думают одно, пишут другое, говорят третье, делают (если вообще делают) четвертое))


 
Нуб   (2007-03-13 16:49) [7]


> Сергей М. ©  


поэтому надо жить в своей Державе, потому что эта Держава нас правильно не оценит и не возлюбит )


 
alles ©   (2007-03-13 16:59) [8]

Edit1.Text := IntToStr(0);
мощь :)


 
Нуб   (2007-03-13 17:00) [9]


> alles ©  

та не говори :)


 
ASoft   (2007-03-13 18:00) [10]


> но за то почти все работает , спервого взгляда

это такой калькулятор... для торговли :)

> Каким же должен быть калькулятор ?

Легким, инженерным, красивым, на аккумуляторах и в футляре... но сойдет и в мобиле ;)
------ сорри за офтопик


 
Knight ©   (2007-03-13 18:52) [11]

Калькулятор должен висеть за краем экрана и выскакивать оттуда по одному  движению мыши... и так же легко безо всяких меню преобразовываться в инженерный и обратно в обычный :)


 
eXPell ©   (2007-03-13 18:57) [12]


> Knight ©   (13.03.07 18:52) [11]

очень рекомендую numLock Calculator. не помню уже с каких пор юзаю - просто отличный.

по теме: смысл сделанного автором "зверя"?


 
Knight ©   (2007-03-13 19:10) [13]


> [12] eXPell ©   (13.03.07 18:57)

Прикольно... спасибо :)


 
eXPell ©   (2007-03-13 19:29) [14]


> Knight ©   (13.03.07 19:10) [13]

Это вообще, имхо, "Звери" - Prokon и SunCalculator.
Что б от темы не уходить в оффтоп:
автор посмотри эти калькуляторы, и сделай подобное, вот тогда огромное тебе РЕСПЕКТ. Думаю многие тебе подобное скажут.

ЗЫ. больше не будет офф-ов. сорри.


 
Servelat ©   (2007-03-13 19:52) [15]

Чем эта конструкция

 if (Sender as TButton) = btnOne then result := btnOne else
 if (Sender as TButton) = btnTwo then result := btnTwo else
 if (Sender as TButton) = btnThree then result := btnThree else
 if (Sender as TButton) = btnFour then result := btnFour else
...


лучше обычной

Result := (Sender as TButton);


Или вы из Индии? (=

Дальше вообще волшебство какое-то:

 btn := btnName(Sender);              
 if (Sender as TButton) = btn then begin


и при каком спрашивается стечении обстоятельств условие не выполнится? Дальше смотреть не стал, кидать компоненты на форму и компилировать смысла не вижу. Автору совет учить теорию.


 
Чапаев ©   (2007-03-13 20:22) [16]

> [15] Servelat ©   (13.03.07 19:52)
Лучше бы до них через RTTI добираться! ))


 
Anatoly Podgoretsky ©   (2007-03-13 21:01) [17]

> Нуб  (13.03.2007 16:22:00)  [0]

Тяжелым


 
ASoft   (2007-03-14 04:14) [18]


> Anatoly Podgoretsky ©   (13.03.07 21:01) [17]
>Тяжелым

что б по голове и наверняка :)

ps: Servelat ©, привет! давненько тебя не видно было!..


 
ТЮзер (в нете через паяльник)   (2007-03-14 05:59) [19]

Очень удобный калькулятор - качаешь Delphi, кидаешь на форму кучу кнопарей, называешь их как надо, компилируешь, и почти все работает. Возможно даже с первого раза!


 
Yanis ©   (2007-03-14 09:45) [20]

Так это ж в чистом виде программа с открытым исходным кодом. Нуна на SF выкладывать :)


 
StriderMan ©   (2007-03-14 09:47) [21]


> Сергей М. ©   (13.03.07 16:38) [6]
> Вот поэтому все в Державе и хреново - думают одно, пишут
> другое, говорят третье, делают (если вообще делают) четвертое))


... и вообще, весь этот горький катаклизм, который я здесь наблюдаю... (с) Скрипач


 
ПЛОВ ©   (2007-03-14 10:17) [22]

офтоп... Как-то видел в магазине калькулятор с USB шнурком. Хороший калькулятор, программируемый, почти как мой старый МК-61, коим пользуюсь до сих пор. Правда на упаковке ничего не сказано о назначении шнурка. Наверное, просто обычное питалово, наподобии всяких там USB-бритв/ламп/вентиляторов. Интересно, мож кто-нить встречал в продаже подобный девайс с возможностью обмена данными/командами с компом?


 
wicked ©   (2007-03-14 10:18) [23]


> Каким же должен быть калькулятор ?

напомнило:
<ZartWork> холодильнику тормоза не нужны
<ZartWork> он должен быть быстрым как гепард, порхать как бабочка и жалить как пчела
<ZartWork> хм....
<ZartWork> *задумавшись* о чем это я?

http://bash.org.ru/quote.php?num=19 :)



Страницы: 1 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.053 c
2-1174345371
ElectriC
2007-03-20 02:02
2007.04.08
DLL


2-1174289904
Ильин С.
2007-03-19 10:38
2007.04.08
Кти может подсказать?


11-1154698752
tigr
2006-08-04 17:39
2007.04.08
KOLIndy


15-1173573167
Raid
2007-03-11 03:32
2007.04.08
Кто нибудь пробовал ставить Виндос на флеш память?


15-1173845848
pasha_golub
2007-03-14 07:17
2007.04.08
Список пакетов используемых в проекте