![]() |
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?) |
kuck dir mal die Funktionen POS und COPY und vielleicht DELETE an. Sollten dir weiter helfen.
|
|
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: |
Das habe ich vor ner Weile mal geschrieben:
Delphi-Quellcode:
Es war nur mal ein wenig Spielerei und darum auch nie im echten Einsatz getestet. Aber Punkt vor Strich und Klammern sollten schon gehen...
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz