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

📄 unitmain.pas

📁 常用数学计算工具
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  MessageBox(Handle,'运算错误!','错误',mb_OK);
  FreeAll;
  exit;
 end;
 FreeAll;
end;

procedure TFormMath.Edit2VSChange(Sender: TObject);
var
 S:String;
 FunCom:TFunCommand;
begin
 Edit2VS.Font.Color:=clBlack;
 Case ComboBox2V.ItemIndex of
  0: begin
      S:=CStrToSStr(Edit2VS.Text,SStrs);
      if not StrToFuncomN(S,FunCom,'X','Y') then
         Edit2VS.Font.Color:=clRed;
     end;
  1: begin
      S:=CStrToSStr(Edit2VS.Text,SStrs);
      if not StrToFuncomN(S,FunCom,'Z','X') then
         Edit2VS.Font.Color:=clRed;
     end;
  2: begin
      S:=CStrToSStr(Edit2VS.Text,SStrs);
      if not StrToFuncomN(S,FunCom,'Y','Z') then
         Edit2VS.Font.Color:=clRed;
     end;
 end;
 FreeFunCommand(FunCom);
end;


procedure TFormMath.Edit2VSKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin Key:=#0; Edit2VbZ.SetFocus; end;
end;

procedure TFormMath.Edit2VZKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin Key:=#0; Edit2VX.SetFocus; end;
end;

procedure TFormMath.Edit2VXKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin Key:=#0; Edit2VbZ.SetFocus; end;
end;

procedure TFormMath.Edit2VbZKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin Key:=#0; Edit2VeZ.SetFocus; end;
end;

procedure TFormMath.Edit2VeZKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin Key:=#0; Edit2VbX.SetFocus; end;
end;

procedure TFormMath.Edit2VbXKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin Key:=#0; Edit2VeX.SetFocus; end;
end;

procedure TFormMath.Edit2VeXKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin Key:=#0; BitBtn2Vclick(nil); end;
end;

procedure TFormMath.Edit2VZChange(Sender: TObject);
begin
 JudgeInt(Sender);
end;

procedure TFormMath.Edit2VbZChange(Sender: TObject);
var
 CX,CZ:Char;

begin
 Case ComboBox2V.ItemIndex of
  1: begin cX:='Z'; cZ:='X'; end;
  2: begin cX:='Y'; cZ:='Z'; end;
  else begin cX:='X'; cZ:='Y'; end; //0:
 end;
{ Case ComboBox2V.ItemIndex of
  0: begin CX:='Y'; CZ:='Z'; end;
  1: begin CX:='Z';  CZ:='X'; end;
  else begin CX:='X';  CZ:='Y'; end; //2
 end;}
 if (JudgeFloat(Edit2VbZ) and JudgeFloat(Edit2VeZ)
   and JudgeCStr(Edit2VbX,CX)and JudgeCStr(Edit2VeX,CX) )
  or (JudgeFloat(Edit2VbX) and JudgeFloat(Edit2VeX)
   and JudgeCStr(Edit2VbZ,CZ)and JudgeCStr(Edit2VeZ,CZ) )
  then begin
   Edit2VbZ.Font.Color:=clBlack;   Edit2VeZ.Font.Color:=clBlack;
   Edit2VbX.Font.Color:=clBlack;   Edit2VeX.Font.Color:=clBlack;
  end else begin
   Edit2VbZ.Font.Color:=clRed;   Edit2VeZ.Font.Color:=clRed;
   Edit2VbX.Font.Color:=clRed;   Edit2VeX.Font.Color:=clRed;
  end;
end;


procedure TFormMath.SDFunMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 ValueX,ValueY:Double;
 AlphaX,AlphaY,AlphaZ:Extended;
 i:Integer;
 Error:Byte;
begin
  try
   sdfun.GetPositionValue(X,Y,ValueX,ValueY);
   i:=SDfun.GetNearPoint(ValueX,ValueY);
   if {SDfun.CanStickHint and} not(SDfun.Can3D) then begin
    EditNPS.Text:=SCienceDraw.MyFormatFloat(SDfun.GetPointSlope(i,Error),SDfun.HintValidNums);
   end;
   if (NELinkN.Checked)and(not SDFun.Can3D) then begin
    SDfun.RefreshSDOK;
    SDfun.DrawSCLine(ValueX,ValueY,SDFun.Points[i].ValueX,SDFun.Points[i].ValueY);
   end;
  except
   //EditNPS.Text:='错误';
  end;
 if not CheckBoxEE.Checked then exit; 
 if not fCanResize then begin  exit; end;
 if sdfun.Can3D then begin
  AlphaX:=0; AlphaY:=0; AlphaZ:=0;
  Case sdfun.Cursor of
   crSizeNS: AlphaY:=(Y-OrgY);
   crSizeWE: AlphaZ:=(X-OrgX);
   crSizeNWSE: AlphaX:=(X-OrgX+y-OrgY)/2;
  end;
  SDFun.Roll3D((sdfun.CMaxX+sdfun.CMinX)/2,(sdfun.CMaxY+sdfun.CMinY)/2,
            (sdfun.CMaxZ+sdfun.CMinZ)/2,AlphaX,AlphaY,AlphaZ);
 end else begin
  SDfun.ViewStart:=Point(SDFun.ViewStart.x-X+OrgX,SDFun.ViewStart.y-Y+OrgY);
 end;
 OrgX:=x; OrgY:=Y;
 SDfun.Refresh;
end;

procedure TFormMath.SDFunMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if not CheckBoxEE.Checked then exit;
 fCanResize:=False;
 if SDFun.PointsNum=0 then exit;
 if Button<>mbRight then exit;
 OrgX:=X; OrgY:=Y;
 if SDFun.Can3D then begin
  if (y<SDFun.Height div 4) then begin SDFun.Cursor:=crSizeWE;  fCanResize:=True; end;
  if (X>Width*3 div 4)and(y>SDFun.Height div 4) then begin SDFun.Cursor:=crSizeNs;  fCanResize:=True; end;
  if (x<Width div 4) and (y>SDFun.Height div 4) then begin SDFun.Cursor:=crSizeNWSE;  fCanResize:=True; end;
 end else begin SDFun.Cursor:=crHandPoint; fCanResize:=True; end;
end;

const MaxViewRatio=1000000; MinViewRatio=0.5;
procedure TFormMath.SDFunMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
 CX,CY:Double;
begin
 if not CheckBoxEE.Checked then exit;
 fCanResize:=False;
 if SDFun.PointsNum=0 then exit;
 if(Button<>mbRight)and(not SDFun.Can3D)then
  begin
   SDFun.Cursor:=2;
   SDFun.GetPositionValue(X,Y,CX,CY);
   SDFun.ViewXRatio:=SDFun.ViewXRatio*BitBtnMoreR.Tag/100;
   SDFun.ViewYRatio:=SDFun.ViewYRatio*BitBtnMoreR.Tag/100;
   if SDFun.ViewXRatio<MinViewRatio then SDFun.ViewXRatio:=MinViewRatio;
   if SDFun.ViewYRatio<MinViewRatio then SDFun.ViewYRatio:=MinViewRatio;
   if SDFun.ViewXRatio>MaxViewRatio then SDFun.ViewXRatio:=MaxViewRatio;
   if SDFun.ViewYRatio>MaxViewRatio then SDFun.ViewYRatio:=MaxViewRatio;
   EditXVR.Tag:=1; EditYVR.Tag:=1;
   EditXVR.Text:=FormatFloat('0.##',SDFun.ViewXRatio);
   EditYVR.Text:=FormatFloat('0.##',SDFun.ViewYRatio);
   EditXVR.Tag:=0; EditYVR.Tag:=0;
   SDFun.SetValueCenter(CX,CY);
   SDFun.SetValueCenter(CX,CY);
   SDFun.Refresh;
  end;
 SDFun.Cursor:=crCross;
 Application.ProcessMessages;
end;

procedure TFormMath.SDFunMouseLeave(Sender: TObject);
begin
 SDFun.CanColorPoint:=False;
 fCanResize:=False;
 SDFun.Cursor:=crCross;
 SDFun.Refresh;
end;

procedure TFormMath.PageControlGraphChange(Sender: TObject);
begin
 Case PageControlGraph.ActivePageIndex of
  0,3: if SDFun.Can3D then begin SDFun.Can3D:=False; SDFun.Refresh; end;
  1,5: if not SDFun.Can3D Then begin SDFun.Can3D:=True; SDFun.Refresh; end;
 end;
end;

procedure TFormMath.MemoComplexChange(Sender: TObject);
var
 rs,rx,R:Extended;
begin
  try
  if CacuCompStrValue(MemoComplex.text,rs,rx,SStrs)
    then begin
     MemoComplex.Font.Color:=clBlack;
     EditCSV.Text:=FloatToStr(rs);
     EditCXV.Text:=FloatToStr(rx);
     R:=Sqrt(RS*RS+RX*RX);
     EditCFV.Text:=FloatToStr(R);
     if RS<>0
      then EditCFAV.Text:=FloatToStr(ArcTan(RX/RS))
      else if RX<>0 then EditCFAV.Text:='90'
                    else EditCFAV.Text:='0';
    end else begin
     MemoComplex.Font.Color:=clRed;
     EditCSV.Clear;  EditCXV.Clear;
    end;
  except
   MemoComplex.Font.Color:=clRed;
   EditCSV.Clear;  EditCXV.Clear;
  end;
end;

procedure TFormMath.MemoNormalChange(Sender: TObject);
var
 FunCom:TFunCommand;
 S:String;
 R:Boolean;
begin
 try
  S:=CStrToSStr(MemoNormal.Lines.Text,SStrs);
  R:=False;
  try
  Case ComboBoxVNum.ItemIndex of
  0:  R:=StrToFunComN(S,FunCom,'UNKNOW');
  1:  R:=StrToFunComN(S,FunCom,EditV1C.Text);
  2:  R:=StrToFunComN(S,FunCom,EditV1C.Text,EditV2C.Text);
  3:  R:=StrToFunComN(S,FunCom,EditV1C.Text,EditV2C.Text,EditV3C.Text);
  4:  R:=StrToFunComN(S,FunCom,EditV1C.Text,EditV2C.Text,EditV3C.Text,EditV4C.Text);
  5:  R:=StrToFunComN(S,FunCom,EditV1C.Text,EditV2C.Text,EditV3C.Text,EditV4C.Text,EditV5C.Text);
 end;
 if not R then begin //错误
  MemoNormal.Font.Color:=clRed;  EditAnswer.Clear;
 end else begin
  MemoNormal.Font.Color:=clBlack;
  EditAnswer.Text:=FloatToStr(GetFunValueN(FunCom,V1,V2,V3,V4,V5));
 end;
 except
   MemoNormal.Font.Color:=clRed;
 end;
 finally
  FreeFunCommand(FunCom);
 end;
end;

procedure TFormMath.MemoNormalKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#27 then begin
  TCustomEdit(Sender).Clear;
  if (Sender is TCustomEdit)and Assigned(TEdit(Sender).OnChange)
    then TEdit(Sender).OnChange(Sender);
 end;
end;

procedure TFormMath.ComboBoxVNumChange(Sender: TObject);
var
 i:Integer;
begin
 for i:=1 to ComboBoxVNum.ItemIndex do begin
  TWinControl(FindComponent('EditV'+IntToStr(i)+'V')).Enabled:=True;
  TWinControl(FindComponent('EditV'+IntToStr(i)+'C')).Enabled:=True;
 end;
 for i:=ComboBoxVNum.ItemIndex+1 to ComboBoxVNum.Items.Count-1 do begin
  TWinControl(FindComponent('EditV'+IntToStr(i)+'V')).Enabled:=False;
  TWinControl(FindComponent('EditV'+IntToStr(i)+'C')).Enabled:=False;
 end;
 MemoNormalChange(MemoNormal);
end;

procedure TFormMath.EditV1CChange(Sender: TObject);
var
 S:String;
 Temp:TObject;
begin
 S:=TLabeledEdit(Sender).Text;
 if s='' then exit;
 if Length(s)>1 then begin
  Delete(S,2,Length(s)-1);
  TLabeledEdit(Sender).Text:=S;
  exit;
 end;
 if S[1]>'Z' then S:='Z';
 if S[1]<'A' then S:='A';
 if S<>TLabeledEdit(Sender).Text then begin
   TLabeledEdit(Sender).Text:=S;
   exit;
  end;

 if ((EditV1C.Text=S)and(Sender<>EditV1C))or
    ((EditV2C.Text=S)and(Sender<>EditV2C))or
    ((EditV3C.Text=S)and(Sender<>EditV3C))or
    ((EditV4C.Text=S)and(Sender<>EditV4C))or
    ((EditV5C.Text=S)and(Sender<>EditV5C))then
 begin
  TLabeledEdit(Sender).Text:='';
  MessageBox(Handle,'不能有同名的变量代号!','错误',mb_OK);
  exit;
 end;

 S:=TComponent(Sender).Name;
 S[7]:='V';
 Temp:=FindComponent(S);
 with TLabeledEdit(Temp) do
  begin
   EditLabel.Caption:= TLabeledEdit(Sender).Text+'=';
   if Assigned(OnChange) then OnChange(Temp);
  end;
end;

procedure TFormMath.EditV1CExit(Sender: TObject);
begin
 if TLabeledEdit(Sender).text=''
  then TLabeledEdit(Sender).SetFocus;
end;

procedure TFormMath.EditV1VChange(Sender: TObject);
var
 V:Extended;
begin
 if CStrToFloat(TEdit(Sender).Text,V,SStrs)
 then begin
  TEdit(Sender).Font.Color:=clBlack;
  MemoNormalChange(nil);
 end else begin
  TEdit(Sender).Font.Color:=clRed;
  EditAnswer.Clear;
 end;

 Case TComponent(Sender).Tag of
  0: V1:=V;
  1: V2:=V;
  2: V3:=V;
  3: V4:=V;
  4: V5:=V;
 end;
end;

procedure TFormMath.EditV1VKeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#$D then begin
  if TComponent(Sender).Tag<ComboBoxVNum.ItemIndex-1
  then begin//下一个
   TWinControl(FindComponent('EditV'
      +IntToStr(TComponent(Sender).Tag+2)
      +'V')).SetFocus;
  end else begin//开头一个
   EditV1V.SetFocus;
  end;
 end;
end;

procedure TFormMath.EditDecChange(Sender: TObject);
var
 Value:Extended;
begin
 if EditDec.Tag=1 then exit; //防止死锁
 EditHex.Tag:=1;
 try
 if CStrToFloat(EditDec.Text,Value,SStrs) then begin
  EditHex.Text:=FloatToHex(Value);
  EditDec.Font.Color:=clBlack;
  EditHex.Font.Color:=clBlack;
 end else begin
  EditHex.Clear;
  EditDec.Font.Color:=clRed;
 end;
 except
 end;
 EditHex.Tag:=0;
end;

procedure TFormMath.EditHexChange(Sender: TObject);
var
 Value:Extended;
begin
 if EditHex.Tag=1 then exit;
 EditDec.Tag:=1;
 Try
 if HexToFloat(EditHex.Text,Value) then begin
  EditDec.Text:=FloatToStr(Value);
  EditDec.Font.Color:=clBlack;
  EditHex.Font.Color:=clBlack;
 end else begin
  EditDec.Clear;
  EditHex.Font.Color:=clRed;
 end;
 except
 end;
 EditDec.Tag:=0; 
end;

procedure TFormMath.EditJDChange(Sender: TObject);
var
 Value:Extended;
begin
 try
 if EditJD.Tag=1 then exit;
 EditHD.Tag:=1;
 if DFMtoFloat(EditJD.Text,Value) then begin
  EditHD.Text:=FloatToStr(Value);
  EditJD.Font.Color:=clBlack;
  EditHD.Font.Color:=clBlack;
 end else begin
  EditHD.Clear;
  EditJD.Font.Color:=clRed;
 end;
 except
 end;
 EditHD.Tag:=0;
end;

procedure TFormMath.EditHDChange(Sender: TObject);
var
 Value:Extended;
begin
 try
 if EditHD.Tag=1 then exit;
 EditJD.Tag:=1;
 if CstrtoFloat(EditHD.Text,Value,SStrs) then begin
  EditJD.Text:=FloatToDFM(Value);
  EditJD.Font.Color:=clBlack;
  EditHD.Font.Color:=clBlack;
 end else begin
  EditJD.Clear;
  EditHD.Font.Color:=clRed;

⌨️ 快捷键说明

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