Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
Нуб   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.051 c
15-1174072515
ArtemESC
2007-03-16 22:15
2007.04.08
Nekojiro Sou


3-1169103391
Rentgen
2007-01-18 09:56
2007.04.08
Установить подключение к БД на удаленном ПК через ODBC


15-1173645143
Игорек
2007-03-11 23:32
2007.04.08
Отладчик Windbg


2-1174048675
valua
2007-03-16 15:37
2007.04.08
БД и Word


15-1173701197
Styx_
2007-03-12 15:06
2007.04.08
Преобразование RTF или DOC в PDF





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский