Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Rechner Frage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.03.2003, 21:08 Uhr
CPlusPlus



Hallo erstmal an alle Leute,
so erstmal eine kleine Beschreibung was ich überhaupt machen möchte bzw.
was ich schon angefangen habe:)
Nun das was ich machen möchte is ganz einfach zu beschreiben, einen Rechner auf Basis eines Dialogfensters.
Das Habe ich bisher gemacht:
Dialogfenster erstellt,
Eingabefeld eingebunden
und Zwei Buttons("1","+")
Das habe ich bis jetzt erstmal für testzwecke erstellt. Mein Problem ist nun,
wenn ich auf den Button mit der 1 drücke, tue ich über eine Variable die Zahl 1 an das Anzeige- bzw.Eingabefeld übergeben. Wenn ich den Button aber erneut drücke steht auf dem Anzeige- bzw.Eingabefeld nicht 11 sondern wieder 1. Ich weis das das was mit der Variable zu tuen hat aber ich weis nicht wie ich das problem lösen könnte. Ich habs auch schon mit Strings versucht aba das klappt irgendwie auch nicht so.
Würd mich freuen wenn jemand einem Anfänger wie mir helfen könnte.

Hier habe ich nochmal den Quellcode, für das besser Verständnis.


C++:
// resource.h
#define IDD_DIALOGFELD    101
#define IDR_MAINFRAME    128

#define IDC_DISPLAY    1001
#define IDC_ADD        1002
#define IDC_EINS        1003



C++:
// rechner.rc
#include "resource.h"
#include <afxres.h>

// Icon

IDR_MAINFRAME    ICON    "Rechner.ico"

// Dialog

IDD_DIALOGFELD DIALOGEX 0, 0, 80, 94

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

EXSTYLE WS_EX_APPWINDOW

CAPTION "Rechner"

FONT 8, "MS Sans Serif"

BEGIN
    EDITTEXT        IDC_DISPLAY, 0, 0, 80, 14, ES_RIGHT

    PUSHBUTTON        "+", IDC_ADD, 0, 14, 20, 20

    PUSHBUTTON        "1", IDC_EINS, 20, 14, 20, 20
END



C++:
// rechner.h

#include "resource.h"

class CRechnerApp : public CWinApp
    {
    public:
        virtual BOOL InitInstance();
    };



C++:
// rechner.cpp

#include <afxwin.h>
#include "rechner.h"
#include "rechnerdlg.h"

CRechnerApp App;

BOOL CRechnerApp::InitInstance()
    {
    CRechnerDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    return FALSE;
    }



C++:
// rechnerdlg.h

class CRechnerDlg : public CDialog
    {
    public:
        CRechnerDlg(CWnd* pParent = NULL);

        double        m_Anzeige;
        double        m_ZwischenSpeicher;
        double        m_Ergebnis;
        double        m_Zahl;
        double        m_test;

        void OnClickedAdd(void);
        void OnClickedNum();

    protected:
        virtual void DoDataExchange(CDataExchange* pDX);

        HICON    m_hIcon;

        virtual BOOL OnInitDialog();

        DECLARE_MESSAGE_MAP()
    };



C++:
// rechnerdlg.cpp

#include <afxwin.h>
#include "rechner.h"
#include "rechnerdlg.h"

CRechnerDlg::CRechnerDlg(CWnd* pParent) : CDialog(IDD_DIALOGFELD, pParent), m_Anzeige(0)
    {
    m_test = 5;
    m_ZwischenSpeicher = 0;
    m_Ergebnis = 0;
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

void CRechnerDlg::DoDataExchange(CDataExchange* pDX)
    {
    DDX_Text(pDX, IDC_DISPLAY, m_Anzeige);
    CDialog::DoDataExchange(pDX);
    }

BEGIN_MESSAGE_MAP(CRechnerDlg, CDialog)
    ON_BN_CLICKED(IDC_ADD, OnClickedAdd)
    ON_BN_CLICKED(IDC_EINS, OnClickedNum)
END_MESSAGE_MAP();

BOOL CRechnerDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);
    SetIcon(m_hIcon, FALSE);
    return TRUE;
    }

void CRechnerDlg::OnClickedAdd(void)
    {
    UpdateData(TRUE);
        if(m_ZwischenSpeicher == 0)
            {
            if(m_Ergebnis != 0)
                {
                m_ZwischenSpeicher = m_Ergebnis + m_Anzeige;
                m_Anzeige = m_ZwischenSpeicher;
                }
            m_ZwischenSpeicher = m_Anzeige;
            }
        else
            {
            m_Ergebnis = m_ZwischenSpeicher + m_Anzeige;
            m_Anzeige = m_Ergebnis;
            m_ZwischenSpeicher = 0;
            }
    UpdateData(FALSE);
    }

void CRechnerDlg::OnClickedNum()
    {
    UpdateData(TRUE);

                    m_Zahl = 1;
                    m_Anzeige = m_Zahl;

    UpdateData(FALSE);
    }




Danke schon mal im Voraus für die mühe.

Edit: Smilie entfernt :)

Dieser Post wurde am 23.03.2003 um 21:16 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.03.2003, 21:10 Uhr
CPlusPlus



Hm die Smilies im quelltext sind keine absicht. Is wohl nen bug im Forum.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.03.2003, 21:36 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo CPlusPlus,
eigentlich keine große Sache:
Das mit dem Einlesen in einen String ist schon richtig.
Wenn du damit rechnen willst nutzt Du z.B. die Funktion atof()
m_str ist eine Member von Typ CString für ein Eingabefeld.
Bsp:

C++:
double m_num1;
m_num1 = atof(m_str);



Die Funktion convertiert Deinen String in double
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.03.2003, 22:18 Uhr
CPlusPlus



Ok alles klar ich habe jetzt die Methode OnClickedNum so um geschrieben.


C++:
void CRechnerDlg::OnClickedNum()
    {
    UpdateData(TRUE);

    m_CString = _T("1");
    m_Anzeige = atof(m_CString);                

    UpdateData(FALSE);
    }



m_CString habe ich in CRechnerDlg.h deklariert

Und in der Methode DoDataExchange habe ich das zugefügt.

C++:
DDV_MaxChars(pDX, m_CString, 10);



Wenn ich jetzt den knopf drücke schreibt wird die 1 ins Eingabefeld übergeben.
Aber auch nur einmal. Wie kann ich des jetzt so umschreiben, das wenn ich den Button "1" nochmal drücke eine 1 an zweiter stelle des Strings bekomme.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.03.2003, 17:04 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
mit was für einer VC++ Oberfläche arbeitest Du?(6.0;.Net)? Erst einmal mußt Du den Wert aus dem Eingabefeld holen, in dem String befindet sich dann z.B.
"125"(1,2 und 5 gedrückt). Danach sicherst oder wandelst Du den ersten String in eine Zahl. Jetzt kann bei den Grundrechenarten der nächste Wert geholt werden oder eben eine Operation ausgeführt wie sqrt() 1/x etc.
Irgendwo hab ich glaue ich noch einen "Rechner" im Quellcode rumliegen. Bei Interesse ...
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 24.03.2003 um 17:07 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.03.2003, 17:09 Uhr
CPlusPlus



Jo schon klar das problem ist aber ich kann die 1 so oft drücken wie ich will sie erscheint nur EINMAL im Anzeigefeld. Und meine frage ist wie ich das machen kann das wenn ich den Button mit der "1" drücke diese Zahl an erster stelle in meinen String gespeichert wird und wenn ich den Buton nochmals drücke die Zahl 1 wiederum an zewieter stelle des Strings gespeichert wird das dann im Anzeigefeld eine 11 steht.

Jetzt zu deiner frage VC++ 6.0
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.03.2003, 17:24 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Aha, "daher weht der Wind". Dazu brauchst Du einen temporären String
diesen "addierst" du zu deinem String

C++:
   CString tmp;
   GetDlgItemText(IDC_DEINCONTROL,tmp);
   m_str = m_str+tmp;


Jetzt solltest Du Dir überlegen eine boolsche Variable einzuführen, welche den Wert ändert, wenn Du einen Buton für Rechenoperationen auslöst. Ist dies der Fall, wird dann die nächste Zahl eingelesen.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.03.2003, 19:49 Uhr
CPlusPlus



JO vielen dank deine Antwort hat mich ein stückchen weiter gebracht.
Das mit der boolsche Variable versteh ich noch net ganz wie ich das machen soll aber wenigstens bin ich mal ein Schritt weiter gekommen.

THX

Markus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: