轻松学习E-Prime(三十二):控制Slide及其各页面控件(SlideDisplay Sub-Objects),VB数组

你会发现,要使用代码修改Slide中的控件的时候,有点无从下手。实际上这并不难。“示例程序3-12”将为您展示如何修改Slide中的子控件,还有如何控制Slide当前显示的页面。请首先运行体验一下这个程序。
这个程序,我们将在Script的User页面中,使用VB数组来设定内容,我们要做到以用户的按键来决定显示Slide的哪个页面,以及显示什么内容。
如果您没学过编程,这个示例程序对您而言可能非常困难,甚至不亚于下图:

这次的示例有多难

那么您没必要要求自己完全理解,您只要知道,如何修改Slide将要显示的页面,以及其子控件的内容就好了。数组在实验中也是极少用到,可以不掌握。
我们简单看一下这个示例程序:

示例实验树状图

Script的User页面里定义的变量

首先这是树状图,以及我在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:
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内容(1)

Inline2内容(2)

Inline2内容(3)

上面就是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”),如图:


设置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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342