Avatar billede rigpig Nybegynder
07. februar 2006 - 23:41 Der er 13 kommentarer og
1 løsning

Talbehandling i MFC

Prøver at forstå talbehandling i VisualC++ 6.0.
Der er desværre meget lidt i bøgerne (practical Visual c++ 6) har ikke meget held med søgning på nettet, men fandt dette eksempel:
4 editboxe, 1 calculate knap. Markedsprisen samt tax indtastes.
Ved tryk på Calculate bliver tax amount samt nettoprisen undført.

UpdateData(TRUE);
double MarkedPrice, TaxRate, TaxAmount, NetPrice;

MarkedPrice = atof(m_MarkedPrice);
TaxRate = atof(m_TaxRate) / 100;

TaxAmount = MarkedPrice * TaxRate;
NetPrice =  MarkedPrice + TaxAmount;

m_TaxAmount.Format("$.2f", TaxAmount);
m_NetPrice.Format("$.2f", NetPrice);

UpdateData(FALSE);

Så til spørgsmålet:
Er det nødvendigt at det skal være så besværligt at regne med editboxe i C++ ?
Er der en nemmere måde at f.eks addere to Editboxe og vise resultatet i en tredje.

Fik forklaring på atof i MSDN (convert streng til value)
Men ved ("$.2f") der faldt det sidste hår af!!!
Der var ingen forklaring med eksemplet (typisk) jpk hjalp mig meget i et indlæg for et par dage siden, ellers havde jeg ikke fundet en fejl i eksemplet på nettet.

Håber nogen forbarmer sig over mig igen, har købt Microsoft flag og benzin.

Peter
Avatar billede bertelbrander Novice
08. februar 2006 - 00:14 #1
Er du sikker på at det ikke er %.2f ?
I så fald bør den formatere et decimal tal med to cifre efter ./,

Du kan lave din egen DDX_Double funktion, det er ikke specielt svært, og så kan du direkte associere en double med en edit box, således at UpdateData læser fra din double og skriver til din double.

(I øvrigt anbefaler jeg ikke at lære MFC, det er ikke kønt designet, og er lettere outdated.)
Avatar billede rigpig Nybegynder
08. februar 2006 - 00:47 #2
Du har ret $%.2f, beklager (skriver koden i context, da uendelige link løkker er mit speciale :) )
Laver normalt programmer i Visual Basic, men vil gerne lære C++ i samme miljø, hvilke andre muligheder har jeg? er træt af at skrive C++ sætninger i DOS boxe, her i MFC kan jeg sammenligne med tilsvarede kode i VB, det var pointen.
(Er nybegynder) kan nok ikke forstå hvorfor man ikke kan skrive "indhold editbox1 + indhold editbox2 vises i editbox3"
DDX_Double funktion ved jeg desværre ikke hvad er.
Vil være meget taknemmelig, hvis du kunne omskrive ovenstående, som du mener er nemmest, et eksempel er mere end tusind ord.
Tak for at du gider hjælpe.
Peter
Avatar billede bertelbrander Novice
08. februar 2006 - 01:00 #3
DDX_Text og DDX_whatever er MFC extensions til at hente data fra en control til en variabel og skrive fra en variabel til en control. Prøv at kikke i din DoDataExchange

Der er ikke nogen DDX_Double funktion så hvis du vil have en må du lave den selv (eller få en til at lave den).

Man kan ikke skrive editbox1 = editbox2 + editbox3 i C++ fordi C++ ikke har automatisk typekonvertering.

Jeg har selv brugt MFC, men er holdt op, det er for bøvlet.

Der findes ikke ret mange alternativer :-(
Man kan bruge BorlandC++ Builder, men det er ikke ret meget bedre end MFC.
Man kan bruge .net, men C++ i .net er ikke rigtig C++, og så er der ikke så meget idé i at bruge C++ (vælg C# i stedet).
Nogle GUI biblioteker har programmer til at lave applikationer med drag&ddrop men jeg har ikke prøvet dem.

Arbejder selv med Win32Api.
Avatar billede jpk Nybegynder
08. februar 2006 - 08:13 #4
--> bertel
Der er gansske rigtig ikke nogen DDX_Double, men DDX_Text har en del overloads, også en som ta'r en double.

Laver man 3 membervariabler, m_Val1, m_Val2 og m_Val3, kan man godt:

m_Val3 = m_Val1 + m_Val2;

--> Peter
Har du fundet ud af hvordan du laver membervariable for dine edit-felter?
Understående bliver automatisk oprettet hvis du laver 3 membervariabler med navnene m_Val1, m_Val2 og m_Val3 af typen double.

I din dialogs headerfil (.h):

3 members
...
public:
  double m_Val1;
  double m_Val2;
  double m_Val3;
...


I implementationsfilen (.cpp)

void CCalcDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_Val1);
    DDX_Text(pDX, IDC_EDIT2, m_Val2);
    DDX_Text(pDX, IDC_EDIT3, m_Val3);
}


Du kan så bruge disse members, fx i handleren for en button:

void CYourDlg::OnBnClickedButton1()
{
    UpdateData(true);
    m_Val3 = m_Val1 + m_Val2;
    UpdateData(false);
}
Avatar billede rigpig Nybegynder
08. februar 2006 - 09:54 #5
--> bertelbrander, jeg skal bruge C++ til andet end windows programmer, håbede bare at det var nemmere at lære, når man kan sammenligne med VB kodning, hvis jeg laver ovenstående program i en console med cin og cout er det nemt nok, men at bruge Editboxe og knapper er mere end besværligt, må bare lære at forstå syntaxen.
Er atof ikke en typekonvertering? sådan forstod jeg det på MSDN ?
Kan jeg efter din mening bruge Visual C programmet til C# (kan vælges under installeringen)eller anbefaler du andre programmer?

-->jpk membervariabler laver jeg i Class Wizzard, f.eks (Control ID)IDC_MARKED_PRICE (type) CString  (Menber) m_MarkedPrice, er dette korrekt?
Det er konverteringen fra streng til tal der giver mig konstant hovedpine.
Tak for dit eksempel, det er da til at forstå, et lille spørgsmål (eller 2) er der en bestemt grund til at de 3 members deklareres i en headerfile?
I VB bruges val til at fortælle at det er tal, er det det samme i C++ ?

Utroligt at talbehandling i MFC er så forsømt i bøgerne.

Igen tak for jeres hjælp.

Peter
Avatar billede jpk Nybegynder
08. februar 2006 - 10:41 #6
Du kan bare lave membervariablerne som double eller hvad du nu har brug for!
Hvorfor først lave dem som strings for derefter at konvertere dem..?

Members erklæres altid i klassedefinitionen, som laves i headeren, ellers var de jo ikke menbers.

"val" var bare et eksempel, brug navne der er sigende, som fx dit "m_MarkedPrice".
Avatar billede rigpig Nybegynder
08. februar 2006 - 12:26 #7
jpk, jeg brugte programmet i første indlæg som eksempel, der er det CString der er brugt.
Troede at brugen af "atof" var en genvej, da hele koden skrives i button dialog, var vist et vildspor.

Ved at bruge dit forslag, har du selvfølgelig helt ret.
Kaster mig lige over et par hundrede sider med Class læsning, smid lige et svar, så får du fred i 14 dage :)
Peter.
Avatar billede jpk Nybegynder
08. februar 2006 - 12:32 #8
Svar...
Avatar billede rigpig Nybegynder
08. februar 2006 - 13:31 #9
Hej jpk, får en error:"error C2143: syntax error : missing ';' before 'public'"

// taltest1Dlg.h : header file
//

#if !defined(AFX_TALTEST1DLG_H__B7C6DA26_658B_45EF_8379_A890ED9B3A23__INCLUDED_)
#define AFX_TALTEST1DLG_H__B7C6DA26_658B_45EF_8379_A890ED9B3A23__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000;

public:
   
    double m_Val1;
    double m_Val2;
    double m_Val3;

Hvad gør jeg forkert?

Peter
Avatar billede jpk Nybegynder
08. februar 2006 - 13:44 #10
Du mangler jo at definere klassen...

class taltest1Dlg {
....
};


Bruger du ikke ClassWizard?
Avatar billede rigpig Nybegynder
08. februar 2006 - 16:37 #11
MFC Class Wizzard: Class name: CTaltest1Dlg, Messages: DoDataExchange er i bold, Object IDs: CT altest1Dlg.

Dette havde programmet selv skreveti taltest1Dlg.cpp:
CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_Val1);
    DDX_Text(pDX, IDC_EDIT2, m_Val2);
    DDX_Text(pDX, IDC_EDIT3, m_Val3);

Så gik jeg ind på taltest1Dlg.h for du skrev:
"I din dialogs headerfil (.h):
3 members
...
public:
  double m_Val1;
  double m_Val2;
  double m_Val3;"

De var der ikke, så jeg troede jeg selv skulle indføre dem.

Tror kæden er ved at hoppe af for mig, jeg mangler den fundamentale forståelse af Classes og deres opbygning, som sagt så må jeg igang med bøgerne igen, tak for du lagde ører til mine spørgsmål.
Peter
Avatar billede jpk Nybegynder
08. februar 2006 - 16:42 #12
Filen taltest1Dlg.h indeholder vel også noget lign. "public class taltest1Dlg"?

members oprettes automatisk af resource editor.
Avatar billede rigpig Nybegynder
08. februar 2006 - 20:29 #13
Ser det nu, kiggede kun under taltest1Dlg.h : headerfile.
Under CTaltest1Dlg : public CDialog //Construction er de 3 members.
Tror jeg var fixeret på at man selv skulle skrive linierne.
Smider mig endnu engang i støvet, det er bare kanon, nu virker det!
Tak for hjælpen
Peter
Avatar billede bertelbrander Novice
09. februar 2006 - 00:06 #14
Angående alternativ:
Man kunne vælge http://visualwx.altervista.org/ sammen med http://wxwidgets.org/ og http://mingw.org/

Jeg har før brugt wxWidgets og det virker fornuftigt. MinGW er også en god compiler (omend en anelse langsom). Jeg har ikke brugt visualwx men det ser fornuftigt ud.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester