Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Automatisch Rechnen (https://www.delphipraxis.net/5260-automatisch-rechnen.html)

bixi400 30. Mai 2003 05:40


Automatisch Rechnen
 
Hi!

Ich habe hier ein Edit.
Und ich möchte das man in das Edit eine Rechnung Schreiben kann (z.B. 542+48*(154-895)...).
Wie kann ich das machen???
(oder geht das überhaupt?)

Alexander 30. Mai 2003 07:55

kuck dir mal die Funktionen POS und COPY und vielleicht DELETE an. Sollten dir weiter helfen.

Mario 30. Mai 2003 09:23

Du kannst auch mal das probieren:
http://www.tmssoftware.com/calcedit.htm

flomei 30. Mai 2003 11:38

Du willst wahrscheinlich auch einen Taschenrechner schreiben, bei dem man alles in ein Edit eingibt und er anfängt zu rechnen. Das ist ganz schön kompliziert! Du musst den Term zerlegen und dann musst du ihm beibringen wie er z.B. mit Klammern umzugehen hat...
Sowas will ich auch machen aber das ist verdammt kompliziert und deshalb nach hinten in meiner To-Try List gerutscht.

MfG Florian :hi:

Mario 30. Mai 2003 11:47

Das habe ich vor ner Weile mal geschrieben:
Delphi-Quellcode:
function ParseStr(Value: String): Double;

 function GetKlammerZuPos(SubValue: PChar): Integer;
 var KlammerCount: Integer;
 begin
  KlammerCount := 1;
  for Result := 0 {0 ist 1. Klammer auf} to Length(SubValue) -1
   do
    begin // for
     if (SubValue + Result)[0] = '(' THEN inc(KlammerCount);
     if (SubValue + Result)[0] = ')' THEN dec(KlammerCount);
     if KlammerCount = 0 THEN Exit;
    end; // for
  Raise Exception.Create('Die Klammer wurd nicht wieder geschlossen: '+SubValue);
 end;

Var iPos, jPos: Integer;
    modValue : String;

begin
 modValue := Value;
 WHILE Pos('(',modValue) > 0 DO
  BEGIN
   iPos := Pos('(',modValue);
   jPos := GetKlammerZuPos(Pchar(modValue) + iPos);
   modValue := Copy(modValue,0,iPos-1) +
               FloatToStr(ParseStr(Copy(modValue,iPos+1,jPos))) +
               Copy(modValue,iPos+jPos+2,9999);
  END;

 if (Pos('-',modValue) > 0) OR
    (Pos('+',modValue) > 0)
  then
   begin // strichrechnung
     iPos := Pos('-',modValue);
     IF iPos <> 0
      THEN
       BEGIN
        Result := ParseStr(Copy(modValue,0,iPos-1)) - ParseStr(Copy(modValue,iPos+1,9999));
        Exit;
       END;

     iPos := Pos('+',modValue);
     IF iPos <> 0
      THEN
       BEGIN
        Result := ParseStr(Copy(modValue,0,iPos-1)) + ParseStr(Copy(modValue,iPos+1,9999));
        Exit;
       END;
     Raise Exception.Create('Programmierfehler !');
   end; // strichrechnung

 if (Pos('/',modValue) > 0) OR
    (Pos('*',modValue) > 0)
  then
   begin // punktrechnung
     iPos := Pos('/',modValue);
     IF iPos <> 0
      THEN
       BEGIN
        Result := ParseStr(Copy(modValue,0,iPos-1)) / ParseStr(Copy(modValue,iPos+1,9999));
        Exit;
       END;

     iPos := Pos('*',modValue);
     IF iPos <> 0
      THEN
       BEGIN
        Result := ParseStr(Copy(modValue,0,iPos-1)) * ParseStr(Copy(modValue,iPos+1,9999));
        Exit;
       END;
     Raise Exception.Create('Programmierfehler !');
   end; // punktrechnung

 // keine Rechnung mehr zum Auflösen gewesen
 Result := StrToFloat(modValue);
end;
Es war nur mal ein wenig Spielerei und darum auch nie im echten Einsatz getestet. Aber Punkt vor Strich und Klammern sollten schon gehen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz