你会发现,要使用代码修改Slide中的控件的时候,有点无从下手。实际上这并不难。“示例程序3-12”将为您展示如何修改Slide中的子控件,还有如何控制Slide当前显示的页面。请首先运行体验一下这个程序。
这个程序,我们将在Script的User页面中,使用VB数组来设定内容,我们要做到以用户的按键来决定显示Slide的哪个页面,以及显示什么内容。
如果您没学过编程,这个示例程序对您而言可能非常困难,甚至不亚于下图:
那么您没必要要求自己完全理解,您只要知道,如何修改Slide将要显示的页面,以及其子控件的内容就好了。数组在实验中也是极少用到,可以不掌握。
我们简单看一下这个示例程序:
首先这是树状图,以及我在Script的User页面里定义的变量。
你会看到有public poemName(2) as string这个东西。
这就是VB数组的定义,它的作用是什么呢?请看下图:
我在inti这个Inline里定义了poemName(0)还有poemName(1)还有序号为2的这些poemName。没错,我想你猜到了,public poemName(2) as string这句话,按序号定义了三个变量,它们分别是poemName(0)、poemName(1)、poemName(2)。而我在inti中分别给这三个变量赋值。
现在我们看Inline1:
这里我们修改了TextDisplay1的Text属性,其中你会看到这个:
poemName(poemID)
我们前面定义过,poemID是integer,也就是整数,这样我们可以利用poemID来调用我们想要的poemName的其中某个元素。比如说:
当poemID的值为0时:
poemName(poemID)= poemName(0)= "望庐山瀑布"
同理,poemID的值为0时:
poemName(poemID)= poemName(1)= "念奴娇•赤壁怀古"
这样,我们可以在程序中按意愿修改poemID,从而调用我们想调用的那个的poemName元素。这就相当于,按学号找到对应的同学。
这段问字给学过C语言的同学看,其他人可跳过:
要注意VB数组和C语言数组是不一样的,如果是C语言,我用下列方法定义一个名叫poemName 的字符串数组:
String poemName[2];
那么一共只有两个元素,下标是0和1,而这里,我用
public poemName(2) as string
定义出的是三个元素,下标分别是0、1、2。
注意不要弄混两者。
如果您看完上面的内容仍然无法理解VB数组,那么就算了!算了!别纠缠于此,实验中很少用到。
接下来你也只需要尽可能理解该程序,理解不了不用强求,最后我会告诉你知道到什么程度就够了。
接下来看Inline2:
上面就是Inline2中的全文,那么接下来讲一下思路。我们首先要用一个标记,来代表被试是否退出,这个标记就是topage这个变量。该变量为0时,代表不显示Slide页面,仍然停留在当前的选择菜单中;为1时,按照其要求显示Slide中的页面;为2时,代表退出程序。
然后,我们接收被试的按键,通过按键判断行为。如果按下ESCAPE键,那么就代表要退出,我们将topage设置为2。这样,在最后的代码中,if语句发现topage为2后,会“goto”T2,这样就跳过了Slide1,显示TextDisplay2,然后结束程序。
如果被试按下Z和C,那么代表他想看诗歌或者想看名画,那么我们通过设定Slide1的ActiveState并修改其中的内容,来展示他要看的东西。你可能暂时不理解里面的语句,先不必管它。
如果按下其他键,则停留在这个选择页面中。其中,如果按了Q,则让poemID减1,为了防止poemID小于0,所以每当poemID小于0时,我们将其赋值为2;同理,按了E则让poemID加1,为了防止poemID大于2(即大于poemName或poemString的元素下标最大值),每当poemID大于2时,我们将其赋值为0,从而形成一个循环。A键和D键也类似,只不过更改了PaintingID的值。
我们来看按下C键的时候,我们是如何操作的:
If CStr(keyboardResponse.RESP) = "C" or CStr(keyboardResponse.RESP) = "c" then
Slide1.ActiveState = "State2"
Dim name2 as SlideText
Dim pic1 as SlideImage
Set name2 = CSlideText(Slide1.States(Slide1.ActiveState).Objects("Text1"))
Set pic1 = CSlideImage(Slide1.States(Slide1.ActiveState).Objects("Image1"))
name2.Text=paintingName(paintingID)
pic1.Filename="img" + CStr(paintingID+1) + ".jpg"
pic1.load
topage=1
End if
首先看第一句:
Slide1.ActiveState = "State2"
这就设定了Slide1即将显示State2这个页面。
下面两句:
Dim name2 as SlideText
Dim pic1 as SlideImage
这两句我们设定了两个变量,name2和pic1,他们分别是SlideText这个类和SlideImage这个类的实例。
Set name2 = CSlideText(Slide1.States(Slide1.ActiveState).Objects("Text1"))
Set pic1 = CSlideImage(Slide1.States(Slide1.ActiveState).Objects("Image1"))
这里,我们设置了name2和pic1分别为Slide1中的State2这个页面的Text1这个Object和Image1这个Object。这样,name2就代表了Slide1中的State2这个页面的Text1;同理,pic1代表Slide1中的State2这个页面的Image1。我们对name2和pic1的操作,将相当于对Slide1中的State2页面里的相应的Object进行操作。
我们知道,刚才我们设置了Slide1.ActiveState为”State2”,所以这里这两句相当于下面的样子:
Set name2 = CSlideText(Slide1.States("State2").Objects("Text1"))
Set pic1 = CSlideImage(Slide1.States("State2").Objects("Image1"))
它们在含义上有所不同前者意思相当于让name2和pic1分别代表Slide1当前即将显示的页面里面的物体Text1和物体Image1;而后者,含义是让name2和pic1分别代表Slide1的State2页面里面的物体Text1和物体Image1。
之后我们对其属性进行了修改:
name2.Text=paintingName(paintingID)
pic1.Filename="img" + CStr(paintingID+1) + ".jpg"
pic1.load
这两句就会影响随后Slide1中的State2页面的内容。注意pic1由于是图片,修改了Filename后,一定要调用load方法(包括音频也需要调用),也就是像第三句那样pic1.load,来读取图片,否则显示的只会是默认的图片。
最后我们设定topage为1,代表等一下将显示Slide1。
那么我就将这个示例程序讲解到这里,不知您理解了没有。
即使没有理解,请您不用再回头看,请继续往下阅读。毕竟实际运用中要根据情况具体运用,可以在实践中再学习。
这个程序只是为了更好的展示,掌握了对Slide1进行操作有什么好处,不然的话,我们本来就能用其他方法对Slide1的内容进行设定,何苦费这么大劲儿呢?这个程序就告诉你为什么我们要努力写这么多代码。
总而言之,您大可不必硬要理解“示例程序3-12”,你只需要理解接下来这两段代码,并至少完成阶段练习中的①②就可以了。
看下面:
Slide1.ActiveState = "State1"
Dim SText as SlideText
Set SText = CSlideText(Slide1.States("State1").Objects("Text1"))
SText.Text=”这是页面1”
这段话的意思是:
将Slide1将要显示的页面设置为State1;
定义一个名叫SText的SlideText;
设置SText为Slide1中State1页面里的名叫Text1的Object;
设置SText的Text属性为“这是页面1”。
这就是第一段,理解完这一段后,再看下面这一段:
Slide1.ActiveState = "State2"
Dim SImage as SlideImage
Set SImage = CSlideImage(Slide1.States("State2").Objects("Image1"))
SImage.Filename=”pic2.jpg”
SImage.load
这段话的意思是:
将Slide1将要显示的页面设置为State2;
定义一个名叫SImage的SlideImage;
设置SImage为Slide1中State2页面里的名叫Image 1的Object;
设置SImage的Filename属性为“pic2.jpg”;
读取SImage的Filename中所设定的图片。
只要理解了上面的代码,能够独立完成阶段练习中的①②,你就已经算是完成了本章的学习了。至于VB数组的运用,由于实际情况中几乎用不上,不懂也无妨。
阶段练习
①拖动控件到树状图里,和下图一致:
设定TextDisplay1的Duration为无限,呈现内容由你自己决定。设定TextDisplay1接收键盘输入,允许的按键为{ANY}。
给Slide1添加三个页面,分别命名为Stage1,Stage2,Stage3。
此时Slide1一共四个页面:Default, Stage1,Stage2,Stage3,让它们呈现你喜欢的内容,不同页面呈现内容必须不一致。此外,每个页面至少有一个SlideText,并且名字叫”Target”(也就是Name属性设置为”Target”),如图:
把下面的代码复制到InLine1里,运行,思考其作用:
Dim kbResps As Integer
Dim keyboardResponse As KeyboardResponseData
kbResps = TextDisplay1.InputMasks.Item(1).Responses.Count
If kbResps = 1 Then
Set keyboardResponse = CKeyboardResponseData(TextDisplay1.InputMasks.Item(1).Responses(1))
End If
Dim temptext as SlideText
Dim thekey as string
If keyboardResponse Is Not Nothing Then
If CStr(keyboardResponse.RESP) = "Q" or CStr(keyboardResponse.RESP) = "q" then
Slide1.ActiveState = "State1"
thekey="Q"
End if
'-------------------------------------------------
If CStr(keyboardResponse.RESP) = "W" or CStr(keyboardResponse.RESP) = "w" then
Slide1.ActiveState = "State2"
thekey="W"
End if
'-------------------------------------------------
If CStr(keyboardResponse.RESP) = "E" or CStr(keyboardResponse.RESP) = "e" then
Slide1.ActiveState = "State3"
thekey="E"
End if
'-------------------------------------------------
End If
Set temptext = CSlideText(Slide1.States(Slide1.ActiveState).Objects("Target"))
if thekey<>"" then
temptext.Text=temptext.Text + Chr(13) + "您刚才按下了" + thekey + "键"
end if
②这次不看提示,新建一个文件,设法独立设计①中的内容,并且按自己的喜好进行改造,变式。如果做不到的话,回到①获取你想知道的内容,然后重新进行②。
③设计一个程序,里面必须包含一个Slide,并且这个Slide有多个Stage,每个里面有都有排版方式不同图文信息。根据之前被试所按的按键来决定所呈现的内容(提前准备好图文),及其排版方式。被试先通过按QWER四个字母选择要呈现什么内容,然后按1234来选择排版方式。
④设计一个程序或者打开一个任意程序。在这个程序中使用到Slide控件,让这个控件起到和FeedbackDisplay几乎相同的作用。(也就是用于正负反馈)
⑤设计一个程序,里面包含20个试次。每个试次前,被试首先通过按键选择两种刺激呈现方式,一种是“声音”,一种是“图片”。选择完毕后,呈现一个词语,比如“猫”,根据被试先前的选择,如果选择“声音”,则呈现词语时同时给予声音刺激,让被试判断声音是否是“猫”;如果选择“图片”,则呈现词语时同时给予图片刺激,让被试判断图片是否是“猫”。如果词语和刺激一致则按f,反之按j。词语与刺激一致和不一致的情况各呈现十次。每个词语最多只能出现两次。
此为开源免费教程。教程所用资源等请访问目录或专题,或者Github页面:
https://www.jianshu.com/p/5bbf1c274370
https://github.com/zkx654321/Learn-E-Prime-Easily