📄 unitmain.pas
字号:
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 + -