• 検索結果がありません。

フレキシブルグリッド基本

N/A
N/A
Protected

Academic year: 2021

シェア "フレキシブルグリッド基本"

Copied!
13
0
0

読み込み中.... (全文を見る)

全文

(1)

■ フレキシブルグリッドの利用 ■ ■ 初めに 此のサンプルは各機能の動作確認用のサンプルで有る。実際にプログラムと仕て使用する場合は、無駄な部分等 を削除し、亦、使用状況に適合したエラーチェック等を付ける必要が有る。 今回のサンプルは成績表を作り乍らMSFlexGrid で色々な事を試して見度いと思う。猶、初期のサンプルは、初 期に作成した物で、最適化されて居ない部分が多く、当該部分を削除して仕舞おうと考えたが、MSFlexGrid の サンプルは、参考書でも余り扱って居ないので残して置いた。但し、解説部分は、重要な部分而巳とする。 動作確認は、VB6.0(SP5) WindowsXP で行って居る。(其の5)迄作成すると、完成後は下記の様に成る。 ■ 注意事項 1.MSFlexGrid は表示専用のコントロールで有る。ファイルの入出力操作や Excel の操作知識が無いと結構難 しいので、其の辺の勉強を仕てから使用する事が望ましい。

2.メニューバーの[プロジェクト][コンポーネント]でMicroSoft FlexGrid Control *.* にチェックを入れ て、フォームに上図の様に配置する。TextBox コントロールも忘れずに! 3.データはテキストファイルで準備して置く。 4.コードは出来る限りコピーは止めて、手打ちで動作確認し乍ら進める事が望ましい。 5.解ら無い部分が有れば、其の部分を選択反転表示させ[F1]キーを押して確認する。 6.此方が理解出来てから、エクセルの様にセルに直接データーを入力するサンプルを試す様にする。 7.MSFlexGrid の主要プロパティ一覧表は結構参考に成るかと思うので、必ず読んで置く。

(2)

■ 初期設定の部分 Option Explicit

Private CurrentRowNo As Integer ' アクティブセルの行を取得 Private Sub Form_Load()

Dim I As Long ' ループ用カウンタ Form1.Move 0, 0, 8640, 4630 ' MSFlexGrid の初期設定 With MSFlexGrid1 .Move 150, 150, 8170, 2850 .Rows = 10 ' 行の総数(固定行含む) .Cols = 8 ' 列の総数(固定列含む) .FixedRows = 1 ' 固定行の数 Rows より1以上少ない事 .FixedCols = 1 ' 固定列の数 Cols より1以上少ない事 .Row = 0 .ColWidth(0) = 430 ' 列幅 .ColWidth(1) = 550 .ColWidth(2) = 1800 For I = 3 To 7 .ColWidth(I) = 1000 Next I .RowHeight(0) = 350 ' 行の高さ .Col = 1: .Text = "No" ' 該当セルを中寄/中寄表示 .CellAlignment = flexAlignCenterCenter .Col = 2: .Text = "氏 名" .CellAlignment = flexAlignCenterCenter .Col = 3: .Text = "国 語" .CellAlignment = flexAlignCenterCenter .Col = 4: .Text = "数 学" .CellAlignment = flexAlignCenterCenter .Col = 5: .Text = "英 語" .CellAlignment = flexAlignCenterCenter .Col = 6: .Text = "合 計" .CellAlignment = flexAlignCenterCenter .Col = 7: .Text = "平均点" .CellAlignment = flexAlignCenterCenter .Col = 0 For I = 1 To .Rows - 1 .RowHeight(I) = 350 ' 行の高さ .Row = I .Text = I ' 行番号を表示 Next I .Col = 1: .Row = 1 ' カレントセルを反転表示(強調表示すればカレントセルが解り易い) .FocusRect = flexFocusNone .HighLight = flexHighlightAlways End With Text1.Text = "" End Sub

Private Sub Form_Activate() Text1.SetFocus

(3)

■ セルへのデータ入力

セルには直接データを入力する事は出来ないので、テキストボックス等に入力したデータをカレントセルに転送 する。先ず、テキストボックスにフォーカスを移動する。

Private Sub MSFlexGrid1_GotFocus()

' カレントセルの内容をテキストボックスに転送 With MSFlexGrid1 CurrentRowNo = .Row Text1.SetFocus Text1.Text = .Text End With End Sub 次はテキストボックスの内容をセルに転送する様にする。 Private Sub Text1_Change()

With MSFlexGrid1 ' テキストボックスに数値しか入力出来ない様に制限する If .Col <> 2 Then Call fTextBoxNumberCheck(Text1) End If ' テキストボックスの内容をカレントセルに転送 .Text = Text1.Text End With End Sub ■ Enter キーで次の入力セルに進ませる データ入力する時に一々セルをクリックしてデータを入力して居たのでは、入力に時間が懸かる。従って、エク セル等の様に、入力後Enter キーを押すと次の入力位置に移動する様に設定する。 此処では、各科目の点数の入力が終われば、合計と平均点を計算して表示し、次の行の先頭に移動する。然して 最後の行の入力が済めば、最初の行に移動する様にする。

Private Sub Text1_KeyPress(KeyAscii As Integer) Dim S As Single

Dim A As Single Dim I As Long

' Enter キーに依るフォーカス移動 With MSFlexGrid1

If KeyAscii = vbKeyReturn Then KeyAscii = 0 .Text = Text1.Text If .Col = 5 Then For I = 3 To 5 .Col = I ' null が入力されて居たらエラーに成るので If Len(Trim$(.Text)) = 0 Then .Text = 0 End If ' 合計を求める S = S + CSng(.Text)

(4)

Next I .Col = 6 .Text = S ' 合計を表示 .Col = 7 A = S / 3 ' 平均値を求める .Text = Format$(A, "##0.0") ' 平均値を表示 ' 次の行の先頭へ折り返す .Col = 0 ' 7行目以降は行をスクロールする If .Row >= 7 Then ' 1行のスクロール .TopRow = .TopRow + 1 End If

If .Row = .Rows - 1 Then

' 最後の行に成れば最初の行へ移動 .Row = 0 ' 先頭行に移動した時にスクロールも元に戻す .TopRow = 1 End If .Row = .Row + 1 End If ' セルを1つ移動 .Col = .Col + 1 .SetFocus End If End With End Sub 此れでテストして見る。Enter キーを押すと旨くフォーカスが移動しCol = 5 に成ると合計と平均点が計算され、 結果が表示される筈で有る。 8行目を入力し終わると9行目が表示する様にする必要が有る。其れはMSFlexGrid1.TopRow を設定する事で 実現する事が出来る。 ■ 方向キー(↑↓→←)でもセルを移動 方向キーでカレントセルを移動する様にするには、Text1_KeyDown イベントを使用する。 Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

' カーソル移動キーでのセル移動設定 With MSFlexGrid1

Select Case KeyCode

Case vbKeyUp ' ↑ If .Row > 1 Then .Row = .Row - 1 If .Row < 8 Then ' スクロールを元に .TopRow = 1 End If .SetFocus Case vbKeyDown ' ↓

If .Row < .Rows - 1 Then .Row = .Row + 1 If .Row >= 7 Then

' 行のスクロール .TopRow = .TopRow + 1 End If

(5)

.SetFocus

Case vbKeyLeft ' ← If .Col > 1 Then .Col = .Col - 1 .SetFocus

Case vbKeyRight ' → If .Col < 5 Then .Col = .Col + 1 .SetFocus

End Select End With End Sub

■ テキストボックスで数字しか入力出来ない様に制限する関数の作成

Private Function NumericCheck(ByVal MyTextBox As TextBox) As Boolean Dim I As Long ' 戻り値を初期値に設定 NumericCheck = False ' 入力文字を1文字宛チェック For I = 1 To Len(MyTextBox) ' 最初の1文字目以外に-が入って居たら削除

If Mid$(MyTextBox, I, 1) = Chr$(45) And I <> 1 Then NumericCheck = True

'- を文字列から抜き取りテキストボックスに代入 MyTextBox = Mid$(MyTextBox, 1, I - 1) & _ Mid$(MyTextBox, I + 1, Len(MyTextBox) - I) Beep ' カーソル位置をテキストの末尾へ MyTextBox.SelStart = Len(MyTextBox.Text) ' フォーカスを元のテキストボックスに戻す MyTextBox.SetFocus Exit Function End If ' 0~9 - . 及び Enter Tab 等の制御文字以外を削除

If Mid$(MyTextBox, I, 1) >= Chr$(32) And Mid$(MyTextBox, I, 1) _ < Chr$(45) Or Mid$(MyTextBox, I, 1) _

> Chr$(57) Or Mid$(MyTextBox, I, 1) = Chr$(47) Then ' 文字が含まれて居たら True に設定

NumericCheck = True ' 以下上記同様の処理

MyTextBox = Mid$(MyTextBox, 1, I - 1) & _ Mid$(MyTextBox, I + 1, Len(MyTextBox) - I) Beep MyTextBox.SelStart = Len(MyTextBox.Text) MyTextBox.SetFocus Exit Function End If Next I End Function 備考:上記サンプルのスクロールは行・列数を固定した遣り方に成って居る。此の部分のコードは(其の2)以 降も同様で有る。

(6)

■ テキストファイルを読込み表示する コンマ区切りのテキストファイル(Seiseki.csv)をシーケンシャルファイルとして読込、MSFlexGrid のセルに 表示する。 猶、Seiseki.csv は、CSV 形式で保存した物で有る。事前に、Excel 等で下記の様に作成し、CSV 形式で保存し て置く。ファイルの保存場所は夫々れの環境に合せて変更する事。 メニューを作成し、其の1で作成したコードに、下記の部分を追加する。 Private Sub mnuFileOpen_Click()

' メニュの読込表示 Call sFileOpen End Sub

Private Sub sFileOpen() ' データ読込表示処理

Dim ID As Integer ' 出席番号 Dim Surname As String ' 名前 Dim Japanese As Single ' 国語の点数 Dim Mathematics As Single ' 数学の点数 Dim English As Single ' 英語の点数 Dim Total As Single ' 合計点 Dim Average As Single ' 平均点

Dim Dcount As Integer ' データーのカウント Dim FN As Integer ' ファイル番号 Dcount = 0 With MSFlexGrid1 .Visible = False ' 一旦非表示に(読込が早く成る) FN = FreeFile ' シーケンシャル入力モードで Seiseki.txt をオープン 'フ ァイルの PATH は別途設定する様に

(7)

Do Until EOF(FN) ' EOF(FN)が True に成る迄実行

Input #FN, ID, Surname, Japanese, Mathematics, English, Total, Average ' 読込んだデータをセルに代入

.Rows = Dcount + 2 .Row = Dcount + 1 .RowHeight(.Row) = 350

.Col = 0: .Text = Format$(Dcount + 1, "##0") .Col = 1: .Text = Format$(ID, "####0") .Col = 2: .Text = Surname

.Col = 3: .Text = Format$(Japanese, "####0") .Col = 4: .Text = Format$(Mathematics, "####0") .Col = 5: .Text = Format$(English, "####0") .Col = 6: .Text = Format$(Total, "####0") .Col = 7: .Text = Format$(Average, "###0.0") Dcount = Dcount + 1 Loop Close #FN ' カレントセルをホームポジションに .Row = 1 .Col = 1 .TopRow = 1 .Visible = True ' 再表示 .SetFocus End With End Sub 以上で「Seiseki.csv」ファイルを読込セルに表示出来る筈で有る。 ■ テキストファイルを保存する 現在表示されているデーターをファイルに保存する様に設定する。保存するには、ファイルをシーケンシャル出 力モードでオープンし、Write#ステ-トメントで書き込む。 ファイルをOutput モードで開いた場合は、ファイルの先頭からデーターが保存され、Append モードで開いた 場合は、ファイルの最後に追加される(実際には、ファイルが既に存在する場合、Append モードでは其の儘開 くのに対して、Output モードでは一旦破棄して新規作成する事に成るが、取り敢えず、上記の様に覚えて置く と良い)。 メニューを作成し、下記のコードを入力する。 ' 上書保存のメニュ

Private Sub mnuFileSave_Click() Call sFileSave

End Sub

' データの上書保存処理 Private Sub sFileSave()

Dim I As Long ' ループのカウンタ Dim ID As Integer ' 出席番号

Dim Surname As String ' 名前 Dim Japanese As Single ' 国語の点数 Dim Mathematics As Single ' 数学の点数 Dim English As Single ' 英語の点数

(8)

Dim Total As Single ' 合計点 Dim Average As Single ' 平均点 Dim FN As Integer ' ファイル番号 FN = FreeFile

Open "Seiseki.csv" For Output As #FN With MSFlexGrid1 .Visible = False ' 一旦非表示に(読込が早く成る) ' 現在の状態を配列に再読込 For I = 1 To .Rows - 1 .Row = I .Col = 1: ID = .Text .Col = 2: Surname = .Text .Col = 3: Japanese = .Text .Col = 4: Mathematics = .Text .Col = 5: English = .Text .Col = 6: Total = .Text .Col = 7: Average = .Text

Write #FN, ID, Surname, Japanese, Mathematics, English, Total, Average Next I Close #FN ' カレントセルを反転表示に戻す .Visible = True .Row = 1 ' ホームポジションに移動 .Col = 1 .TopRow = 1 .SetFocus End With End Sub ■ データーを表形式で印字する 1.表形式に罫線を引いて印字する。 2.見易い様に行の高さを1.5倍にする。 3.汎用性を持たす為に改ページ処理を入れる。 4.変更が容易な様に変数での処理を仕た。 印字でフォントサイズの変更等が旨く行かない場合は、マイクロソフトの技術情報、印刷関連の制限事項、及び 注意点を参考にして対処する。 メニューを作成し、下記のコードを入力する。 ' メニュの印刷部分

Private Sub mnuFilePrint_Click() Dim I As Integer

Dim J As Integer

Dim Remain As Integer ' 最後ページの人員 Dim PageTotal As Integer ' 印刷枚数

Dim PagePrinted As Integer ' 印字済ページ Dim Dcount As Integer ' データ個数 Dim LineHeight As Single ' 改行高さ Dim Ajust As Single ' 調整値 Dim Umargin As Integer ' 上余白 Dim Lmargin As Integer ' 左余白 Dim Items As Integer ' 科目数 Dim CharX As Single ' 印刷桁位置

(9)

Dim CharY As Single ' 印刷行位置

Dim Dnumber As Integer ' 現在のページのデータ数 Dcount = MSFlexGrid1.Rows - 1 LineHeight = 1.5 ' 改行高さを1.5倍に設定 Ajust = 0.25 ' 微調整分を1/4行 Umargin = 3 ' 上余白を2行分 Lmargin = 7 ' 左余白を7桁分 Items = 5 ' 科目数 Printer.PaperSize = vbPRPSA4 ' 用紙サイズをA4に Printer.Orientation = vbPRORPortrait ' 縦向き印刷 Me.MousePointer = vbHourglass ' 砂時計 ' カレントセルの反転表示を解除(表示を早くする) MSFlexGrid1.HighLight = flexHighlightNever DoEvents ' 砂時計を表示してから次に進む Printer.ScaleMode = 4 ' キャラクター単位に設定 Printer.CurrentX = 31: Printer.CurrentY = 1 ' タイトルの印字位置 Printer.FontName = "MS 明朝" Printer.FontBold = True Printer.FontSize = 16 Printer.Print "成 績 表" Printer.FontSize = 12 Printer.FontBold = False CharX = Printer.TextWidth("あ") ' プリンタ上での文字の幅を取得 CharY = Printer.TextHeight("あ") ' プリンタ上での文字の高さを取得 Printer.CurrentX = Lmargin + 1 ' 左余白 Printer.CurrentY = Umargin ' 上余白

Printer.Print "No" & Space$(3) & "氏 名" & Space$(4) & "国 語 数 学 英 語 合 計 平均点" Printer.CurrentY = Printer.CurrentY + 0.5 ' 印字枚数の計算 If Dcount <= 42 Then Dnumber = Dcount PageTotal = 1 Else PagePrinted = 1 PageTotal = Dcount ¥ 42 Remain = Dcount Mod 42 If Remain Then PageTotal = PageTotal + 1 End If End If ' 各個人データーの印字 For I = 1 To Dcount MSFlexGrid1.Row = I MSFlexGrid1.Col = 1 Printer.CurrentX = Lmargin + 1 ' 左余白 Printer.Print Right$(" " & MSFlexGrid1.Text, 3) & " "; ' Noの印字 MSFlexGrid1.Col = 2 Printer.Print MSFlexGrid1.Text; ' 氏名の印字 For J = 3 To Items + 2 MSFlexGrid1.Col = J If J = 7 Then ' 平均点の印字 Printer.Print Tab(11 + (J - 1) * 8 + 1);

Printer.Print Right$(" " & Format$(MSFlexGrid1.Text, "######.0"), 8) Else

' 各科目の点数印字

(10)

Printer.Print Right$(" " & Format$(MSFlexGrid1.Text, "########"), 8); End If Next J ' 改行幅を 1.5 倍に設定 Printer.CurrentY = Printer.CurrentY + 0.5 Printer.CurrentX = Lmargin + 1 ' 左余白 If PageTotal > PagePrinted And (I Mod 42) = 0 Then

' 2ページ以上の場合の罫線処理、及び、改ページ Dnumber = 42

Call sLinePrint(LineHeight, Ajust, Umargin, Lmargin, Items, CharX, CharY, Dnumber) PagePrinted = PagePrinted + 1 Printer.NewPage ' 改ページ Printer.CurrentX = 31: Printer.CurrentY = 1 ' タイトルの印字位置 Printer.FontName = "MS 明朝" Printer.FontBold = True Printer.FontSize = 16 Printer.Print "成 績 表" Printer.FontSize = 12 Printer.FontBold = False Printer.CurrentX = Lmargin + 1 ' 左余白 Printer.CurrentY = Umargin ' 上余白

Printer.Print "No" & Space$(3) & "氏 名" & Space$(4) & "国 語 数 学 英 語 合 計 平均点" Printer.CurrentY = Printer.CurrentY + 0.5

End If

If PageTotal = 1 And Dcount = I Then ' 1枚以内の場合の処理

Call sLinePrint(LineHeight, Ajust, Umargin, Lmargin, Items, CharX, CharY, Dnumber) PageTotal = 0

End If

If PageTotal = PagePrinted And I = Dcount And Remain Then ' 最後のページの罫線処理

Dnumber = Remain

Call sLinePrint(LineHeight, Ajust, Umargin, Lmargin, Items, CharX, CharY, Dnumber) End If Next I Printer.EndDoc ' 印字終了 Form1.MousePointer = vbDefault ' 砂時計から元に戻す ' カレントセルを反転表示に戻す MSFlexGrid1.HighLight = flexHighlightAlways End Sub ' 罫線処理のサブルーチン

Private Sub sLinePrint(LineHeight As Single, Ajust As Single, _ Umargin As Integer, Lmargin As Integer, Items As Integer, _ CharX As Single, CharY As Single, Dnumber As Integer) Dim X As Integer

Dim Y As Integer ' 最初の縦罫線

Printer.Line (Lmargin, Umargin - Ajust)-(Lmargin, _ (Dnumber + Umargin) * (CharY * LineHeight) - Ajust) ' 2本目の縦罫線

Printer.Line (12, Umargin - Ajust)-(12, _

(Dnumber + Umargin) * (CharY * LineHeight) - Ajust) ' 名前の後の縦罫線を科目事に引く

For X = 0 To Items * 4 Step 4

Printer.Line ((14 + X) * CharX, Umargin - Ajust) _

-((14 + X) * CharX, (Dnumber + Umargin) * (CharY * LineHeight) - Ajust) Next X

(11)

' 横罫線

For Y = Umargin - 1 To Dnumber + Umargin

Printer.Line (Lmargin, (Y * CharY * LineHeight) - Ajust) _ -((14 + Items * 4) * CharX, (Y * CharY * LineHeight) - Ajust) Next Y

End Sub

' 序でに終了のメニュ

Private Sub mnuFileExit_Click() Unload Me End End Sub ■ データーを並び替える Sort プロパティを使用すれば、対象列と並び順を指定する丈で簡単に出来る。 下記を参考にフォームにフレームを貼付け、フレームにオプションボタンを配列で貼り付ける。 メニューを作成し、下記のコードを入力する。 ' ソートのメニュー

Private Sub mnuEditSort_Click() Frame1.Visible = True

Frame1.Move 1700, 440, 5260, 3390 End Sub

' キャンセルボタン

Private Sub Command2_Click() Frame1.Visible = False End Sub

' ソート開始のボタン

Private Sub Command1_Click()

Dim I As Long ' ループ用カウンタ Dim C As Integer ' 並び替える列 Dim M As Integer ' 並び替え方法 Frame1.Visible = False

(12)

' ソート対象列を取得

If Option1(I).Value = True Then C = I + 1 Exit For End If Next I For I = 0 To 7 ' 並び替え方法を取得

If Option2(I).Value = True Then M = I + 1 Exit For End If Next I ' ソート対象列 With MSFlexGrid1 .Col = C ' ソート順を指定してソートの開始 .Sort = M .Row = 1 ' ホームポジションへ移動 .Col = 1 .TopRow = 1 .SetFocus End With End Sub 上記の様に、設定が固定なら、Col と Sort のプロパティを設定する丈で有る。 ■ 行の挿入と削除 下記の様なメニューを前以て作成し、下記のコードを入力する。 ' 選択されて居る行の上側に行を挿入 Private Sub mnuEditRowInsertUP_Click() Dim No As Integer

(13)

No = MsgBox(MSFlexGrid1.Row & "行目の上側に挿入する。", vbYesNo + vbQuestion, "行の挿入確認") If No = vbYes Then MSFlexGrid1.AddItem " ", MSFlexGrid1.Row MSFlexGrid1.RowHeight(MSFlexGrid1.Row) = 350 ' 行の高さ End If End Sub ' 選択されて居る行の下側に行を挿入

Private Sub mnuEditRowInsertDown_Click() Dim No As Integer

No = MsgBox(MSFlexGrid1.Row & "行目の下側に挿入する。", vbYesNo + vbQuestion, "行の挿入確認") If No = vbYes Then MSFlexGrid1.AddItem " ", MSFlexGrid1.Row + 1 MSFlexGrid1.RowHeight(MSFlexGrid1.Row + 1) = 350 ' 行の高さ End If End Sub ' 現在行(アクティブセルの有る行)の削除設定 Private Sub mnuEditRowDelete_Click() Dim No As Integer

No = MsgBox(MSFlexGrid1.Row & "行目を削除する。", vbYesNo + vbQuestion, "行の削除確認") If No = vbYes Then

MSFlexGrid1.RemoveItem MSFlexGrid1.Row End If

End Sub

参照

関連したドキュメント

本節では本研究で実際にスレッドのトレースを行うた めに用いた Linux ftrace 及び ftrace を利用する Android Systrace について説明する.. 2.1

ひかりTV会員 提携 ISP が自社のインターネット接続サービス の会員に対して提供する本サービスを含めたひ

2.本サービスの会費の支払い時に、JAF

注1) 本は再版にあたって新たに写本を参照してはいないが、

1 昭和初期の商家を利用した飲食業 飲食業 アメニティコンダクツ㈱ 37 2 休耕地を利用したジネンジョの栽培 農業 ㈱上田組 38.

基本目標4 基本計画推 進 のための区政 運営.

重要: NORTON ONLINE BACKUP ソフトウェア /

授業設計に基づく LUNA の利用 2 利用環境について(学外等から利用される場合) 3 履修情報が LUNA に連携するタイミング 3!.