Permalänk
Medlem

GUI Embarcadero C++

Hej.

Är det någon här inne som skulle kunna hjälpa mig?

Jag gör en miniräknare i embarcadero C++ men lyckas inte få subtraktion, multiplikation och division att funka.
Har lyckats att få så att knapparna visar så det ska vara men när man gör uträkningen blir allt i addition.

Funderar på om det är en if-sats man ska använda, men vet inte hur den ska va utformad eller vart den ska va. Efter ett evigt googlande söker jag mig nu hit och hoppas att någon kan hjälpa mig. Klistrar in koden jag har här under.

.cpp-filen:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ShowMessage("Välkommen till kalkylatorn!");
sum = 0;
newNr = "";
}
//---------------------------------------------------------------------------
void TForm1::AddDigit(UnicodeString digit)
{
Edit1->Text = Edit1->Text + digit;
newNr += digit;
}
//-----------------------------------------------------
void TForm1::SubDigit(UnicodeString digit)
{
Edit1->Text = Edit1->Text - digit;
newNr += digit;
}
//-----------------------------------------------------
void TForm1::MulDigit(UnicodeString digit)
{
Edit1->Text = Edit1->Text * digit;
newNr += digit;
}
//-----------------------------------------------------
void TForm1::DivDigit(UnicodeString digit)
{
Edit1->Text = Edit1->Text / digit;
newNr += digit;
}
//-----------------------------------------------------
void TForm1::Summarize()
{
if(newNr != "")
{
sum = sum + StrToInt(newNr); // R�kna ut summa av alla tal
newNr = ""; // �terst�ll s� anv�ndaren kan skriva ett nytt tal
}
}
//--------------------------------------------------------------------------
void TForm1::Clear()
{
sum = 0;
newNr = "";
Edit1->Text = "";
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AddDigit("1");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
AddDigit("2");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
AddDigit("3");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
AddDigit("4");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
AddDigit("5");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)
{
AddDigit("6");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button7Click(TObject *Sender)
{
AddDigit("7");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button8Click(TObject *Sender)
{
AddDigit("8");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button9Click(TObject *Sender)
{
AddDigit("9");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button0Click(TObject *Sender)
{
AddDigit("0");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonAddClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum) + "+"; // S�tt textboxen r�tt

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSubClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum) + "-";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonMulClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum) + "*";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonDivClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum) + "/";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonSummarizeClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonClearClick(TObject *Sender)
{
sum = 0;
newNr = "";
Edit1->Text = "";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Avsluta1Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Om1Click(TObject *Sender)
{
Form2->Show();
}
//---------------------------------------------------------------------------

.h-filen:

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TButton *Button5;
TButton *Button6;
TButton *Button7;
TButton *Button8;
TButton *Button9;
TButton *Button0;
TButton *ButtonAdd;
TButton *ButtonSub;
TButton *ButtonMul;
TButton *ButtonDiv;
TButton *ButtonClear;
TButton *ButtonSummarize;
TEdit *Edit1;
TMainMenu *MainMenu1;
TMenuItem *Arkiv;
TMenuItem *Hjälp;
TMenuItem *Avsluta1;
TMenuItem *Om1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
void __fastcall Button6Click(TObject *Sender);
void __fastcall Button7Click(TObject *Sender);
void __fastcall Button8Click(TObject *Sender);
void __fastcall Button9Click(TObject *Sender);
void __fastcall Button0Click(TObject *Sender);
void __fastcall ButtonAddClick(TObject *Sender);
void __fastcall ButtonSubClick(TObject *Sender);
void __fastcall ButtonMulClick(TObject *Sender);
void __fastcall ButtonDivClick(TObject *Sender);
void __fastcall ButtonSummarizeClick(TObject *Sender);
void __fastcall ButtonClearClick(TObject *Sender);
void __fastcall Avsluta1Click(TObject *Sender);
void __fastcall Om1Click(TObject *Sender);

private: // User declarations
int sum;
UnicodeString newNr;
void AddDigit(UnicodeString digit);
void SubDigit(UnicodeString digit);
void MulDigit(UnicodeString digit);
void DivDigit(UnicodeString digit);
void Summarize();
void Clear();
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Permalänk
Inaktiv

Du kör ju enbart Summarize från knapparna

Permalänk
Medlem
Skrivet av anon334363:

Du kör ju enbart Summarize från knapparna

Du menar det här?
void __fastcall TForm1::ButtonAddClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum) + "+";

}

Är inte det bara att om jag t.ex kör 5+5 och sen trycker på + igen så läggs dom ihop så det blir 10+?

Jag har aldrig använt GUI innan och är nybörjare inom all programmering, så tar tacksam emot all hjälp.

Permalänk
Inaktiv
Skrivet av macKiedL:

Du menar det här?
void __fastcall TForm1::ButtonAddClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum) + "+";

}

Är inte det bara att om jag t.ex kör 5+5 och sen trycker på + igen så läggs dom ihop så det blir 10+?

Jag har aldrig använt GUI innan och är nybörjare inom all programmering, så tar tacksam emot all hjälp.

Du kör ju summarize från alla knappar:

void __fastcall TForm1::ButtonDivClick(TObject *Sender) { Summarize(); Edit1->Text = IntToStr(sum) + "/"; }

Och i summarize adderar du ju bara. Du vill förmodligen köra något annat än summarize från ex divisionsknappen, för att ändra variabeln som heter *sum*.

Tål att nämnas att jag aldrig hört talas om Embarcadero förut, och bara snabbt ögglat igenom koden.

Permalänk
Hedersmedlem

Utöver det ovan så tror jag inte koden i SubDigit, MulDigit samt DivDigit kan fungera eftersom du tycks använda -, / och * på strängar. + kan nog fungera som att slå ihop strängar (dvs "1" + "1" = "11").
Blir det verkligen inte kompileringsfel där? Varningar lär det väl åtminstone bli? (Varningar ska man alltid ta på allvar -- i regel rekommenderar jag att se dem som fel; enda undantaget är om man vet att en varning är OK och går att strunta i.)

Har inte heller använt eller hört talas Embarcadero.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem
Skrivet av anon334363:

Du kör ju summarize från alla knappar:

void __fastcall TForm1::ButtonDivClick(TObject *Sender) { Summarize(); Edit1->Text = IntToStr(sum) + "/"; }

Och i summarize adderar du ju bara. Du vill förmodligen köra något annat än summarize från ex divisionsknappen, för att ändra variabeln som heter *sum*.

Tål att nämnas att jag aldrig hört talas om Embarcadero förut, och bara snabbt ögglat igenom koden.

Ja, det förklarar nog det hela isåfall. Det är ju bara vad man ska använda istället.
Tack för svar.

Permalänk
Medlem
Skrivet av Thomas:

Utöver det ovan så tror jag inte koden i SubDigit, MulDigit samt DivDigit kan fungera eftersom du tycks använda -, / och * på strängar. + kan nog fungera som att slå ihop strängar (dvs "1" + "1" = "11").
Blir det verkligen inte kompileringsfel där? Varningar lär det väl åtminstone bli? (Varningar ska man alltid ta på allvar -- i regel rekommenderar jag att se dem som fel; enda undantaget är om man vet att en varning är OK och går att strunta i.)

Har inte heller använt eller hört talas Embarcadero.

Nej, det blir inga fel och inga varningar. Miniräknaren fungerar med addition, dvs 1 + 1 = 2.

Har du något tips på vad jag kan använda istället?

Jag går en kurs som heter Programmering A C++ och kan inte överhuvudtaget inte förstå varför man helt plötsligt ska använda det här. Står ingenting om det i boken, inte fått någon hänvisning till internet och får ingen hjälp från min lärare.
Verkar vara en riktig pajaskurs.

Tacksam för all hjälp.

Permalänk
Hedersmedlem
Skrivet av macKiedL:

Ja, det förklarar nog det hela isåfall. Det är ju bara vad man ska använda istället.
Tack för svar.

Tänk igenom vad den fungerande koden gör.
SubDigit, MulDigit och DivDigit anropas aldrig, och lär inte fungera som det är tänkt; de kan nog tas bort helt.
AddDigit lägger ju ihop siffrorna man skriver in till en sträng, så att 1 följt av 2 blir 12; den har inget med addition att göra, och därmed behövs inga motsvarigheter för andra räknesätt.

Summarize() är ju funktionen som faktiskt adderar talen man skriver in. Alltså behöver du motsvarande varianter av den, typ Divide(), Multiply(), Subtract() som gör om newNr till ett tal och gör matten. De kan i princip vara identiska med Summarize() förutom att + ersätts med andra räknesätt.

Har du själva texten för uppgiften?

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem
Skrivet av Thomas:

Tänk igenom vad den fungerande koden gör.
SubDigit, MulDigit och DivDigit anropas aldrig, och lär inte fungera som det är tänkt; de kan nog tas bort helt.
AddDigit lägger ju ihop siffrorna man skriver in till en sträng, så att 1 följt av 2 blir 12; den har inget med addition att göra, och därmed behövs inga motsvarigheter för andra räknesätt.

Summarize() är ju funktionen som faktiskt adderar talen man skriver in. Alltså behöver du motsvarande varianter av den, typ Divide(), Multiply(), Subtract() som gör om newNr till ett tal och gör matten. De kan i princip vara identiska med Summarize() förutom att + ersätts med andra räknesätt.

Har du själva texten för uppgiften?

Aha, nu är jag med på banan. Det kanske jag kan lösa... haha

Uppgiften kommer här(Den tidigare kalkylatorn jag har gjort är ett konsolprogram i VS så förstår inte varför läraren har skrivit med det):
Inlämningsuppgift 3

Kalkylator.

Tidigare i kursen fick du pröva att göra en simpel kalkylator. I den här uppgiften ska du skapa en fortsättning på denna kalkylator så den klarar mer uträkningar. Denna kalkylator ska klara att räkna i flera led innan man får fram totalen. Miniräknaren ska kunna:

· Addera hur många tal som helst innan man väljer att få totalen

· Subtrahera hur många gånger som helst innan man väljer att få totalen

· Multiplicera hur många gånger som helst innan man väljer att få totalen

· Addera, subtrahera, multiplicera och/eller dividera hur många gånger som helst innan man väljer att få totalen

· Rensa kalkylatorn så att man kan börja om Ta hjälp av sidorna 173 - 198 i kursboken ”Programmering 1 C++ Lärobok” av Krister Trangius (2012).

OBS: Ett grafiskt gränssnitt på kalkylatorn kräver en utökad utvecklarmiljö. Det ska utföras då det är på en avancerande nivå som motsvarar betyg A (se kursens kunskapsmatris).

När du är klar med kalkylatorn lämnar du in .cpp-filen under inlämning 3 på It`s Learning eller skicka som meddelande alternativt mejl till mig i fall det problemet uppstår att bifoga under Inlämning 3.

Lycka till!

Permalänk
Medlem

Nu har jag lagt till koden så här. Verkar det stämma?
void TForm1::Summarize()
{
if(newNr != "")
{
sum = sum + StrToInt(newNr);
newNr = "";
}
}
//--------------------------------------------------------------------------
void TForm1::Sub()
{
if(newNr != "")
{
sum = sum - StrToInt(newNr);
newNr = "";
}
}

och för + samt - knapparna:

void __fastcall TForm1::ButtonAddClick(TObject *Sender)
{
Summarize();
Edit1->Text = IntToStr(sum) + "+";

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSubClick(TObject *Sender)
{
Sub();
Edit1->Text = IntToStr(sum) + "-";
}

Här gör han fortfarande addition när jag använder "-".
Jag har testat att ändra koden på knapparna till:

void __fastcall TForm1::ButtonSubClick(TObject *Sender)
{
sum = sum - StrToInt(newNr);
newNr = "";
Edit1->Text = IntToStr(sum) + "-";
}

Men när jag trycker på "-" får jag felmeddelandet: " is not a valid integer value

Vad gör jag för fel?

Permalänk

Jag tror att du behöver tänka på hur miniräknaren fungerar. Är det en "vanlig" där du trycker 123 + 456 = för få svaret 579? Det framgår inte riktigt av uppgiften, men eftersom du har en ButtonSummarize så gissar jag att det står "=" på den.

Hur många saker måste du hålla reda på för att kunna göra detta? Du måste ha två tal och dessutom veta vilken operation som skall utföras efter att man matat in det andra talet och trycker på "=" (eller annan operation). Som det är nu har du två tal, ett i sum och ett i strängen newNr, men du försöker utföra additionen/subtraktionen/multiplikationen i samband med att man trycker på +/-/*.

Sätt dig med penna och papper och låtsas att du matar in ett par i en miniräknare och funderar på vilka steg som måste göras för att kunna mata ut rätt svar.