Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

создание калькулятора! отработка нажатия ентер

2.0K
26 июля 2008 года
SkyMD
4 / / 14.04.2008
пытаюсь отработать нажатие клавиши ентер в едит1!
проблема в следующем! если в нормальном калькуляторе ввести с клавы первое значение 10 потом нажать минус 1 а потом ентер то с каждым нажатием ентера результирующее значение уменьшается на 1! А у меня ток один раз а потом либо 0 либо результирующее значение
привожу код:

размещение класса
ClassCalc.H
Код:
//---------------------------------------------------------------------------
#ifndef ClassCalkH
#define ClassCalkH
//---------------------------------------------------------------------------
class TCalcPressKey
{
 public:
 
 char SIMVOL;
 float PERVOE_ZNACHENIE,VTOROE_ZNACHENIE,TOTAL,TEMP_BUUF;
 int COUNT_PRESS_BUTTON_NUMBER, COUNT_PRESS_SIMVOL_NUMBER;
 CalcPressKey();
 float  KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF);
};
//---------------------------------------------------------------------------
#endif

размещение методов
ClassCalc.cpp
Код:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "ClassCalk.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
float TCalcPressKey::KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,
                  float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF)
{
TEMP_BUUF = PERVOE_ZNACHENIE;
      switch(SIMVOL)
{
case '-':TOTAL = PERVOE_ZNACHENIE - VTOROE_ZNACHENIE; break;  // Minus
case '+':TOTAL = PERVOE_ZNACHENIE + VTOROE_ZNACHENIE; break;
case '*':TOTAL = PERVOE_ZNACHENIE * VTOROE_ZNACHENIE; break;
case '/':TOTAL = PERVOE_ZNACHENIE / VTOROE_ZNACHENIE; break;
}
    return TOTAL;
}
TCalcPressKey::CalcPressKey()
{
  PERVOE_ZNACHENIE = 0;
  VTOROE_ZNACHENIE = 0;
  TOTAL = 0;
  COUNT_PRESS_BUTTON_NUMBER = 0;
  COUNT_PRESS_SIMVOL_NUMBER = 0;
  SIMVOL = ' ';
}



заголовочный файл главной формы

Код:
--------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef CalcUnitH
#define CalcUnitH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <XPMan.hpp>
#include "ClassCalk.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TEdit *Edit1;
    TButton *BT0;
    TButton *BTPoint;
    TButton *BTEgal;
    TButton *BT1;
    TButton *BT2;
    TButton *BT3;
    TButton *BT4;
    TButton *BT5;
    TButton *BT6;
    TButton *BT7;
    TButton *BT8;
    TButton *BT9;
    TButton *BTPlus;
    TButton *BTDelenie;
    TButton *BTMP;
    TButton *BTMinus;
    TButton *BTUmnuj;
    TButton *BTClear;
    TXPManifest *XPManifest1;
    void __fastcall Edit1Change(TObject *Sender);
    void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
    void __fastcall Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
//=========MyClass Declaration====Start=================================
 TCalcPressKey CalcPressKey();
 TCalcPressKey  MY_CALK;
 float  KALKULATOR(char SIMVOL, float PERVOE_ZNACHENIE,float VTOROE_ZNACHENIE,float TOTAL,float TEMP_BUUF);
 //=========MyClass Declaration====End =================================
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Срр файл главной формы
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include<winuser.h>  SysUtils.hpp
#include "SysUtils.hpp"
#include "CalcUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
TForm1* CalcPressKey();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
MY_CALK.COUNT_PRESS_BUTTON_NUMBER=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
//-----------------najatie ravno----------------end
if ((Key >= '0') && (Key <= '9'))
{
 return ;
}
else
 Key = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
//-----------------Najatie +,-,*,/, ----------------Start
if(Key == 189)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '-';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';
   }
//-------------------------------------------------
   if(Key == 187)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '+';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';
   }
//-------------------------------------------------
   if(Key == 191)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '/';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';
   }
//-------------------------------------------------
   if(Key == 56)
   {
   MY_CALK.COUNT_PRESS_BUTTON_NUMBER = 2;
   MY_CALK.SIMVOL = '*';
   MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
   Edit1->Text=' ';
   }
//-----------------Najatie +,-,*,/, ------------End
//<-------------------------------------------------------------------->
//-----------------najatie ravno--------------start
if(Key ==13)
  {
   int count=1;
   if(MY_CALK.COUNT_PRESS_BUTTON_NUMBER ==1 && count==1)
      {
        MY_CALK.VTOROE_ZNACHENIE= StrToFloat(Edit1->Text);
        MY_CALK.TEMP_BUUF = MY_CALK.VTOROE_ZNACHENIE;
        MY_CALK.TOTAL=MY_CALK.KALKULATOR(MY_CALK.SIMVOL,MY_CALK.PERVOE_ZNACHENIE,MY_CALK.VTOROE_ZNACHENIE,
                                            MY_CALK.TOTAL,MY_CALK.TEMP_BUUF);
        Edit1->Text= FloatToStr(MY_CALK.TOTAL);
        MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
        MY_CALK.VTOROE_ZNACHENIE = MY_CALK.TEMP_BUUF;
        ShowMessage("Srabotal IF");
        count=2;
      }
       if(MY_CALK.COUNT_PRESS_BUTTON_NUMBER ==1 && count==2)
      {
         ShowMessage("Srabotal else");
          MY_CALK.VTOROE_ZNACHENIE = MY_CALK.TEMP_BUUF;
          MY_CALK.TOTAL=MY_CALK.KALKULATOR(MY_CALK.SIMVOL,MY_CALK.PERVOE_ZNACHENIE,MY_CALK.VTOROE_ZNACHENIE,
                                            MY_CALK.TOTAL,MY_CALK.TEMP_BUUF);
          Edit1->Text= FloatToStr(MY_CALK.TOTAL);
          MY_CALK.PERVOE_ZNACHENIE = StrToFloat(Edit1->Text);
          count = 1;
      }
      }
}
//---------------------------------------------------------------------------

за ранее прошу не пинать! ток начал изучать классы!

мне думается трабла в нажатии на ентер! значение переменной постоянно задается из едита! как с этим боротся!
16K
27 июля 2008 года
iRain
72 / / 12.03.2008
Я подробно не изучал код поэтому посоветую то, что сразу на глаза попалось.
Было так:
 
Код:
TEMP_BUUF = PERVOE_ZNACHENIE;
      switch(SIMVOL)
{
case '-':TOTAL = PERVOE_ZNACHENIE - VTOROE_ZNACHENIE; break;  // Minus
case '+':TOTAL = PERVOE_ZNACHENIE + VTOROE_ZNACHENIE; break;
case '*':TOTAL = PERVOE_ZNACHENIE * VTOROE_ZNACHENIE; break;
case '/':TOTAL = PERVOE_ZNACHENIE / VTOROE_ZNACHENIE; break;
}
    return TOTAL;

а попробуй так:
 
Код:
TEMP_BUUF = PERVOE_ZNACHENIE;
      switch(SIMVOL)
{
case '-':PERVOE_ZNACHENIE = PERVOE_ZNACHENIE - VTOROE_ZNACHENIE; break;  // Minus
case '+':PERVOE_ZNACHENIE = PERVOE_ZNACHENIE + VTOROE_ZNACHENIE; break;
case '*':PERVOE_ZNACHENIE = PERVOE_ZNACHENIE * VTOROE_ZNACHENIE; break;
case '/':PERVOE_ZNACHENIE = PERVOE_ZNACHENIE / VTOROE_ZNACHENIE; break;
}
    return PERVOE_ZNACHENIE;

и PERVOE_ZNACHENIE не изменять и не обнулять пока не будет нажата клавиша отличная от Enter или "=".
8.4K
27 июля 2008 года
Zor
104 / / 23.04.2006
какой блондинистый код :)
1
27 июля 2008 года
kot_
7.3K / / 20.01.2000
Цитата: SkyMD

за ранее прошу не пинать! ток начал изучать классы!

мне думается трабла в нажатии на ентер! значение переменной постоянно задается из едита! как с этим боротся!


причем тут классы и давность их изучения?
1. код действительно блондинистый - ЗАГЛАВНЫЕ буквы используют исключительно для именования макросов и глобальных переменных. читать вашу мешанину просто не возможно.
2. в продукте компании борланд - как и во множестве других есть такая штука, как отладчик. никому собственно ваш куркулятор не всрался - и нахождение ошибок в криво написанном коде задача не из приятных. поэтому ставьте точку останова и проверяйте что и куда вводиться - никто на форме этим заниматься не должен.
Боков у вас хватает - исправлять подобное "произведение" надо с самого начала - с замены кодера :). шучу. :)
установите брекпоинт и вы легко сами найдете ошибку - и возможно исправите остальные :)

2.0K
28 июля 2008 года
SkyMD
4 / / 14.04.2008
Цитата: kot_
причем тут классы и давность их изучения?
1. код действительно блондинистый - ЗАГЛАВНЫЕ буквы используют исключительно для именования макросов и глобальных переменных. читать вашу мешанину просто не возможно.
2. в продукте компании борланд - как и во множестве других есть такая штука, как отладчик. никому собственно ваш куркулятор не всрался - и нахождение ошибок в криво написанном коде задача не из приятных. поэтому ставьте точку останова и проверяйте что и куда вводиться - никто на форме этим заниматься не должен.
Боков у вас хватает - исправлять подобное "произведение" надо с самого начала - с замены кодера :). шучу. :)
установите брекпоинт и вы легко сами найдете ошибку - и возможно исправите остальные :)




дык не в ошибке дело!

просто я пытаюсь отработать нажатие ентера!
ну да ладно спс!

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог