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

📄 unitmain.pas

📁 常用数学计算工具
💻 PAS
📖 第 1 页 / 共 5 页
字号:
end;

procedure TFormMath.FunDefKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 FunDefChange(nil);
end;

procedure TFormMath.FunDefMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 FunDefChange(nil);
end;

procedure TFormMath.FunDefChange(Sender: TObject);
begin
 LabelRC.Caption:=IntToStr(FunDef.caretPos.Y+1)+
  ':'+IntToStr(FunDef.caretPos.X+1);
 FunDef.HighLightedLine:=-1;
 if Sender<>nil then FileChanged:=True;
end;

procedure TFormMath.BitBtnSaveClick(Sender: TObject);
begin
 FunDef.Lines.SaveToFile(OrgPath+LibFile);
 FileChanged:=False; 
end;

procedure TFormMath.ListBoxFunDefClick(Sender: TObject);
var
 BP,EP:TPoint;
 Pos:Integer;
begin
if FindWordInStrs(FunDef.Lines,ListBoxFunDef.Items[ListBoxFunDef.ItemIndex],
                  Pos,BP,EP,False,False,True) then
   begin
        FunDef.VScrollPos:=EP.y;
        FunDef.HighLightColor:=ClHighLight;
        FunDef.HighLightedLine:=BP.y;
        FunDef.HighLightedLineNum:=EP.y-BP.y+1;
        FunDef.SetFocus; FunDef.Refresh;
   end;
end;

procedure TFormMath.ReplaceDialogFunFind(Sender: TObject);
var
 BP,EP:TPoint;
 X,Y,
 Pos:Integer;
begin
  if PageControlMain.ActivePage<>TabSheetLib
     then PageControlMain.ActivePage:=TabSheetLib;
  X:=FunDef.CaretPos.x+1; Y:=FunDef.CaretPos.y;
  if frMatchCase in ReplaceDialogFun.Options
     then if frWholeWord in ReplaceDialogFun.Options then
           FindB:=FindWordInStrs(FunDef.Lines,ReplaceDialogFun.FindText,
                  Pos,BP,EP,True,True,False,True,X,Y)
      else FindB:=FindWordInStrs(FunDef.Lines,ReplaceDialogFun.FindText,
                  Pos,BP,EP,True,True,False,False,X,Y)
     else if frWholeWord in ReplaceDialogFun.Options then
           FindB:=FindWordInStrs(FunDef.Lines,ReplaceDialogFun.FindText,
                  Pos,BP,EP,False,True,False,True,X,Y)
      else FindB:=FindWordInStrs(FunDef.Lines,ReplaceDialogFun.FindText,
                  Pos,BP,EP,False,True,False,False,X,Y);
  if FindB then
   begin
    FunDef.SelStart:=Pos-1;
    FunDef.SelLength:=Length(ReplaceDialogFun.FindText);
    FunDef.Refresh;
   end else if Sender<>nil then begin
     ReplaceDialogFun.CloseDialog;
     FunDef.SelLength:=0;
     MessageBox(handle,PChar('找不到"'+ReplaceDialogFun.FindText+'"了!'),'对不起',mb_OK);
   end;
end;

procedure TFormMath.ReplaceDialogFunReplace(Sender: TObject);
begin
 if frReplace in ReplaceDialogFun.Options then
  begin
  // ReplaceDialogFunFind(nil);
   if FindB and (FunDef.SelLength<>0) then begin
     FunDef.SelText:=ReplaceDialogFun.ReplaceText;
     FindB:=False;
    end;
  end;
 if frReplaceAll in ReplaceDialogFun.Options then
  begin
   if MessageBox(Handle,'您确定要全部替换吗?','注意',mb_YesNO)=idNo then exit;
   repeat
    ReplaceDialogFunFind(nil);
    if FindB then FunDef.SelText:=ReplaceDialogFun.ReplaceText;
   until not FindB;
  end;
end;

procedure TFormMath.BitBtnFRClick(Sender: TObject);
begin
  if FunDef.SelLength<>0 then
    ReplaceDialogFun.FindText:=FunDef.SelText;
 ReplaceDialogFun.Execute;
end;

procedure TFormMath.NPSelAllClick(Sender: TObject);
begin
 FunDef.SelectAll;
end;

procedure TFormMath.NPUndoClick(Sender: TObject);
begin
 FunDef.Undo;
end;

procedure TFormMath.NPCopyClick(Sender: TObject);
begin
 FunDef.CopyToClipboard;
end;

procedure TFormMath.NPCutClick(Sender: TObject);
begin
 FunDef.CutToClipboard;
end;

procedure TFormMath.NPPasteClick(Sender: TObject);
begin
 FunDef.PasteFromClipboard;
end;

procedure TFormMath.PopupMenuFunDefPopup(Sender: TObject);
begin
 if FunDef.CanUndo
  then NPUndo.Enabled:=True
  else NPUndo.Enabled:=False;

 if FunDef.SelLength<>0
  then begin NPCopy.Enabled:=True; NPCut.Enabled:=True; end
  else begin NPCopy.Enabled:=False; NPCut.Enabled:=False; end;

 if Clipboard.HasFormat(CF_TEXT)
  then begin NPPaste.Enabled:=True; end
  else begin NPPaste.Enabled:=False; end;
end;

procedure TFormMath.BitBtn1VClick(Sender: TObject);
var
 bV,eV,PV,x,Sida,R,Org:Extended;
 S,S2:String;
 FunCom,FunCom2:TFunCommand;
 i:integer;
begin
 if not JudgeFloat(Edit1VB,True) then exit;
 if not JudgeFloat(Edit1VE,True) then exit;
 TextToFloat(Edit1VB.Text,bV);
 TextToFloat(edit1VE.Text,eV);
 PV:=(eV-bV)/PartNum;
 try
 Case ComboBox1V.ItemIndex of
  0,3: begin   //普通和积分式
      Edit1VS.SetFocus;
      if not JudgeCStr(Edit1VS,'X',True) then exit;
      S:=CStrToSStr(Edit1VS.Text,SStrs);
      StrToFunCom(S,FunCom,'X');
      if EnableWipe then SDFun.Clear else begin
       if SDFun.BreakPointsNum=0 then  //切换状态
          SDFun.AddBreakPoints(SDFun.PointsNum);
      end;
      if ComboBox1V.ItemIndex=0 then
       for i:=0 to PartNum do
        begin
         x:=bV+PV*i;
         SDFun.AddXY(X,GetFunValue(FunCom,X),SDFun.Color);
        end
       else begin
        if not JudgeFloat(Edit1VOrg,True) then begin FreeFunCommand(FunCom); exit; end;
        TextToFloat(Edit1VOrg.Text,Org);
        x:=bV;
        for i:=0 to PartNum do
         Begin
          SDFun.AddXY(X,Org,SDFun.Color);
          Org:=Org+Integral(FunCom,x,x+PV,SubPNum);
          x:=x+PV;
         end;
       end;
     end;
  1,2: begin //参数和极坐标式
      Edit1VX.SetFocus;
      if not (JudgeCStr(Edit1VX,'T',True)and
             JudgeCStr(Edit1VY,'T',True)) then exit;
      S:=CStrToSStr(Edit1VX.Text,SStrs);
      S2:=CStrToSStr(Edit1VY.Text,SStrs);
      StrToFunCom(S,FunCom,'T');
      StrToFunCom(S2,FunCom2,'T');
      if EnableWipe then SDFun.Clear else begin
       if SDFun.BreakPointsNum=0 then //切换状态
          SDFun.AddBreakPoints(SDFun.PointsNum);
      end;
      Case ComboBox1V.ItemIndex of
       1: for i:=0 to PartNum do
        begin
        X:=bV+PV*i;
        SDFun.AddXY(GetFunValue(FunCom,X),GetFunValue(FunCom2,X),SDFun.Color);
        end;
       2: for i:=0 to PartNum do
        begin
         X:=bV+PV*i;
         R:=GetFunValue(FunCom,X); Sida:=GetFunValue(FunCom2,X);
         SDFun.AddXY(R*Cos(Sida),R*Sin(Sida),SDFun.Color);
        end;
       end;
     end;
 end;
 finally
  FreeFunCommand(FunCom);
  FreeFunCommand(FunCom2);
 end;
 if SDFun.BreakPointsNum<>0
    then SDFun.AddBreakPoints(SDFun.PointsNum);
 SDFun.Refresh;
end;

procedure TFormMath.Edit1VBChange(Sender: TObject);
begin
 JudgeFloat(Sender);
end;

procedure TFormMath.ComboBox1VChange(Sender: TObject);
begin
 SDFun.Can3D:=False;
 Edit1VS.Visible:=False; Edit1VOrg.Visible:=False;
 Edit1VX.Visible:=False; Edit1VY.Visible:=False;
 Case ComboBox1V.ItemIndex of
  0,3: begin
     if ComboBox1V.ItemIndex=0  then begin
       Edit1VS.EditLabel.Caption:='Y(x)=';
       Edit1VS.Width:=365;
      end else begin
       Edit1VS.EditLabel.Caption:='f(x)=';
       Edit1VS.Width:=254;
       Edit1VOrg.Visible:=True;
      end;
      Edit1VB.EditLabel.Caption:='x从:';
      Edit1VS.Visible:=True;
     end;
  1,2: begin
      Edit1VB.EditLabel.Caption:='t从:';
      Edit1VX.Visible:=True; Edit1VY.Visible:=True;
      if ComboBox1V.ItemIndex=1 then begin
      Edit1VX.EditLabel.Caption:='X(t)=';
      Edit1VY.EditLabel.Caption:='Y(t)=';
      end else begin
       Edit1VX.EditLabel.Caption:='R(t)=';
       Edit1VY.EditLabel.Caption:='θ(t)=';
      end;
     end;
 end;
end;

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

procedure TFormMath.Edit1VSChange(Sender: TObject);
begin
 JudgeCStr(Sender,'X');
end;

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

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

procedure TFormMath.Edit1VXChange(Sender: TObject);
begin
 JudgeCStr(Sender,'T');
end;

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

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

procedure TFormMath.ComboBox2VChange(Sender: TObject);
begin
 Panel2VT.Visible:=False;
 Case TComboBox(Sender).ItemIndex of
  0: begin
      Edit2VZ.EditLabel.Caption:='X等份:';
      Edit2VX.EditLabel.Caption:='Y等份:';
      Edit2VbZ.EditLabel.Caption:='X从:';
      Edit2VbX.EditLabel.Caption:='Y从:';
     end;
  1: begin
      Edit2VZ.EditLabel.Caption:='Z等份:';
      Edit2VX.EditLabel.Caption:='X等份:';
      Edit2VbZ.EditLabel.Caption:='Z从:';
      Edit2VbX.EditLabel.Caption:='X从:';
     end;
  2: begin
      Edit2VZ.EditLabel.Caption:='Y等份:';
      Edit2VX.EditLabel.Caption:='Z等份:';
      Edit2VbZ.EditLabel.Caption:='Y从:';
      Edit2VbX.EditLabel.Caption:='Z从:';
     end;
  3: Panel2VT.Visible:=True;
 end;
 if Sender=ComboBox2V
    then ComboBox2VT.ItemIndex:=ComboBox2V.ItemIndex
    else ComboBox2V.ItemIndex :=ComboBox2VT.ItemIndex;
end;

procedure TFormMath.BitBtn2VClick(Sender: TObject);
var
 i,j,
 CentX,CentY:Integer;
 xB,xE,yB,yE,
 PartX,PartY,
 X,Y:Extended;
 XYs:Array of Array of record X,Y:Extended end;
 FunCom,FunComXYb,FunComXYe:TFunCommand;
 S,sb,se:String;
 cx,cY:Char;
 CbI:Integer;

procedure FreeAll;
begin
 FreeFunCommand(FunCom);  FreeFunCommand(FunComXYb); FreeFunCommand(FunComXYe);
 SetLength(XYS,0,0);
end;

begin //BitBtnZxyClick,3D图形生成
 SDFun.Can3D:=True;

 CbI:=ComboBox2V.ItemIndex;
 S:=CStrToSStr(Edit2VS.Text,SStrs);

 
 Case CbI of
  1: begin cX:='Z'; cY:='X'; end;
  2: begin cX:='Y'; cY:='Z'; end;
  else begin cX:='X'; cY:='Y'; end; //0:
 end;
 {Case CbI of
  0: if not StrToFunComN(S,FunCom,'x','y') then begin FreeAll; MessageBox(Handle,'函数表达式有误!','错误',mb_OK); exit; end;
  1: if not StrToFunComN(S,FunCom,'z','x') then begin FreeAll; MessageBox(Handle,'函数表达式有误!','错误',mb_OK); exit; end;
  2: if not StrToFunComN(S,FunCom,'y','z') then begin FreeAll; MessageBox(Handle,'函数表达式有误!','错误',mb_OK); exit; end;
 end;}
 if not StrToFunComN(S,FunCom,cX,cY) then begin
   FreeAll;
   MessageBox(Handle,'函数表达式有误!','错误',mb_OK);
   Exit;
 end;

 Try
  CentX:=StrToInt(Edit2VZ.Text);
  CentY:=StrToInt(Edit2VX.Text);
 except
  MessageBox(Handle,'输入等份数据有误!','错误',mb_OK);
  FreeAll; exit;
 end;
 if CentX*CentY=0 then exit;

 SetLength(XYs,CentX+1,CentY+1);

 try
 if CStrToFloat(Edit2VbZ.Text,xB,SStrs) and
    CStrToFloat(Edit2VeZ.Text,xE,SStrs) then begin
  PartX:=(xE-xB)/CentX;
  sb:=CStrToSStr(Edit2VbX.Text,SStrs); se:=CStrToSStr(Edit2VeX.Text,SStrs);
  if StrToFunCom(sb,FunComXYb,cx) and StrToFunCom(se,FunComXYe,cx) then begin
   for i:=0 to CentX do begin
    x:=xB+PartX*i; yB:=GetFunValue(FunComXYb,X); yE:=GetFunValue(FunComXYe,X); PartY:=(yE-yB)/CentY;
    for j:=0 to CentY do begin XYS[i][j].X:=X; XYS[i][j].Y:=yB+PartY*j; end;
   end;   // for end
  end else begin //if x right ,but y eorror!
   MessageBox(Handle,'输入Y范围数据有误!','错误',mb_OK);
   FreeAll; exit;
  end;
 end else begin // if X Error
  if CStrToFloat(Edit2VbX.Text,yB,SStrs) and
     CStrToFloat(Edit2VeX.Text,yE,SStrs) then begin
   PartY:=(yE-yB)/CentY;
   sb:=CStrToSStr(Edit2VbZ.Text,SStrs); se:=CStrToSStr(Edit2VeZ.Text,SStrs);
   if StrToFunCom(sb,FunComXYb,cy) and StrToFunCom(se,FunComXYe,cy) then begin
    for j:=0 to CentY do begin
     y:=yB+PartY*j; xB:=GetFunValue(FunComXYb,y); xE:=GetFunValue(FunComXYe,y); PartX:=(xE-xB)/CentX;
     for i:=0 to CentX do begin XYS[i][j].X:=xB+PartX*i; XYS[i][j].Y:=y; end;
    end; // end for
   end else begin //if Y right , X Error
    MessageBox(Handle,'输入X范围数据有误!','错误',mb_OK);
    FreeAll; exit;
   end;
  end else begin // if Y Error
   MessageBox(Handle,PChar('范围输入错误'+#$D+'可能是数字不对'+#$D+'或有两个函数表达式'),'错误',mb_OK);
   FreeAll; exit;
  end;
 end;
 except
  MessageBox(Handle,'在运算区间时发生错误!','错误',mb_OK);
  FreeAll; exit;
 end;

 try
 if EnableWipe then SDFun.Clear; //是否擦除老数据

  for i:=0 to centX do begin
     for j:=0 to centY do
      begin
       X:=XYs[i,j].X; Y:=XYs[i,j].Y;
       case CbI of
        0: SDFun.AddXYZ(X,Y,GetFunValueN(FunCom,X,Y));
        1: SDFun.AddXYZ(Y,GetFunValueN(FunCom,X,Y),X);
        2: SDFun.AddXYZ(GetFunValueN(FunCom,X,Y),X,Y);
       end;
      end;
     SDFun.AddBreakPoints(SDFun.PointsNum);
   end;
  for j:=0 to centY do
   begin
     for i:=0 to centX do
      begin
       X:=XYs[i,j].X; Y:=XYs[i,j].Y;//X:=Xs[i];
       Case CbI of
        0: SDFun.AddXYZ(X,Y,GetFunValueN(FunCom,X,Y));
        1: SDFun.AddXYZ(Y,GetFunValueN(FunCom,X,Y),X);
        2: SDFun.AddXYZ(GetFunValueN(FunCom,X,Y),X,Y);
       end;
      end;
     SDFun.AddBreakPoints(SDFun.PointsNum);
   end;
  SDFun.Refresh;
 except

⌨️ 快捷键说明

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