2.4 演示系统的构成
下面以一个数据结构辅助教学软件介绍演示系统的构成,这个教学软件由系统目录、程序演示、同步讲义、精选习题四个部分组成,本书只讨论前两个部分。
在系统目录中主要通过TreeView控件提供数据结构中分章节某个算法的选择。程序演示部分提供算法及程序源代码的显示、各变量的变化、系统栈变化、图形显示等,它是软件的核心部分。
2.4.1 系统目录与程序演示部分的关联
本系统充分利用控件特性,实现系统目录与程序演示部分的关联,设计时把TreeView控件放入页框内,如图2.2所示,在TreeView Items Editor框中可直接进行编辑,随开发的进展添加、修改内容。
图2.2 TreeView Items Editor编辑示意图
在TreeView控件中分层显示标题文本,为实现目录内容语言与演示程序具体类相关联的目的,实际填充标题时,在标题前增加一至三位数字字符,用来表示目录的三级标号。一级标号用一位字符表示,用来提供章标号;二级标号用两位字符表示,用来提供相关类名的后两位数字字符;三级标号用三位字符表示,用来提供某个具体的算法,其中的前两位与二级标号含义相同,第三位表示该类的某一个方法。执行程序,选择三级标号时,通过变量cap把标题传给主程序。代码如下:
procedure TForm1.TreeView1Click(Sender: TObject); begin cap:=form1.TreeView1.Selected.Text ; end;
二级标题对应整个大的算法族,包含第三级标题对应的几个算法,算法类以ex开头加两位数字字符组成,分别在initialization、finalization部分进行注册和撤销。代码如下:
initialization RegisterClass(ex00); RegisterClass(ex01); RegisterClass(ex11); cap:=''; finalization UnregisterClass(ex00); UnregisterClass(ex01); UnregisterClass(ex11);
2.4.2 程序演示部分
在程序演示部分通过显示区及输入区实现交互。
显示区包括算法代码、静态变量、系统工作栈、图形及数组的显示,都通过TstringGrid控件来实现。通过标签控件显示相应代码的注释。输入区包括文本框及三个命令按钮,在文本框内输入算法要求的原始数据,三个命令按钮分别是“开始”、“单步”、“自动”。下面是“开始”按钮的单击事件程序代码:
procedure TForm1.begincommClick(Sender: TObject); var i:integer; begin if cap='' then cap:='000'; form1.Label1.Caption :=cap; if pos(copy(cap,3,1),'0987654321')>0 then begin i:=strtoint(copy(cap,3,1)) ; dd:=ttdemo(findclass('ex'+copy(cap,1,2))).Create ; dd.init(form1.varGrid ,form1.proGrid,form1.sysgrid, form1.cvargrid ,form1.Label2,form1.inputedit,form1.img ); if dd.runprogram(i) then begin dd.initfile; dd.fillprogram ; runcomm.Enabled :=true; begincomm.Enabled :=false; auto.Enabled :=true; auto.caption:='自动' end ; end; end;
第一个if语句判断在系统目录中是否进行了选择,如果未选择,认为从文件中读取自定义的演示脚本。语句“dd:=ttdemo(findclass('ex'+copy(cap,1,2))).Create”用来根据选择目录生成已注册类的一个实例;下一句用来进行初始化,把当前表单的控件对象传给算法类。dd.runprogram(i)根据选择的三级目录第三位数值,执行相应的一个方法,并产生脚本文件。之后,把算法代码填入代码显示表格,把“单步”、“自动”按钮设为可用,就可以进行演示了。
如果为执行状态,单击一次“单步”按钮就解释一行脚本文件,如果单击了“自动”按钮,就由计时器自动调用“单步”按钮的事件程序。代码如下:
procedure TForm1.runcommClick(Sender: TObject); begin if dd.getrunstate then dd.runoneline else begin runcomm.Enabled :=false; auto.Enabled :=false; timer1.Enabled :=false; begincomm.Enabled :=true; end; end; procedure TForm1.autoClick(Sender: TObject); begin if auto.caption='自动' then begin timer1.Enabled :=true; auto.caption:='暂停'; end else begin timer1.Enabled :=false; auto.caption:='自动'; end ; end;