いきなり結論
Formsでやった方がはるかに楽だよ。
Contents
00│まず動画をご覧ください
コレクションに格納した正答とユーザーが入力した解答が一致しているかで正否を判定します。
好きな問題からチャレンジできますが、解答後は訂正できません。
正解すれば画面上部の点数が増えていきます。
今回は下記4点のやり方を紹介します。
- 正答と一致しているか判定する。
- 解答前は正否を表示しない。
- 正否によりアイコンや色を変える。
- 進行に合わせて点数を累積する。
以降、コピペできるコードはサンプルコレクションの使用を想定しています。うまく動作しない場合は調整してください。サンプルコレクションを使う場合は、下記記事にある_TestCollectionを適当なButtonコントロールにコピペし、実行してください。
[ad1]01│正答と一致しているか判定する。
- 正答はコレクションのAnserに格納しています。TextInputコントロールに解答を入力し、確定のButtonコントロールを押すと、コレクションのUAnserに格納されます。
- 解答がUAnserに格納されると、ギャラリーのLabelコントロールにその内容が表示されます。また、正否を表現するIconコントロールのVisivleがTrueになりアイコンが表示されます。
- 表示されるアイコンの形や色は、AnserとUAnserが一致しているか否かで判定します。
.DisplayMode 選択しているレコードのUAnserが空なら押下可能
If(IsBlank(Gallery1.Selected.UAnser),DisplayMode.Edit,Disabled)
.OnSelect 選択しているレコードのUAnserに解答を格納、解答欄をリセット
Patch(_Test,LookUp(_Test,Seq=Gallery1.Selected.Seq),{UAnser:TextInput1.Text});
Reset(TextInput1)
.Visivle UAnserが空なら表示しない
!IsBlank(ThisItem.UAnser)
.Icon AnserとUAnserが一致していれば✔、そうでなければ×
If(ThisItem.Anser=ThisItem.UAnser,Icon.CheckBadge,Icon.CancelBadge)
.Color AnserとUAnserが一致していれば緑系、そうでなければ赤系
If(ThisItem.Anser=ThisItem.UAnser,RGBA(54, 176, 75, 1),RGBA(250, 155, 112, 1))
02│解答前は正否を表示しない。
- 解答していなければIconコントロールを表示させません。
Visivleのコードは!IsBlank(ThisItem.UAnser)です。
UAnserが空ならTrueとなり表示されます。なので頭に!をつけてそれを否定します。Notの簡略表記ですね。
03│正否によりアイコンや色を変える。
- レコードごとにIf文でAnserとUAnserが一致しているか判定し、その結果でアイコンの種類や色を指定します。
- おなじ考え方で、UAnserの格納状態でButtonコントロールのDisplayModeを制御しています。
04│進行に合わせて点数を累積する。
- 獲得点数について動画ではSVGを使って表現していますが、Labelコントロールでも代用できます。コレクションをAnser=UAnserでFilterし、そのPointを合計しています。
- 最後に+0をしている理由は、未解答または正答0の時でも合計値を表示させるためです。
Sum(Filter(_Test,Anser=UAnser),Point)+0
05│まとめ
勢いで実験してみましたがいかがでしたか?今回のネタはTwitterで見つけた悩みごとです。自分ならどうやって解決するかなと考え、最後までやってみちゃいました。思いのほか、小技を紹介できたので満足しています。
解答や採点結果を保存したい場合は、最後にリストへ書き込むようにしてください。レスポンスが低下しますが、リストへの書き込みタイミングは解答の都度でも問題ありません。
それでは、今日はこの辺で・・・
社内で研修を行ったあと、その理解度測定としてよくテストを行います。
弊社では以前Wordやエクセルで作ったものを紙に印刷して配布していました。
これは回収後の採点や集計がめんどくさいんですよね。
今回はアプリで代替できるか試してみようと思います。