unit Main; //26.01.2012

{$mode objfpc}{$H+}

interface

uses Classes,SysUtils,FileUtil,Forms,Controls,Graphics,Dialogs,StdCtrls,ExtCtrls;

type TFormRechner=class(TForm)
      ButtonZeichnen   :TButton;
      ButtonEnde       :TButton;
      CheckBoxMaxWerte :TCheckBox;
      Image            :TImage;
      LabeledEditFormel:TLabeledEdit;
      LabeledEdityMax  :TLabeledEdit;
      LabeledEdityMin  :TLabeledEdit;
      LabeledEditxMax  :TLabeledEdit;
      LabeledEditxMin  :TLabeledEdit;
      procedure ButtonEndeClick(Sender:TObject);
      procedure ButtonZeichnenClick(Sender:TObject);
      procedure CheckBoxMaxWerteClick(Sender:TObject);
     end;

var FormRechner:TFormRechner;

implementation

{$R *.lfm}

Uses FCompiler;

procedure TFormRechner.ButtonEndeClick(Sender:TObject);
begin Close end;

procedure TFormRechner.ButtonZeichnenClick(Sender:TObject);
Var x,xMin,xMax,y,yMin,yMax,DeltaX:Extended;
 Procedure EingabeWerteUeberpruefen(Var Fehler:Boolean);
  Var F:Integer;
  Begin
   Fehler:=False;
   Val(LabeledEditxMin.Text,xMin,F);
   If F<>0 Then Begin ShowMessage('Falscher x-Min Wert!');Fehler:=True;Exit End;
   Val(LabeledEditxMax.Text,xMax,F);
   If F<>0 Then Begin ShowMessage('Falscher x-Max Wert!');Fehler:=True;Exit End;
   If xMin>=xMax Then
    Begin ShowMessage('xMax muss groesser sein als xMin!');Fehler:=True;Exit End;
   Val(LabeledEdityMin.Text,yMin,F);
   If F<>0 Then Begin ShowMessage('Falscher y-Min Wert!');Fehler:=True;Exit End;
   Val(LabeledEdityMax.Text,yMax,F);
   If (F<>0) Then Begin ShowMessage('Falscher y-Max Wert!');Fehler:=True;Exit End;
   If yMin>=yMax Then
    Begin ShowMessage('yMax muss groesser sein als yMin!');Fehler:=True End
  End;
 Procedure MaximalWerteBerechnen;
 Const Vergroessern=20;
 Var   DeltaY:Extended;
 Begin
  yMin:=ErgebnisFehler;yMax:=-yMin;x:=xMin;
  While x<=xMax+DeltaX/2 Do
   Begin
    y:=f(x,0);
    If y<=yMin Then yMin:=y;
    If y>=yMax Then yMax:=y;
    x:=x+DeltaX
   End;
  If yMin=yMax Then Begin yMin:=y-Vergroessern;yMax:=y+Vergroessern End;
  DeltaY:=(yMax-yMin)/Vergroessern;
  yMin:=yMin-DeltaY;yMax:=yMax+DeltaY
 End;
 Function FaktorX(x:Extended):Word;
 Begin FaktorX:=Round((Image.Canvas.Width)*(x-xMin)/(xMax-xMin)) End;
 Function FaktorY(y:Extended):Word;
 Begin
  With Image.Canvas Do
   FaktorY:=Height-(Round((Height)*(y-yMin)/(yMax-yMin))) End;
 Procedure FunktionZeichnen;
 Var x1,y1:Extended;
     i    :Byte;
 Begin
  With Image.Canvas Do
   Begin
    Pen.Color:=clBlack;Brush.Color:=clWhite;
    For i:=1 To 2 Do Rectangle(0,0,Width,Height);
    x:=xMin;y:=f(x,0);
    While x<=xMax+DeltaX/2 Do
     Begin
      x1:=x+DeltaX;y1:=f(x1,0);
      If (y>=yMin) And (y<=yMax) And (y1>=yMin) And (y1<=yMax) Then
       Begin MoveTo(FaktorX(x),FaktorY(y));LineTo(FaktorX(x1),FaktorY(y1)) End;
      y:=y1;x:=x1
     End
   End
 End;
 Procedure xAchseZeichnen;
 Begin
  If yMin*yMax<0 Then
   With Image.Canvas Do
    Begin
     Pen.Color:=clRed;
     MoveTo(FaktorX(xMin),FaktorY(0));LineTo(FaktorX(xMax),FaktorY(0))
    End
 End;
 Procedure yAchseZeichnen;
 Begin
  If xMin*xMax<0 Then
   With Image.Canvas Do
    Begin
     Pen.Color:=clRed;
     MoveTo(FaktorX(0),FaktorY(yMin));LineTo(FaktorX(0),FaktorY(yMax))
    End
 End;
Var Fehler:Boolean;
begin
 CompiliereFormel(LabeledEditFormel.Text,Fehler);
 If Not Fehler Then
  Begin
   EingabeWerteUeberpruefen(Fehler);
   If Not Fehler Then
    Begin
     DeltaX:=(xMax-xMin)/Width;
     If CheckBoxMaxWerte.Checked Then MaximalWerteBerechnen;
     FunktionZeichnen;xAchseZeichnen;yAchseZeichnen;
    End
  End
end;

procedure TFormRechner.CheckBoxMaxWerteClick(Sender:TObject);
begin
 If CheckBoxMaxWerte.Checked Then
  Begin LabeledEdityMin.Visible:=False;LabeledEdityMax.Visible:=False End
                             Else
  Begin LabeledEdityMin.Visible:=True;LabeledEdityMax.Visible:=True End
end;

end.
