A kérdésem Delphiben az, hogy?
...hogyan tudom azt megoldani, hogy egy szövegmezőbe beírt két értéket, (egy operátor jel beiktatásával), akármilyen hosszú értéket, úgy kezeleje le a 4 alapművelettel, hogy annak eredménye egy másik beírómezőben megjelenjen?
Tehát, ha pl: az egyik editboxba beírom, hogy 542/2, akkor a másik editbox,ba jelenjen meg, ennek az eredménye. Ha pedig pl: azt írom, hogy 45678+12, akkor azt is végezze el és írja ki a végeredményét a másik editboxba. Tehát egy editboxon belül kezelje le a 4 alapművelet és írja ki egy másik boxba. Egy működő, de rossz példát beszúrok, szemléltetés képpen. Ennek az a baja, hogy csak két helyiértéket tud lekezelni az operátorokkal és nem "végtelent", vagy akármilyet.
procedure TForm1.Edit1Change(Sender: TObject);
begin
if (edit1.text <> '') and (edit2.Text <> '') then begin
end;
try
try
a:=strtoint(edit1.text[1]);
n:=edit1.text[2];
c:=strtoint(edit1.Text[3]);
{edit2.text:=floattostr(a)+'/'+ floattostr(c)+ '='+ floattostr(a/c);}
if n='+' then edit2.text:=floattostr(a)+'+'+ floattostr(c)+ '='+ floattostr(a+c);
if n='-' then edit2.text:=floattostr(a)+'-'+ floattostr(c)+ '='+ floattostr(a-c);
if n='*' then edit2.text:=floattostr(a)+'*'+ floattostr(c)+ '='+ floattostr(a*c);
if n='/' then edit2.text:=floattostr(a)+'/'+ floattostr(c)+ '='+ floattostr(a/c);
except
on EConvertError do
end;
except
on EAccessViolation do
end;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
try
if (Ord(key) = vk_back) then begin
edit1.clear;
edit2.Clear;
end;
except
on EAccessViolation do
end;
end;
end.
Régen dolgoztam Delphiben. Valami ilyesmi lesz:
(Feltételezzük, hogy az Edit1 azért megfelelő formátumban van. Feltételeztem azt is, hogy a „bármilyen hosszú” számodra olyan számot jelenti, ami ábrázolható egy Delphi változóban.)
procedure TForm1.Edit1Change(Sender: TObject);
var hely:integer;
a,b:Extended;
c:char;
begin
try
Edit2.text:='Error';
hely:=pos('+',Edit1.text);
if (pos('-',Edit1.text)>0) then hely:=pos('-',Edit1.text);
if (pos('*',Edit1.text)>0) then hely:=pos('*',Edit1.text);
if (pos('/',Edit1.text)>0) then hely:=pos('/',Edit1.text);
if (hely>0) then begin
a:=StrToFloat(copy(Edit1.text,1,hely-1));
b:=strtofloat(copy(Edit1.text,hely+1,length(Edit1.text)));
c:=Edit1.text[hely];
case c of
'+': Edit2.text:=FloatToStr(a+b);
'-': Edit2.text:=FloatToStr(a-b);
'*': Edit2.text:=FloatToStr(a*b);
'/': Edit2.text:=FloatToStr(a/b);
end;
end;
finally
end;
end;
Persze ennél jóval tömörebb megoldás is van, de talán így érthető, mi történik.
Elsőként megkeressük a műveleti jel helyét. Ennek ismeretében kettévágjuk az Edit1.text tartalmát és számmá konvertáljuk. A műveleti jel alapján elágaztatva elvégezzük a műveletet és beletesszük az edit2.text-ben.
Az egészet megfűszerezzük némi kivételkezeléssel, hogy a hibák esetén is legyen valami kiírva, illetve ne szálljon el az egész.
500 jegyű szám és pontos számítás esetén már kicsit valóban érdekesebb a feladat. (BC for Windows? :-) ) (Próbáltam már hasonlót, nem is olyan egyszerű, főleg ha a sebesség is szempont.)
Bár azt gondolom egy ilyen problémára nem a gyarkorikerdesek.hu-n szoktak válaszolni.
Másik oldalról meg vannak ilyen komponensek, ergo lehet nem is olyan sok idő megcsinálni, ha az ember felhasználja ezeket.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!