Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Ahoj, jako seminární práci z ivt dělám kalkulačku v delphi
Je to celkem jednoduchá kalkulačka 2 edity, tlačítka s číslicemi 0-9
Jednoduché operace jako + - * / druhá mocnina odmocnina
Ale stále mi to hlásí nějakou chybu se kterou si nevím rady, tak se ptám, zda by mi někdo znalý v delphi nemohl nějak pomoci ( například bych to poslal mailem a nějak bychom se domluvili)
Tuto práci musím odevzdat do 11.4. což je celkem hodně času, ale stejnak nestíham
Děkuji moc za každou pomoc
Offline
procedure TForm1.Button10Click(Sender: TObject);
begin
if Form1.Edit1.Text = '0' then
Form1.Edit1.Text := '9'
else
Form1.Edit1.Text := Form1.Edit1.Text + '9'
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
Button15Click(Sender);
operator:=krat;
form1.Label1.Caption:='krát';
end;
procedure TForm1.Button14Click(Sender: TObject);
begin
Button15Click(Sender); //pokud klikneme na toto talčítko, tak to zavolá button15 ve kterém je zadaný vzorec.
operator:=minus;
form1.Label1.Caption:='mínus'; //Label ukáže, že odečítáme
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
Button15Click(Sender);
operator:=plus;
form1.Label1.Caption:='plus';
end;
procedure TForm1.Button13Click(Sender: TObject);
begin
Button15Click(Sender);
operator:=deleno;
form1.Label1.Caption:='dělěno';
end;
procedure TForm1.Button15Click(Sender: TObject);
begin
case operator of
plus : begin
Form1.Edit2.Text := floattostr(strtofloat(Form1.Edit2.Text) +
strtofloat(Form1.Edit1.Text));
form1.Label2.Caption:='plus';
end;
minus : begin
Form1.Edit2.Text := floattostr(strtofloat(Form1.Edit2.Text) -
strtofloat(Form1.Edit1.Text));
form1.Label2.Caption:='mínus';
end;
deleno : begin //////////// zde mi to hlásí chybu a konkrétně u té dvojtečky
try
Form1.Edit2.Text := floattostr(strtofloat(Form1.Edit2.Text) /
strtofloat(Form1.Edit1.Text));
form1.Label2.Caption:='dělno';
except
on EZeroDivide do form1.Label2.Caption:='Error /0'; //Nelze dělit nulou
end;
krat : begin
try
Form1.Edit2.Text := floattostr(strtofloat(Form1.Edit2.Text) /
strtofloat(Form1.Edit1.Text));
form1.Label2.Caption:='krat';
end;
end;
form1.Edit1.Text := '0';
end;
end.
Offline
to ginco:
jen tak zbezne jsem si vsimnul chybejiciho sluvka end; tady:
deleno : begin //////////// zde mi to hlásí chybu a konkrétně u té dvojtečky
try
Form1.Edit2.Text := floattostr(strtofloat(Form1.Edit2.Text) /
strtofloat(Form1.Edit1.Text));
form1.Label2.Caption:='dělno';
except
on EZeroDivide do form1.Label2.Caption:='Error /0'; //Nelze dělit nulou
end;
end; <-- tady
Offline
↑ plisna:
deleno : begin
try
Form1.Edit2.Text := floattostr(strtofloat(Form1.Edit2.Text) /
strtofloat(Form1.Edit1.Text));
form1.Label2.Caption:='děleno';
except
on EZeroDivide do form1.Label2.Caption:='Error /0'; //Nelze dělit nulou
end;
end;
krat : begin
try
Form1.Edit2.Text := floattostr(strtofloat(Form1.Edit2.Text) /
strtofloat(Form1.Edit1.Text));
form1.Label2.Caption:='krat';
end; tady mezi "d" a středníkem mi to hlásí chybu
end;
form1.Edit1.Text := '0';
end;
end.
Offline

Tak jednu zásadní chybu vidím v tom, že krát provádí dělení, navíc je tam try a není tam ani except ani finally.
Obecné připomínky: to form1. není potřeba psát a procedury na psaní číslic není potřeba psát jako 10 oddělených procedur... stačí přidat caption objektu Sender na konec textu, stejně tak jde sloučit obsluhu všech tlačítek krát,plus,mínus,děleno do jednoho.
Offline
↑ Kondr:
Paráda dík
Já jsem celkem začátečník, takže jsem se to snažil udělat co nejprostěji( neříkám že tvůj postup není jednoduší), ale aspoň to už klape, i když je tam ještě moře nedokonalostí, každopádně dík a určitě se ještě ozvu
Offline
malej dotaz : jak udělat odmocninu?
mam deklarované i : integer;
i:=strtoint(edit1.Text); // ta odmocnina by měla být vypočtena z edit1
Form1.Edit3.Text := sqrt(i) ; // tady by se měl zobrazit výsledek
rekapitulace : mam 2 edity vstupní a jeden výstupní, ze kterého bych vždy dělal odmocninu, ale nevim jak to udělat.
Všem co pomůžou dík
Offline

Určitě je potřeba to převést mezi řetězcem a reálným číslem (ne celým):
i:=strtofloat(edit1.Text); // ta odmocnina by měla být vypočtena z edit1
Form1.Edit3.Text := floattostr(sqrt(i)) ; // tady by se měl zobrazit výsledek
Offline
↑ Kondr:
takže si (i) mám deklarovat jako string??
hlásí mi to chybu přesně : Form1.Edit3.Text := floattostr(sqrt(*i)) ;
* = zde
takto jsem dělal mocninu a odmocninu
mocnina : begin
Form1.Edit3.Text := floattostr(strtofloat(Form1.Edit1.Text)*
strtofloat(Form1.Edit1.Text));
end;
sqrt : begin
Form1.Edit3.Text := floattostr(sqrt(i)) ; // tady by se měl zobrazit výsledek
end;
Offline
↑ plisna:
dík za radu, už to funguje
ted bych potřeboval pár rad: třeba jak udělat to, abych do editu mohl zadat jen jednu desetinou čárku;
že kurzor bude okamžitě po spuštění v editu, a že když budu dělit nulou, že mi to nezařve chybu;
dík nikde jsem podobné informace nenašel, kdyžtak mě jen nahoďte, já to pak zvládnu :-)
Offline
Tak sem jeste dej svou aktualni verzi kodu
Offline
je to bez čísel jen tlačítka s funkcemi( krat,sqrt,...)
taky jsem to trochu předělal, mám 2 edity vstupní a 1 výstupní, jenž zobrazuje výsledek
ke každému z těch 2 editu je přidán radiobutton
procedure TForm1.Button12Click(Sender: TObject);
begin
Form1.Edit3.Text := floattostr(strtofloat(Form1.Edit1.text) + strtofloat(Form1.Edit2.Text));
form1.Label1.Caption:='plus';
end;
procedure TForm1.Button13Click(Sender: TObject);
begin
form1.Label1.Caption:='děleno'; //Label ukáže, že odečítáme
try Form1.Edit3.Text := floattostr(strtofloat(Form1.Edit1.Text) / strtofloat(Form1.Edit2.Text));
except on EZeroDivide do form1.Label2.Caption:='Error /0'; //Nelze dělit nulou
end;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
try Form1.Edit3.Text := floattostr(strtofloat(Form1.Edit1.Text) * strtofloat(Form1.Edit2.Text));
finally
end;
form1.Label1.Caption:='krat';
end
procedure TForm1.Button14Click(Sender: TObject);
begin
Form1.Edit3.Text := floattostr(strtofloat(Form1.Edit1.Text) - strtofloat(Form1.Edit2.Text));
Form1.Label1.Caption:='mínus';
end;
procedure TForm1.Button16Click(Sender: TObject);
begin
Form1.Label1.Caption:='odmocnina';
i:=strtofloat(edit1.Text);
Form1.Edit3.Text := floattostr(sqrt(i)) ;
end;
procedure TForm1.Button17Click(Sender: TObject);
begin
Form1.Label1.Caption:='mocnina';
i:=strtofloat(edit1.Text);
Form1.Edit3.Text := floattostr(i*i) ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:= '';
edit2.Text:= '';
edit3.Text:= '';
radiobutton1.checked:=true;
radiobutton2.checked:=false;
end;
end.
Offline
to osetreni vice desetinnych carek v jednom zapise muzes napriklad osetrit tak, ze pri kazdem stisku klavesy projdes vsechny znaky v danem editboxu a spoctes v nem pocet carek, pokud jich bude vice nez jedna, tak provedes patricne napravne kroky (vynadani uzivateli apod.). jinak pro to, aby jsi mohl opakovat kus kodu pri kazdem stisku klavesy (respektive pri kazde zmene obsahu editboxu) ti dobre poslouzi udalost OnChange komponenty Edit
Offline
Dej dohromady kod odsud: http://www.delphibasics.co.uk/RTL.asp?Name=AnsiPos
s udalosti stisknuti klavesy v tvem edit boxu:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// #8 is Backspace
if not (Key in [#8, '0'..'9']) then begin
ShowMessage('Invalid key');
// Discard the key
Key := #0;
end;
end;
(tato funkce povoluje jen ciselny vstup do Edit1 textboxu)
Offline
↑ Saturday:
dík za rady, ale mam ještě dotaz:
toto: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); musím ještě napsat do type?
zkusil jsem to, ale napsalo to : expected '=' but'('found
myslí, že problém je v tom, že to nemám vložené do events( událostí) ale bohužel nevím jak na to
Offline
2Ginco: jen si klikni levym tlacitkem na formulari na svuj textbox a v okne properties (byva vpravo dole) si vyber udalosti a dvakrat si poklikej do okenka s udalosti keypress a pak obsah funkce v mem prispevku vyse do vygenerovane funkce
Offline
↑ Saturday:
super, dík, já to úplně zapomněl
ještě musim přijít na tu nulu v dělení a kurzor hned po spuštění a je to celkem fajn
jinak ta stránka je pecka :)
Offline
Resit to pres vyjimky je samozrejme mozne:
try Form1.Edit3.Text := floattostr(strtofloat(Form1.Edit1.Text) / strtofloat(Form1.Edit2.Text));
except on EZeroDivide do form1.Label2.Caption:='Error /0'; //Nelze dělit nulou
nicmene, ja bych asi pouzil obycejnou podminku:
if (strtofloat(Form1.Edit2.Text)=0) then
MsgBox("Nulou nepodelis.. 11. bozi prikazani");
else
Form1.Edit3.Text := floattostr(strtofloat(Form1.Edit1.Text) / strtofloat(Form1.Edit2.Text));
end if;
===============================================
Nejsem si moc jisty syntaxi, momentalne se mi to plete se C# ;-), ale logika je doufam jasna
Offline