Autor Beitrag
violinenspieler1000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 06.08.08 15:09 
Hallo,

ich möchte in einem Programm eine Zeile haben, wo der Benutzer im Excel-Syntax Mathematik-Aufgaben eingeben kann, also in der Art "=WURZEL(1+15)*Pi()", meinetwegen aber auch im Delphi-Syntax "=sqrt(1+15)*Pi"

Wie programmiert man soetwas am besten? Ich kann ja die Zeile nicht einfach einlesen und wie normalen Delphi-Quellcode ablaufen lassen, oder?
Ansonsten bräuchte man wahrscheinlich bestimmt zwanzig if-abfragen, oder?

Thomas


Zuletzt bearbeitet von violinenspieler1000 am Mi 06.08.08 15:14, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 06.08.08 15:12 
Moin!

Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

Vorschlag: "Mathe-Ausdrücke ausrechnen mit Delphi (z.B. wie in Excel)"

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 06.08.08 15:13 
Du brauchst einen Mathe-Parser.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 06.08.08 18:59 
Für diesen Fall würde ich dir PascalScript von RemObjects empfehlen. Das kannst du auf der Seite kostenlos herunterladen und anschließend installieren. Ich schreibe mal schnell eine Kurzanleitung, wie du das dann für deinen Fall nutzen kannst.

Wir brauchen für unsere Form einen TButton, ein TEdit, ein TLabel und die TPSScript-Komponente, die nun oben in der Komponentenleiste zu finden sein sollte. Doppelklick auf den Button und folgenden Source übernehmen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  Messages: String;
  X: Integer;
begin
  PSScript1.Script.Text :=
           'var ' +
             'X: Double; ' +
           'begin ' +
             'X := ' + Edit1.Text + '; ' +
             'GetResult(X); ' +
          'end. ';

  if not (PSScript1.Compile) then
  begin
    for X := 0 to PSScript1.CompilerMessageCount - 1 do
      Messages := Messages + PSScript1.CompilerMessages[X].MessageToString + #13#10;

    Label1.Caption := 'Fehler bei der Eingabe: ' + #13#10 + Messages;
  end;
end;


Was wurde hier gemacht? Zuerst wurde ein Script an PascalScript übergeben. Dieses Script besteht aus einer Variable X, dann der Rechnung, die in Edit1 steht und einem Funktionsaufruf von GetResult, bei dem X übergeben wird. Diese Funktion müssen wir gleich noch schreiben. Dann wird das Script durchen den Compiler von PascalScript gejagt. Sollten hierbei Fehler auftreten (Compile gibt False zurück), also falls der User eine ungültige Rechnung eingegeben hat, so werden die Fehler im Label1 angezeigt.

Nun wechseln wir wieder zu unserer Form, wählen die PSScript-Komponente aus, gehen im Objektinspektor auf Ereignisse und doppelklicken in das leere weiße Feld rechts von OnCompile. Der Quelltext springt nach vorne und wir nehmen folgenden Source:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.PSScript1Compile(Sender: TPSScript);
begin
  Sender.AddMethod(Self, @TForm1.GetResult,
                   'procedure GetResult(Val: Double);');
end;


Wir sagen PascalScript dadurch, dass es eine Funktion GetResult gibt (bzw. gleich geben wird), diese ist eine Methode von unserer Form1. Erst jetzt ist es möglich, dass wir im oberen Stück Source, welches wir PascalScript übergeben, auf diese Funktion zugreifen. Fehlt uns also noch diese eine Funktion.

Wir scrollen nach ganz oben, wo wir folgenden Block finden und wie hier ersetzen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    PSScript1: TPSScript;
    procedure Button1Click(Sender: TObject);
    procedure PSScript1Compile(Sender: TPSScript);
  private
    { Private-Deklarationen }
    procedure GetResult(Val: Double);
  public
    { Public-Deklarationen }
  end;


Die Funktion GetResult kann problemlos als privat deklariert werden, PascalScript findet sie trotzdem - sofern wir sie auch geschrieben haben und das kommt jetzt. Ein wenig weiter nach unten scrollen, bis wir {$R *.dfm} finden. Dort brauchen wir dieses Stück Quelltext:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{$R *.dfm}

procedure TForm1.GetResult(Val: Double);
begin
  Label1.Caption := FloatToStr(Val);
end;


Nun sollte auch klar werden, was diese Funktion macht: Sie gibt das Ergebnis der Berechnung im Label1 aus, wie das auch sein sollte.

Damit sind wir auch schon fertig. Gibt der Anwender nun in das Edit zum Beispiel sqrt(15*2) - Pi ein, so gibt unser Programm im Label 2,33563... aus. Das Programm funktioniert also wie gewünscht.

Einige Hinweise:
- Momentan können böse Anwender auch Script im Edit eingeben, der dann womöglich ausgeführt wird. Strichpunkte können so ein Indiz sein und sollten mit StringReplace entfernt werden.
- Will man eigene Funktionsnamen, wie z.B. WURZEL statts sqrt verwenden, so muss der Text im Edit vorher mit StringReplace entsprechend ersetzt werden.
- Das Tutorial wurde gerade eben geschrieben, ich habe auch gerade eben zum ersten Mal PascalScript verwendet, es kann also durchaus sein, dass es noch einfachere Varianten oder Dinge zum Beachten gibt. Aber für den Anfang sollte das reichen.

Grüße
GTA-Place

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)


Zuletzt bearbeitet von GTA-Place am Do 09.04.09 18:53, insgesamt 1-mal bearbeitet
Stundenplan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Do 09.04.09 17:25 
Hallo!
Ich weiß, der Beitrag ist schon ne Weile her, aber ich würd trotzdem gerne den Downloadlink oben nutzen können (der geht nicht mehr! :wink: )
Sprich: Erneuerung des Links erwünscht!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.04.09 17:32 
Das ist jetzt nicht dein Ernst, oder? Da steht doch genau dran wie das Produkt heißt, also wohin der Link führen sollte, und sogar die Seite selbst existiert ja, nur der Link hat sich ein wenig geändert... :roll:

Klick hier...
Stundenplan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Do 09.04.09 17:39 
Ich bin halt pessimistisch: Ich dachte, wenn schon der Link nix tut, dann existiert das ganze nicht mehr, weil man das wieder vom Server gelöscht hat, und ich dachte, vllt kann ja jemand das Teil als Anhang oder so . . . :oops:

P.S. Schöne Animation!

Moderiert von user profile iconNarses: überflüssige Zeilenumbrüche entfernt
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Do 09.04.09 17:42 
Naja.. Programmname, Google :think: :dance2:

Braucht aber niemandem peinlich zu sein, auf diese einfache Idee kommen erstaunlich wenig Leute, und die meißten von uns haben sicherlich schon einmal "dumm" gefragt. Wenn es ein oder zwei Mal passiert ist, denkt man von selbst als erstes daran ;)

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 09.04.09 18:52 
Habe den Link aktualisiert. Anhang wäre nicht gerade sinnvoll, weil es ja neue Versionen geben könnte (die letzte ist von Ende Februar diesen Jahres).

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.04.09 19:25 
Wie wäre es mit dem Link zur Produktseite statt zu der Datei direkt? ;-)
www.remobjects.com/ps
Stundenplan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Sa 11.04.09 12:38 
Das Teil funktioniert nicht:
Ich installiere es, starte Delphi - und
dieses sagt, es hätte sämtliche *.BPL- und andere Dateien nicht gefunden und ob es diese
beim nächsten Start laden soll!
In der Komponentenpalette sind auch keine Änderungen! (liegt aber wohl daran,
dass er die Dateien nicht gefunden hat :wink: )
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.04.09 20:21 
Hmm, was das beim Installieren macht müsste ich mal schauen, aber such die Dateien doch einfach mal auf der Platte, vielleicht liegen die an einer falschen Stelle.