⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser1.pas

📁 一款由Zlib来的数学公式解析器
💻 PAS
字号:
{******************************************************************
*  (c)copyrights Capella Development Group, Donetsk 1999-2000
*  Project: Zeos Library
*  Module: Formula Parser Test
*  Author: Sergey Seroukhov   E-Mail: voland@kita.dgtu.donetsk.ua
*  Date: 23/09/99
*
*  List of changes:
******************************************************************}

unit Parser1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ZParser, StdCtrls, ExtCtrls, ZExtra;

type
  TfrmMain = class(TForm)
    pnMain: TPanel;
    edtFormula: TEdit;
    lblFormula: TLabel;
    btnPlot: TButton;
    btnCancel: TButton;
    lblXmin: TLabel;
    lblXmax: TLabel;
    lblYmin: TLabel;
    lblYmax: TLabel;
    edtXmin: TEdit;
    edtXmax: TEdit;
    edtYmin: TEdit;
    edtYmax: TEdit;
    pnFunc: TPanel;
    pbFunc: TPaintBox;
    prMain: TZParser;
    procedure btnCancelClick(Sender: TObject);
    procedure btnPlotClick(Sender: TObject);
    procedure pbFuncPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

// On Exit Button Click
procedure TfrmMain.btnCancelClick(Sender: TObject);
begin
  Close;
end;

// Plot Graph click
procedure TfrmMain.btnPlotClick(Sender: TObject);
var
  Xmin, Xmax, Ymin, Ymax: Double;
  X, dX, Y, kX, kY: Double;

// Calculate X coordinate
function Xcoord(X: Double): Integer;
begin
  Result := Trunc((X-Xmin)/kX);
end;

// Calculate Y coordinate
function Ycoord(Y: Double): Integer;
begin
  Result := pbFunc.Height-Trunc((Y-Ymin)/kY);
end;

begin
  prMain.Equation := edtFormula.Text;
  Xmin := StrToFloatDefEx(edtXmin.Text,-100);
  Xmax := StrToFloatDefEx(edtXmax.Text,100);
  Ymin := StrToFloatDefEx(edtYmin.Text,-100);
  Ymax := StrToFloatDefEx(edtYmax.Text,100);

  kX := (Xmax-Xmin)/pbFunc.Width;
  kY := (Ymax-Ymin)/pbFunc.Height;

  if (kX=0) or (kY=0) then exit;

  with pbFunc.Canvas do begin
    Pen.Color := clBlack;
    Rectangle(0,0,pbFunc.Width,pbFunc.Height);
    Pen.Width := 2;

    MoveTo(Xcoord(Xmin),Ycoord(0));
    LineTo(Xcoord(Xmax),Ycoord(0));
    MoveTo(Xcoord(0),Ycoord(Ymin));
    LineTo(Xcoord(0),Ycoord(Ymax));
  end;

  dX := (Xmax-Xmin)/pbFunc.Width;
  X := Xmin;
  pbFunc.Canvas.Pen.Color := clBlue;
  pbFunc.Canvas.Pen.Width := 1;
  while X<=Xmax do begin
    prMain.Variables['X'] := X;
    Y := prMain.Evalute;
    if X=Xmin then pbFunc.Canvas.MoveTo(Xcoord(X),Ycoord(Y))
    else pbFunc.Canvas.LineTo(Xcoord(X),Ycoord(Y));
    X := X+dX;
  end;

end;

// On Paint Box paint event 
procedure TfrmMain.pbFuncPaint(Sender: TObject);
begin
  try
    btnPlotClick(Sender);
  except
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -