implementation{$R *.dfm}
type
arrayTP=array[0..500] of string;
//////////////////////////////////// 加减乘除//////函数
function plan4F(a,b,i:string):string;
begin
if i='*' then result:=floatTostr(strTofloat(a)*strTofloat(b));
if i='/' then result:=floatTostr(strTofloat(a)/strTofloat(b));
if i='+' then result:=floatTostr(strTofloat(a)+strTofloat(b));
if i='-' then result:=floatTostr(strTofloat(a)-strTofloat(b));end;
//////////////////////////////////// 加减乘除//////函数 procedure calculate(var b:string;Var a:arrayTP);
var
i,j,k:word;
t:string;
begin
j:=1;
k:=length(b);
for i:=1 to k+1 do
begin
t:=strutils.MidStr(b,i,1);
if strutils.AnsiContainsText('+-*/()',t) then
begin
if a[j]='' then begin
a[j]:=t;
j:=j+1;
end
else begin
a[j+1]:=t;
j:=j+2;
end;
end
else
begin
a[j]:=a[j]+t; ///如果是数字就累加 end;
end;
end;
//////////////////////////////////////////整理数组///////////////////////////////////
procedure fixA(var s:arraytp);
var
temp:arraytp;
i,j:integer;
begin
j:=1;
//////////////////////////////////////////////////
for i:=1 to 150 do
if length(s[i])>0 then
begin
temp[j]:=s[i];
j:=j+1;
end;
//////////////////////////////////////////
for i:= j to 150 do
temp[i]:=''; s:=temp; end; /////////////////////////////////找字符串数组一个 顶级优先表达式//////////////////////////////////////////
procedure FindS(var s:arraytp);
var
i,j:word;
tempS:arraytp;
FlagS,flag1,flag2:boolean;
begin
//////////////////////////1111111111
temps:=s;
j:=1;
s[399]:=s[399]+'1';
if s[2]='' then exit; ///////////////////
for i:=1 to 150 do
begin ////
flags:=strutils.AnsiContainsText('*/',s[i]);
flag1:=strutils.AnsiContainsText('()',s[i-1]);
flag2:=strutils.AnsiContainsText('()',s[i+1]);
flagS:=flags and not (flag1 or flag2); if flags then begin ///
s[i-1]:=plan4F(s[i-1],s[i+1],s[i]);
s[i]:='';
s[i+1]:='';
if (s[i-2]='(') and (s[i+2]=')') then
begin //
s[i-2]:='';
s[i+2]:='';
end; //
fixa(s);
finds(s);
end; ///
end; //// }
/////////////////////////////111111111111
//////////////////////////////222222222=============== for i:=1 to 150 do
begin ////
flags:=strutils.AnsiContainsText('+-',s[i]);
flag1:=strutils.AnsiContainsText('()',s[i-1]);
flag2:=strutils.AnsiContainsText('()',s[i+1]);
flagS:=flags and not (flag1 or flag2);
if flags then begin ///
s[i-1]:=plan4F(s[i-1],s[i+1],s[i]);
s[i]:='';
s[i+1]:='';
if (s[i-2]='(') and (s[i+2]=')') then
begin //
s[i-2]:='';
s[i+2]:='';
form1.edit3.Text:='((((((';
end; //
fixa(s);
end; /// end; ////
/////////////////////////////222222222222=============
////////////////////////////33333333递归==============
fixa(s);
/////////// form1.ListBox1.Clear;
//////////// for i:=1 to 180 do
/////////// form1.ListBox1.Items.Add(s[i]);
fixa(s);
//if length(s[399])>100 then exit;
finds(s);
////////////////////////////33333333递归==============
end;
/////////////////////////////////找字符串数组一个 顶级优先表达式////////////////////////////////
//////////////////////////////////////////////计算字符串表达式/////////////////////////////
Function PlanS(var s:string ):string;
var
a:arraytp;
t:string;
i,j,k:longint;
begin
calculate(s,a);
finds(a);
result:=a[1]; end;
/////////////////////////////////////////////////计算字符串表达式////////////////////////////
//////////////////////错误处理 过程 //////////暂无
function IsError(var s:string):boolean;
var
i,j:integer;
begin
if s='' then result:=true; ////////////////////////
for i:=1 to length(s)-1 do
begin
///////////////////////////////////////
if not strutils.AnsiContainsStr('+-*/1234567890() ',s[i]) then
begin
result:=true;
exit;
end;
////////////////////////////////////////
result:=strutils.AnsiContainsStr('+-*/', s[i]) and strutils.AnsiContainsStr('+-*/', s[i+1]);
if result then exit;
////////////////////////////////////////////////
end; end;
//////////////////////错误处理 过程 //////////暂无
procedure TForm1.Button1Click(Sender: TObject);
var
cs:string;
i:integer;
ax:arraytp;
begin
cs:=self.Edit1.Text;
//////////////////////错误处理 过程 //////////暂无
if plan.IsError(cs)then begin
//messagebox(Handle,'test ok','wellcome',mb_ok);
messagebox(handle,'错误的表达式,请改正','错误',windows.MB_OK);
exit;
end; /////////////定个过程吧
//////////////////////错误处理 过程 //////////暂无 self.Edit2.Text:=plans(cs);
end;procedure TForm1.Button2Click(Sender: TObject);
var
a,b,i:string;
begin
if AnsiContainsText('+-*/','(') then self.Caption:='test OK';
end;procedure TForm1.SpeedButton18Click(Sender: TObject);
begin
close;
end;procedure TForm1.SpeedButton17Click(Sender: TObject);
begin
self.Edit1.Text:='';
end;procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'1';
edit1.SetFocus;
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'2';
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton11Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'3';
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if strutils.AnsiContainsText('+-*/', strutils.MidStr(edit1.Text,length(edit1.text),1)) then exit; //判断是否重复按下 该键
self.Edit1.Text:=edit1.Text+'+';
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'4';
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'5';
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton10Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'6';
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton12Click(Sender: TObject);
begin
if strutils.AnsiContainsText('+-*/', strutils.MidStr(edit1.Text,length(edit1.text),1)) then exit; //判断是否重复按下 该键self.Edit1.Text:=edit1.Text+'-';
edit1.SelStart:=length(edit1.Text); //控制光标 位置
end;procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'7';
edit1.SelStart:=length(edit1.Text);
endprocedure TForm1.SpeedButton9Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'8';
edit1.SelStart:=length(edit1.Text); end;procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'9';
edit1.SelStart:=length(edit1.Text);
end;procedure TForm1.SpeedButton13Click(Sender: TObject);
begin
if strutils.AnsiContainsText('+-*/', strutils.MidStr(edit1.Text,length(edit1.text),1)) then exit; self.Edit1.Text:=edit1.Text+'*';
edit1.SelStart:=length(edit1.Text); end;procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'0';
edit1.SelStart:=length(edit1.Text);
end;procedure TForm1.SpeedButton15Click(Sender: TObject);
begin
self.Edit1.Text:=edit1.Text+'(';
edit1.SelStart:=length(edit1.Text); end;procedure TForm1.SpeedButton16Click(Sender: TObject);
begin
if not strutils.AnsiContainsText(edit1.Text,'(') then exit;
if strutils.MidStr(edit1.Text,length(edit1.Text),1)='(' then exit;
self.Edit1.Text:=edit1.Text+')';
edit1.SelStart:=length(edit1.Text);
end;procedure TForm1.SpeedButton14Click(Sender: TObject);
begin
if strutils.AnsiContainsText('+-*/', strutils.MidStr(edit1.Text,length(edit1.text),1)) then exit; self.Edit1.Text:=edit1.Text+'/';
edit1.SelStart:=length(edit1.Text); end;procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:='';
edit2.text:='';
edit2.ReadOnly:=true;
form1.Caption:='计算器';end;procedure TForm1.SpeedButton19Click(Sender: TObject);
var
i:word;
begin
i:=length(edit1.Text)-1;
edit1.Text:=midstr(edit1.Text,1,i);
edit1.SelStart:=i;
end;end.
解决方案 »
- DBGrid整体保存数据的问题
- Invalid use of keyword. Token: = Line Number:1 错误,请帮忙
- 2000下写了一个tapi传真程序,但在xp下会出现"不兼容的api版本"错误.
- 如何HOOK到winlogon.exe进程??
- 文件或目录转化成TREE,再保存到表中
- 有关屏幕分辨率的问题
- 有关spcomm用法的问题,求助!
- 如何实现海量数据数据库的快速查询??
- 如何取得一个panel在主窗口的绝对Top值(主窗口有toolBar)
- delphi6中没有webbrowser?
- 如何取得"回收站"信息并操作"回收站"?
- SetWindowsHookEx 在VISTA的问题
function GetExpressionValue(ExpressionStr: string; var E: string; Rvn: boolean = false): extended;
{
//////////////////////////////////////////////////////////////////////////////
/ /
/ 此为早期VB的练习作品,使用了大量的goto,使程序非常难读,改为delphi后有许多 /
/ 编译警告,但没有功能上及内存泄漏的问题 /
/ /
/ 函数功能:表达式求解 /
/ 参 数:<ExpressionStr>必要,字符串类型,是一个以##为标界(可省略)包 /
/ 含数字及运算符优先符的字符串 /
/ [Rvn]可省略,布尔类型,选择异常返回值类型,Ture 返回代码异常 /
/ 值,False 返回中文异常值 /
/ 运算符支持 +、-、*、/、^、(、)、+(正)、-(负) (注:正 /
/ 负号必须与其后的数字包含在(、)内才会优先运算) 的运算,括号 /
/ 之间的*可以省略,字符串中的空格将被忽略,任何其他非算符字符 /
/ 会返回错误。 /
/ 返回值说明: #+)n 表示在n处多出),#-)n 表示在n处缺少),#E 表示表达式 /
/ 为空,#Zm.n表示从m至n的除数为0,#Pm.n表示从m至n的底数为0而指 /
/ 数为负数,#n 表示在n有无法识别的符号 /
/ 其他说明:本函数调用了自定义函数 Repl,用于除去字符串中的空格和将)(、 /
/ (+、(- 分别解释为)*(、(0+及(0-。 /
/ 本函数调用的其他自定义函数有 VAL()、MID()、LEFT()、RIGHT() /
/ /
/ 算符优先级表: /
/ /
/ + - * / ^ ( ) # /
/ + > > < < < < > > /
/ - > > < < < < > > /
/ * > > > > < < > > /
/ / > > > > < < > > /
/ ^ > > > > > < > > /
/ ( < < < < > < = #) /
/ ) > > > > > ? > > /
/ # < < < < < < #( > /
/ /
/ 例: GetExpressionValue("#1.2+4^4*7+2/(7-3)#") /
/ 返回 1793.7 ,正确的结果 /
/ GetExpressionValue("1.2+4^4*7+2/(7-3)#") /
/ 返回 1793.7 ,任一标界均省略 /
/ GetExpressionValue("1.2+4^4*7+2/(7-3))") /
/ 返回 “在 18 处多出 )” /
/ GetExpressionValue("1.2+4^4*7+2/(7-3))",True) /
/ 返回 #+)18 ,在 18 处多出 ) /
/ GetExpressionValue("1.2+4^4*7+2/((7-3)") /
/ 返回 “在 19 处缺少)” /
/ GetExpressionValue("1.2+4^4*7+2/((7-3)",True) /
/ 返回 #-)19 ,在 19 处缺少 /
/ GetExpressionValue("1,2+4^4*7+2/((7-3)") /
/ 返回 “在 2 处有无法识别的符号” /
/ GetExpressionValue("1,2+4^4*7+2/((7-3)",Ture) /
/ 返回 #2 ,第2个字符无法识别 /
/ GetExpressionValue("1. 2+4 ^4*7+ 2/(7 -3)") /
/ 返回 1793.7 ,空格被忽略 /
/ GetExpressionValue("") /
/ 返回“表达式为空” /
/ GetExpressionValue("",Ture) /
/ 返回 #E /
//////////////////////////////////////////////////////////////////////////////
}
const
OperateSYN: set of char = ['+', '-', '*', '/', '^', '(', ')', '#']; //操作符集
// OperateNUM:set of char=['0','1','2','3','4','5','6','7','8','9','.'];
var
Optr: TStack; //操作符栈
OptrS: ^Integer; //用于
OptrP: char; //用于暂存操作符进行比较
Opdn: TStack; //操作数及结果栈
LineNo: TStack; //保存函数的返回地址
Opri: array[0..7, 1..2] of string; //存储操作符的优先级,第○列表示该操作符的符号,
//第一列表示该操作符的类别,第二列表示该操作符的优先级
Xs: string; //暂存输入
Theta: ^integer; //获得参与运算的操作符
a: ^extended; //操作数a
b: ^extended; //操作数b
c: ^extended; //运算返回值
i: integer; //字符串的当前位置
j: integer; //用于判断取操作数的位数
k: Integer; //仅用于 AllLine 部分
iP: ^extended; //用于操作数压栈
jP: ^integer; //用于操作符压栈及与栈有关的整型变量
LsOptr: ^integer; //获得操作符栈栈顶元素
Cinb: boolean; //用于判断输入是否为操作符,Ture 为操作符 False 为操作数
Prec: char; //用于保存操作符的比较结果
Pn: boolean;
Ex: string;
label
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, Precede, Operate, JudgeNumber, AllLine, ConvOperateSYN, ExitTF, ReturnR;
begin
Ex := '';
Optr := TStack.Create;
Opdn := TStack.Create;
LineNo := TStack.Create;
New(iP);
// Opri[0, 0] := '('; // (
Opri[0, 1] := 'P'; // P 表示是优先符
Opri[0, 2] := 'L'; // L 表示是左优先符
// Opri[1, 0] := ')'; // )
Opri[1, 1] := 'P';
Opri[1, 2] := 'R'; // R 表示是右优先符 // Opri[2, 0] := '^'; // ^
Opri[2, 1] := 'O'; // O 表示是运算符
Opri[2, 2] := '10'; // 0
// Opri[3, 0] := '*'; // *
Opri[3, 1] := 'O';
Opri[3, 2] := '20'; // 1
// Opri[4, 0] := '/'; // /
Opri[4, 1] := 'O';
Opri[4, 2] := '20'; // 1
// Opri[5, 0] := '+'; // +
Opri[5, 1] := 'O';
Opri[5, 2] := '30'; // 2
// Opri[6, 0] := '-'; // -
Opri[6, 1] := 'O';
Opri[6, 2] := '30'; // 2
// Opri[7, 0] := '#'; // #
Opri[7, 1] := 'S'; // S 表示是结束符
Opri[7, 2] := '40'; // 3 { 0, '(';
1, ')';
2, '^';
3, '*';
4, '/';
5, '+';
6, '-';
7, '#';} /////////////////////////////////////////////// if Length(ExpressionStr) = 0 then
begin
Ex := CxFFPC.IIf(Rvn, '#E', '表达式为空');
iP^ := 0;
Opdn.Push(iP);
goto ReturnR;
end
else begin
if CxFFPC.CRight(ExpressionStr, 1) <> '#' then ExpressionStr := ExpressionStr + '#';
if CxFFPC.CLeft(ExpressionStr, 1) = '#' then ExpressionStr := CxFFPC.Mid(ExpressionStr, 2);
end;
ExpressionStr := CxFFPC.Repl(ExpressionStr, ')(', ')*(');
ExpressionStr := CxFFPC.Repl(ExpressionStr, '(-', '(0-');
ExpressionStr := CxFFPC.Repl(ExpressionStr, '(+', '(0+');
ExpressionStr := CxFFPC.Repl(ExpressionStr, ' ', '');
i := 1;
Pn := false;
New(OptrS);
OptrS^ := 7;
Optr.Push(OptrS); // '#'
iP^ := 0;
Opdn.Push(iP);
New(OptrS);
OptrS^ := 40;
LineNo.Push(OptrS);
goto JudgeNumber;
40:
Xs := CxFFPC.Mid(ExpressionStr, i, j);
i := i + j;
OptrS := Optr.Peek;
while not ((Xs = '#') and (OptrS^ = 7)) do
begin
10:
if not Cinb then //如果是操作数
begin
Opdn.Push(iP);
Pn := false;
New(OptrS);
OptrS^ := 50;
LineNo.Push(OptrS);
goto JudgeNumber;
50:
Xs := CxFFPC.Mid(ExpressionStr, i, j);
i := i + j;
end
else begin
New(OptrS);
OptrS^ := 20;
LineNo.Push(OptrS);
OptrP := Xs[1];
goto Precede; //判断操作符的优先级
20:
case Prec of
'<':
begin
90:
Optr.Push(jP);
Pn := true;
New(OptrS);
OptrS^ := 60;
LineNo.Push(OptrS);
goto JudgeNumber;
60:
Xs := CxFFPC.Mid(ExpressionStr, i, j);
i := i + j;
end;
'=':
begin
OptrS := Optr.Pop;
Dispose(OptrS);
New(OptrS);
OptrS^ := 70;
LineNo.Push(OptrS);
goto JudgeNumber;
70:
Xs := CxFFPC.Mid(ExpressionStr, i, j);
i := i + j;
end;
'>':
begin
Theta := Optr.Pop;
b := Opdn.Pop;
a := Opdn.Pop;
New(OptrS);
OptrS^ := 30;
LineNo.Push(OptrS);
goto Operate;
30:
Dispose(Theta);
Dispose(a);
Dispose(b);
end;
else
goto ReturnR;
end;
end;
OptrS := Optr.Peek;
end; //while ReturnR:
iP := Opdn.Pop;
Result := CxFFPC.IIf(Ex = '', iP^, 0);
E := Ex;
Dispose(iP);
goto ExitTF; ///////////////////////////////////////////////函数区
Precede: //判断两个操作符的优先级,返回值寄存在变量 Prec 中
LsOptr := Optr.Peek;
New(OptrS);
OptrS^ := 100;
LineNo.Push(OptrS);
goto ConvOperateSYN;
100:
if LsOptr^ = 7 then
if jP^ = 7 then
Prec := '='
else begin
if Opri[jP^, 2] = 'R' then
begin
Prec := ' ';
Ex := CxFFPC.IIf(Rvn, '#+)' + IntToStr(i - 1),
' 在 ' + IntToStr(i - 1) + ' 位多出 ) '); // # 表示表达式在此位置多 )
end
else
Prec := '<'; // # 表示表达式在此位置缺少 Opri(OP(Xs), 0)
goto AllLine;
end
else
if jP^ = 7 then
begin
if Opri[LsOptr^, 2] = 'L' then
begin
Prec := ' ';
Ex := CxFFPC.IIf(Rvn, '#-)' + IntToStr(i - 1), ' 在 ' + IntToStr(i - 1) + ' 位缺少 ) ');
end
else
Prec := '>'; // # 表示表达式在此位置缺少 )
goto AllLine;
end;
if (Opri[LsOptr^, 1] = 'O') and (Opri[jP^, 1] = 'O') then
begin
Prec := CxFFPC.IIf((StrToInt(Opri[LsOptr^, 2]) - StrToInt(Opri[jP^, 2])) <= 0, '>', '<');
goto AllLine;
end
else
if Opri[LsOptr^, 2] = 'L' then
if Opri[jP^, 1] = 'P' then
begin
Prec := CxFFPC.IIf(Opri[jP^, 2] = 'R', '=', '<');
goto AllLine;
end
else begin
Prec := '<';
goto AllLine;
end
else
if Opri[LsOptr^, 2] = 'R' then
begin
if Opri[jP^, 2] = 'L' then
begin
Prec := ' ';
Ex := 'Error';
end
else
Prec := '>';
goto AllLine;
end
else begin
Prec := CxFFPC.IIf(Opri[jP^, 2] = 'L', '<', '>');
goto AllLine;
end;
goto AllLine;
Operate: //对操作数求值,返回值压回 Opdn 栈
case Theta^ of
5: // +
begin
New(c);
c^ := a^ + b^;
Opdn.Push(c);
end;
6: // -
begin
New(c);
c^ := a^ - b^;
Opdn.Push(c);
end;
3: // *
begin
New(c);
c^ := a^ * b^;
Opdn.Push(c);
end;
4: // /
begin
if b^ = 0 then
begin
Ex := CxFFPC.IIf(Rvn, '#Z' + IntToStr(i - 1 - Length(VarToStr(b^))) + '.'
+ IntToStr(Length(VarToStr(b^))), '从第 ' +
IntToStr(i - 1 - Length(VarToStr(b^))) + ' 位开始的 ' +
IntToStr(Length(VarToStr(b^))) + ' 位数据为零');
goto ReturnR;
end;
New(c);
c^ := a^ / b^;
Opdn.Push(c);
end;
2: // ^
begin
if (a^ = 0) and (b^ < 0) then
begin
Ex := CxFFPC.IIf(Rvn, '#P' + IntToStr(i - 1 - Length(VarToStr(b^))) + '.'
+ IntToStr(Length(VarToStr(b^))), '从第 ' +
IntToStr(i - 1 - Length(VarToStr(b^))) + ' 位开始的 ' +
IntToStr(Length(VarToStr(b^))) + ' 位的指数为负,而底数为零');
goto ReturnR;
end;
New(c);
c^ := Math.Power(a^, b^);
Opdn.Push(c);
end;
end; //case
goto AllLine; JudgeNumber: //判断数字,返回值寄存在变量 j 中
j := i;
while (CxFFPC.Asc(CxFFPC.Mid(ExpressionStr, j, 1)) = 46) or ((CxFFPC.Asc(CxFFPC.Mid(ExpressionStr, j, 1)) >= 48) and (CxFFPC.Asc(CxFFPC.Mid(ExpressionStr, j, 1)) <= 57)) do
j := j + 1;
if j > i then
begin
Cinb := false;
j := j - i;
end
else begin
OptrP := ExpressionStr[j];
Cinb := OptrP in OperateSYN;
if Cinb then
begin
New(OptrS);
OptrS^ := 80;
LineNo.Push(OptrS);
goto ConvOperateSYN;
80:
if Pn and (jP^ <> 0) then
begin
Ex := CxFFPC.IIf(Rvn, '#' + IntToStr(j), '在 ' + IntToStr(j - 1) + ' 位有的多余运算符');
goto ReturnR;
end
end
else begin
Ex := CxFFPC.IIf(Rvn, '#' + IntToStr(j), '在 ' + IntToStr(j) + ' 位有无法识别的符号');
goto ReturnR;
end;
j := 1;
end;
New(iP);
iP^ := CxFFPC.CVal(CxFFPC.Mid(ExpressionStr, i, j));
goto AllLine; ConvOperateSYN: //将操作符转换为优先级,返回值寄存在变量 jP^ 中
New(jP);
case OptrP of
'(':
jP^ := 0;
')':
jP^ := 1;
'^':
jP^ := 2;
'*':
jP^ := 3;
'/':
jP^ := 4;
'+':
jP^ := 5;
'-':
jP^ := 6;
'#':
jP^ := 7;
end; goto AllLine;
///////////////////////////////////////////////返回区
AllLine:
OptrS := LineNo.Pop;
k := OptrS^;
Dispose(OptrS);
case k of
10:
goto 10;
20:
goto 20;
30:
goto 30;
40:
goto 40;
50:
goto 50;
60:
goto 60;
70:
goto 70;
80:
goto 80;
90:
goto 90;
100:
goto 100;
end;
///////////////////////////////////////////////释放资源区
ExitTF:
for k := 1 to Optr.Count do
Dispose(Optr.Pop);
for k := 1 to Opdn.Count do
Dispose(Opdn.Pop);
for k := 1 to LineNo.Count do
Dispose(LineNo.Pop);
Optr.Free;
Opdn.Free;
LineNo.Free;
end;