Access – Linux Home Server http://www.now.mfnet.ne.jp/~ozachin/wordpress Long Road Linux Fri, 24 Jan 2020 00:09:02 +0000 ja hourly 1 https://wordpress.org/?v=5.9.3 データベースだけではない9 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=398 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=398#respond Sun, 19 Jan 2020 07:03:03 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=398 read more]]> コンボボックスでステージを選択した時の処理です。
時間制限がある場合の処理が最初に入りますが、これは後にします。
通常のモードを示します。
この処理で、学習開始の準備が整います。

Private Sub com1_AfterUpdate()

'学習モードによって異なる処理を書く。
'タイマーの設定が必要な場合の処理を書く。

'ステージ画面の初期化
    Call all_v_false
    Call all_t_null
    
'ステージ毎の問題文
Me.Txt2 = str1Data(Me.com1 - 1)

'改行があると画像指定が複雑となるので取り除く(一時的テキスト)
tmptxt = Replace(Me.Txt2, vbCrLf, "")

'問題文の長さ
mlen = Len(Me.Txt2)

'指定画像の位置取得
imglen = InStr(tmptxt, "jpg")
    
'画像があるかないか
If imglen > 0 Then     '画像あり
    
        Me.Timg = upath & Left(tmptxt, imglen + 2) '改行ないのでLeftでok
        imgst = InStr(Me.Txt2, "jpg") '改行を含めた位置(問題文用)
        Me.objImg.Picture = Me.Timg
        
Else                    '画像なし
        
   Me.objImg.Picture = ""

End If

'as aeの位置
    aslen = InStr(Me.Txt2, "as")
    aelen = InStr(Me.Txt2, "ae")

'選択肢文字列
If aslen > 0 Then
     strsentakusi = Replace((Mid(Me.Txt2, aslen + 3, (aelen - aslen - 3))), vbCrLf, "")
End If
    
    
'選択肢の抽出及び数の取得
str2Data = Split(strsentakusi, ",")
Me.Tans = UBound(str2Data) + 1

'問題数取得(問題文asのあとの1文字がその数値)
mondaisu = Val(Mid(Me.Txt2, aslen + 2, 1))

'問題数に合わせた選択肢、解答欄の準備処理の呼び出し
Call set_mon

'正解を格納する
'正解は、シャッフルする前の選択肢の先頭から問題数の分だけの文字列
    For m = 1 To mondaisu
        seikai(m) = str2Data(m - 1)
    Next

'選択肢をシャッフルする
    For i = UBound(str2Data) To 1 Step -1
        P = Int((i + 1) * Rnd)
        buf = str2Data(P)
        str2Data(P) = str2Data(i)
        str2Data(i) = buf
    Next
    
Me.Tmon = Mid(Me.Txt2, aslen + 2, 1)  '変数mondaisuと同じ

'最終問題文
    If aslen > 0 And imgst > 0 Then '画像あり問題文

        Me.Txt3 = Mid(Me.Txt2, imgst + 3, aslen - imgst - 4)
        
    ElseIf aslen = 0 And imgst > 0 Then   '画像あり説明文

        Me.Txt3 = Mid(Me.Txt2, imgst + 3)
        
    ElseIf aslen > 0 And imgst = 0 Then    '画像なし問題文

    Me.Txt3 = Mid(Me.Txt2, 1, aslen - 1)
    
    Else

     Me.Txt3 = Me.Txt2      '画像なし説明文

    End If
    
'選択肢の表示
    For j = 1 To Me.Tans

        Me.Controls("Tsentakusi" & j) = str2Data(j - 1)
        Me.Controls("Tsentakusi" & j).Visible = True
        Me.Controls("Tsentakusi" & j).Enabled = True

    Next

End Sub

 

次回以降、学習者が解答したときの処理や正誤判定の処理へと進みます。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=398 0
データベースだけではない8 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=396 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=396#respond Sun, 19 Jan 2020 06:37:22 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=396 read more]]> 問題文を読み込んだら、次に行うことは学習者に解答してもらうための準備です。
大きな流れは
1.問題文を各ステージに分割する
2.分割した各ステージのテキストを問題文と解答シナリオに分割する
3.解答シナリオから、問題数と選択肢を取り出す
4.選択肢から正解を取り出し、その後ランダムに並び替える
5.問題文(画像があれば画像も)の表示
6.選択肢の表示
7.問題数分の解答欄の表示

1.については、前回のコードでは省略しましたが問題文を読み込んだ時点で、
テキストシナリオ「終」でsplit(分割)して配列変数に入れます。
それによって配列のインデックス最大値がわかるので、問題のステージ数もコンボにボックスに設定できます。
実際にはそこまでを読込処理とします。
配列のインデックスは0から始まるので各ステージの問題文を読み込むのは(ステージ数-1)の配列インデックスになります。
この数値をもとに、コンボボックスの更新後イベントに
2.~7.までの処理を書きます。

前回のコードの最後に、1.の部分を追加しておきます。

Private Sub 問題読込_Click()

‘前回のコードの後に追加

Me.Txt1 = strData
str1Data = Split(strData, “終”)
Me.Tstage = UBound(str1Data) + 1
‘ステージ数をcom1にセット
For i = 1 To Me.Tstage
com1.AddItem i
Next

End Sub

2.以下の処理は次回以降とします。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=396 0
データベースだけではない7 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=392 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=392#respond Sun, 19 Jan 2020 01:37:24 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=392 read more]]> Toidasu起動後最初にやることは、ユーザーが作成した問題文を読み込むことです。
ファイルを読み込み、表示するという一般的によく行われる処理です。
お手本通りと言えばそうなのですが、今回はCSVのような外部データを読み込んで1件ずつ処理をしたいわけではないので、一気にファイルを読み込む方法も、参考のためコメント行で示しておきます。

Private Sub 問題読込_Click()
'### 問題テキストファイルを読み込み###
'### テキストボックスに入れる処理 ###
'
'ヘルプを参考に書き換えれば仕上がります
'
'ダイアログを開きファイルを選択します。
'
' Requires reference to Microsoft Office 11.0 Object Library.
Dim fDialog As Office.FileDialog
Dim varFile As Variant
' Set up the File Dialog.
Set fDialog = Application.FileDialog(msoFileDialogOpen)
With fDialog
' Allow user to make multiple selections in dialog box
' Set the title of the dialog box. .
Title = "問題文を選択してください"
' Clear out the current filters, and add our own.
.Filters.Clear
.Filters.Add "問題ファイル", "*.txt"
' Show the dialog box. If the .Show method returns True, the
' user picked at least one file. If the .Show method returns
' False, the user clicked Cancel.
If .Show = True Then
'Loop through each file selected and add it to our list box.
varFile = .SelectedItems.Item(1)
End If
End With
'ここから読込処理開始
Open varFile For Input As #1
Do While Not EOF(1)
Line Input #1, textline
strData = strData & textline & vbCrLf
Loop
Close #1
'確認のためテキストボックスに表示する
Me.Txt1 = strData
'ここからは一気に読み込む方法です
' Dim tmpStr As String
' Open GetFileName For Binary As #1
' tmpStr = Space(LOF(1))
' Get #1, , tmpStr
' tmpStr = Replace(tmpStr, vbNullChar, "")
' Close #1 ' Me.Txt1 = tmpStr
'一気に読み込む方法はここまで
'この後は問題文を表示するための文字列操作処理がいろいろ続く
'それは次回以降に掲載予定
End Sub

 

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=392 0
データベースだけではない6 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=383 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=383#respond Sat, 18 Jan 2020 11:44:00 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=383 read more]]> 前回汎用性のあるタイマーを作成しました。
Toidasu使用の場面では前の説明通りのタイマー機能で十分だと思いますが、他の場面での利用を考えてタイマーのフォームから別のフォームを制御する方法を確認しました。
Toidsau本体フォームとFtimerフォームがあり、
Toidsau本体フォームからctrl+F2でFtimerを開くと特別な学習モード(5)となり、
ステージ選択のコンボボックスcom1のAfterUpdateイベント時にタイマースタートを記述します。
ステージ選択前に時間はセットしておきます。
時間になると、選択肢が使えなくなり解答権がなくなります。

独立したフォームで開いたタイマー画面、このフォームからToidasu本体を制御する。


その部分だけのコードを示しておきます。

'-----Toidasu本体---------- 
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
Select Case KeyCode '途中略 
Case vbKeyControl And vbKeyF2 
Me.Tmode = 5 
DoCmd.OpenForm "Ftimer" 
End Select 
End Sub 

'-------------- 
Private Sub com1_AfterUpdate() 
If Me.Tmode = 5 Then   
Forms!Ftimer.TimerInterval = 1000 
End If 
'途中略 
End sub 
'-------Toidasu本体ここまで-------- 

'-------Ftimerここから------ 
'---途中略   
If i = 0 Then   '残り時間0 
Me.TimerInterval = 0
 MsgBox "時間です" 
For j = 1 To 8 
Forms!Toidasu.Controls("Tsentakusi" & j).Enabled = False
 Next 
Exit Sub 
End If 
End Sub


任意の学習モード(実際には1と2です。3はもともと時間制限あり)で使っても構いません。
その場合は、時間セット後、任意のタイミングでタイマーをスタートさせればよいです。
別フォームのコントロールをタイマーから制御できれば、アイディア次第でいろいろな使い方ができると思います。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=383 0
データベースだけではない5 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=380 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=380#respond Sat, 18 Jan 2020 11:00:40 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=380 read more]]> 前回タイマーについて説明しました。
タイマー機能だけ取り出して汎用性のあるものを作りましたので公開しておきます。
分と秒をセットします。
リセットボタンをクリックすればセット完了。
残り10秒になると文字色が変わりフォントサイズも大きくなります。
コードは以下の通りです。(Formatは無くても大丈夫)

Option Compare Database 
Dim i As Integer 
Dim dt As Date 

Private Sub Form_timer() 
dt = DateAdd("s", "-1", dt) 
Me.twatch = Right(Format(dt, "hh:mm:ss"), 5) 
i = i - 1 
If i = 10 Then 
Me.twatch.ForeColor = "9639167" 
Me.twatch.FontSize = 24 
Me.twatch.TopMargin = 60 
End If 
If i = 0 Then 

MsgBox "時間です" 
Me.TimerInterval = 0 
Exit Sub 
End If 
End Sub 

Private Sub cmdReset_Click() 
dt = TimeSerial(7, Me.tmin, Me.tsec) 
i = Me.tmin * 60 + Me.tsec 
Me.twatch = Right(dt, 5) 
Me.twatch.ForeColor = "0" 
Me.twatch.FontSize = 16 
Me.twatch.TopMargin = 160 
End Sub 

Private Sub cmdStart_Click() 
Me.TimerInterval = 1000 
End Sub 

Private Sub cmdStop_Click() 
Me.TimerInterval = 0 
End Sub

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=380 0
データベースだけではない4 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=377 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=377#respond Sat, 18 Jan 2020 10:22:40 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=377 read more]]> 3つの学習モードについて詳細を説明します。
どれを標準とするかは考え方次第ですが、前に「軟弱モード」と呼んだものを今回は標準としました。
全くの当てずっぽうは想定していません。2つ程度に絞った上で不正解や正解ならそれなりに効果はあると思います。
F2キーを押すと「1ステージ毎の判定でやり直しあり」、
F3キーを押すと「時間制限あり、やり直し不可」としました。
標準に戻すにはF4キーを押します。
さて、時間制限がある場合は残り時間を表すタイマーが必要です。
まず、見た目で分かりやすいように、ゲームなどで見かけるライフインジケーター、パワーインジケーターのようなものを配置しました。
細長い四角形を2つ(赤と緑)重ね合わせて利用して、緑のライフが減少していくようにしました。
VisualBasic版でも採用したパターンです。

ついでなので、デジタルタイマーも設置しようとしましたが、秒のみの表示なら簡単ですが分が入ると難しい(小生にとっては)と思われたので、簡単にできる方法はないかと思い、ちょっとしたごまかしでなんとかしました。
Date型変数を宣言し、テキストボックスに表示させるようにして
TimeSerial関数で2分なら、 TimeSerial(0,2,0) 時間は何でもよいが
TimeAdd関数を利用して、DateAdd(“s”, “-1”, Me.テキストボックス名)
テキストボックスに分と秒だけ表示、Me.テキストボックス名 = Right(変数名, 5) これで、なんとかなりました。
時間(分)設定は、テキストボックスに入れ、バーの表示も連動するようにします。
バーの動きは簡単です。1秒間に減らす緑の量を元のwidth値/(60×分数)にすればよいです。
バーの初期width値は1440 twip(1インチ)の倍数にしておいた方がよいでしょう。

画面例を示します。 2分間の途中経過と時間切れのパターンです。

F3キーを押すと、タイマー関係の設定ができるようになります。(分を入れる)
コンボボックスでステージを選択するとカウントダウンを開始します。
尚、時間切れの場合、実際の処理としては選択肢のEnabledをFalseにして解答できないようにします。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=377 0
データベースだけではない3 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=375 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=375#respond Sat, 18 Jan 2020 07:32:27 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=375 read more]]> 正誤判定について考えます。
解答欄を選び(チェック)、正解と思われる選択肢をダブルクリックすると解答欄に選択肢の内容が入ります。
どのタイミングで正誤判定をするかいろいろ考えられます。
下の画面例は「即時判定」です。

1問解答する毎に判定が行われます。制限はありませんので、全ての選択肢を試せば必ず正解できます。
力試しを目的とするためにはいろいろ制限を設けるべきかもしれません。
VisualBasicのバージョンでは、何の制限もない状態を「軟弱モード」と呼びました。
「標準モード」は1ステージこどに判定し、やり直しも可能なモード、
「真剣モード」は1ステージ毎に時間制限を設けやり直しもできないモードとしました。
学習者が点数稼ぎに走るような状況にしてしまうことこそ問題なのですが、ここで教育論を展開するつもりはありませんので、今回も3つのモードを実装しておきます。
さて、「正解」「不正解」の表示をどうするかはいろいろ考えられます。単に文字として表示、○と×で表示などいろいろですが、今回は正解の場合にのみ「画像」を表示することにしました。
「果物」の例ですが、人により嫌いなものもあるかもしれませんので無難なものを選んだつもりです。
画像は多く用意し表示はランダムにします。男の子は恐竜や昆虫なんかも喜ぶかもしれません。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=375 0
データベースだけじゃない2 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=355 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=355#respond Fri, 17 Jan 2020 02:18:53 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=355 read more]]> VisualBasic6.0のことはだいぶ前なので記憶があいまいです。Visual C#(C#)はコンソールアプリとちがい、フォームアプリはさすがにオブジェクト指向プログラミングとしては大変でした。フォーム1つインスタンスを作成しないと開けない。デザイン画面にフォームがあり実行すると表示されるのでつい安心してしまう。裏で自動的にインスタンスが作成されてるのを忘れてしまいます。テキストボックスなどコントロールがたくさんあると大変です。

余談はさておき、今回のアプリはテキストファイルの読込、文字列操作、画像の表示などが主な処理内容なので本質的な部分ではC#でできることは、AccessのVBAでもできないことはありません。
不便だと思ったのは次の2つ

1.NumericUpDownコントロールが使えない 問題ステージ数を入れるために使うが、最大数をセットすればよい。 Accessにはないので、しかたなくコンボボックスに値をセット(AddItem)するのだが、一旦クリアしないといけない。

2.MouseHoverイベントが使えない 選択肢にマウスを当てた時、選択肢の背景色を変えて分かりやすくしたいのですが、MouseMoveしかないので、離れたときの処理が簡単ではありません。選択肢が8つあるので1つ1つ書くのは無駄です。 ネットで調べると複雑な処理をすればMouseHover的なこともできるようだが、理解納得できる内容ではないので自分なりに実現方法を考えて以下のようにしました。

2-1.背景色を変えるためのFunctionを1つ、元に戻すFunctionを1つ作成します。
2-2.選択肢のControls(Index)を調べ、MouseMoveイベントに、背景色を変える関数をIndexを引数に呼び出すコード
2-3.フォームの詳細セクションのMouseMoveイベントに背景色を元に戻す関数をIndexを引数に呼び出すコード

で何とかそれらしい動きを実現できました。
for I=1 to 8で一括処理でもよいが、画面が微妙にちらつくのでやめました。

正解時の処理として、N88BASIC、VisualBasicの時は画像を表示させましたが、C#では他の部分で苦労して疲れてしまったので、とりあえず文字だけで「正解!」と簡単に済ませました。今回は、画像表示にしてみようと思います。
詳細は次回以降にします。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=355 0
データベースだけではない1 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=351 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=351#respond Thu, 16 Jan 2020 14:37:46 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=351 read more]]> 並行して別の連載を始めます。
Accessはもちろんデータベースソフトですが、今回はフォームの機能を利用した使い方を紹介します。
データベースとして使うのではありませんので、テーブルも何もないです。
内容は、他のプログラミング言語で作成したアプリケーションを移植したものです。
名前はToidasu(問を出す)です。
初代はN88-BasicでPC8801用に開発したもので、次いでVisual Basic6.0へ移植、
そして 最近C#へ移植しました。
それをAccessに移植しました。
画面を見てみます。C#とAccessのものです。

1番上のものはC#です。
下の2つがAccessによるものです。
お分かりの通り、ドリル学習用ソフトです。
問題はユーザーが作成します。
問題以外に単にプレゼンや説明のためにも使えます。

まず、問題文の作成方法を示します。

漢字検定風の問題は次のようになっています。
一種のゲームシナリオのようなものです。
—-ここから———
次のカタカナの部分に当てはまる漢字を1つ選びなさい。
問1 裁判所で被告がチン述した。
問2 警官隊が市民の暴動をチン圧した。
問3 からすみはチン味である。
as3
陳,鎮,珍,沈,賃,鎮,枕,朕
ae

——ここまで—-
ほぼ通常の問題を作成するのと変わりません。
(問題文はそのまま表示される)
as3…AnswerStart、問題は3問の意味
陳,鎮,珍,沈,賃,鎮,枕,朕…画面に表示される選択肢(最大8個まで指定)
最初に正解を順番に書く。
表示はシステムがランダムに並べ替えます。
ae…AnswerEndの意味
終…ここで問題の終わり(区切り)の意味

これで1画面分の問題になります。1ステージと呼びます。
これを繰り返して何ステージでも作成できます。
詳細は次回以降としますが、Accessをフォームアプリケーションのプラットホームにしてしまう使い方です。
データベースはよく分からないという人も、プログラミングの入門としていかがでしょうか。

この連載では、ほかのブログサイトで紹介しているようにタイマー機能が登場します。
もともとは、ドリルの制限時間を設定するものとして組み込みましたが、要望を受け一般化したタイマーとして独立させたものもアップします。また、アクセスだけではなくエクセル用も公開します。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=351 0
健康診断(歯科検査)システム1 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=344 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=344#respond Thu, 16 Jan 2020 01:20:38 +0000 http://www.now.mfnet.ne.jp/~ozachin/wordpress/?p=344 read more]]> 学校シリーズ第4弾です。
健康診断のシステムも教務事務システムのオプションとして利用できるようになっているものもあるかと思います。
一般的な身体測定項目などは、外部機関に委託していればエクセルデータで入手できるのでデータの変換さえうまくすれば便利に利用できます。変換とは、例えばデータ上は1、2、3などとなっていても健康診断票自体にはA、B、Cで記入が必要なこともあります。

ただ、歯科検査については対応していない場合が多いようです。個人票から転記しなくてはならない場合がほとんどでしょう。Accessを使って省力化しましょう。
今回は特に大げさなVBAのコードは登場しません。単純な連結単票フォームとレポートの機能を利用しているだけです。

記号を選びクリックしていく。規定値(異常なし/)を設定するかどうかは生徒の全体的な実態とも関係するので実際の入力担当者の意見を聞いたほうがよい。

必要な項目は異なる場合もあるかと思いますが、工夫次第です。記号を選びチェックを入れていくだけです。集計・登録を押せば現在歯数以下の項目が入ります。
入力担当は学校での決めごとです。クラス担任でも養護教諭でもよいでしょう。
個人的には、指導要録と一体のものですから担任が行うべきものと思いますが、このようなシステムを使う新しい時代の流れですから固執することはありません。

]]>
http://www.now.mfnet.ne.jp/~ozachin/wordpress/?feed=rss2&p=344 0