いつもお世話になりありがとうございます。よろしくお願い致します。
MSFlexgridとテキストボックスを組み合わせて使用しています。
以下のようなコードです。
スクロールした時にテキストボックスが残ってしまうことから
一度、テキストボックスを非表示にして、入力時に表示するようにしています。
そうすると、今度は新たな問題が発生してしまいました。
1.最初に日本語入力をオフにできない。
(ユーザーは行えますが)
2.一度入力し確定したものには、Deleteキーが使えない。
(Enterを2回押すと消去できますが。)
この2点について、対処方法はございますでしょうか。
どうか、よろしくお願い致します。
Private Sub Form_Load()
Me.Show
With MSFlexGrid1
.Row = 1
.Col = 1
.RowSel = 1
.ColSel = 1
.FocusRect = flexFocusLight
End With
MSFlexGrid1_EnterCell
Text1.Visible = False
End Sub
Private Sub MSFlexGrid1_EnterCell()
With Text1
.Text = ""
.Visible = False
.Top = MSFlexGrid1.Top + MSFlexGrid1.CellTop
.Left = MSFlexGrid1.Left + MSFlexGrid1.CellLeft
.Height = MSFlexGrid1.CellHeight
.Width = MSFlexGrid1.CellWidth
.Text = MSFlexGrid1.Text
End With
End Sub
Private Sub MSFlexGrid1_KeyPress(KeyAscii As Integer)
With Text1
.Text = Chr(KeyAscii)
.SelStart = 1
.Visible = True
.SetFocus
End With
End Sub
Private Sub MSFlexGrid1_LeaveCell()
MSFlexGrid1.Text = ""
MSFlexGrid1.Text = Text1.Text
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim dRow As Long
Dim dCol As Long
If KeyCode = vbKeyReturn Or KeyCode = vbKeyDown Then
dRow = MSFlexGrid1.Row + 1
If dRow < MSFlexGrid1.Rows Then
MSFlexGrid1.Row = dRow
End If
MSFlexGrid1.SetFocus
ElseIf KeyCode = vbKeyUp Then
dRow = MSFlexGrid1.Row - 1
If dRow > 0 Then
MSFlexGrid1.Row = dRow
End If
MSFlexGrid1.SetFocus
ElseIf KeyCode = vbKeyRight Then
dCol = MSFlexGrid1.Col + 1
If dCol < MSFlexGrid1.Cols Then
MSFlexGrid1.Col = dCol
End If
MSFlexGrid1.SetFocus
ElseIf KeyCode = vbKeyLeft Then
dCol = MSFlexGrid1.Col - 1
If dCol > 0 Then
MSFlexGrid1.Col = dCol
End If
MSFlexGrid1.SetFocus
End If
End Sub
日本語入力の制御については
以下を参考に解決しました。
http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips075.htm
Deleteキーが使えないというのは、まだまだ未解決です。
また、Enterの2度押しでデータは消えるものの
たぶん、セルには見えないのですが、
リターンマーク?が入っている模様です。
ので、空白セルとは認識してくれません。
このあたりについて、何か見解はございませんでしょうか。
よろしくお願い致します。
Deleteキーが使えないという部分と
Enterキーで変なことになってしまう、という部分についても
以下を参考に解決致しました。
http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips094.htm
ちなみに、最初のコードに次のものを付け足すと
うまくいきます。
'IMEモード設定のためのAPI
Private Declare Function ImmGetContext Lib "imm32.dll" (ByVal hwnd As Long) As Long
Private Declare Function ImmSetOpenStatus Lib "imm32.dll" (ByVal hIMC As Long, ByVal b As Long) As Long
Private Declare Function ImmReleaseContext Lib "imm32.dll" (ByVal hwnd As Long, ByVal hIMC As Long) As Long
Dim hIMC As Long
'キーボート認識のためのAPI
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Const VK_DELETE = &H2E '[Delete]
Private Const VK_RETURN = &HD '[Enter]
Private Sub MSFlexGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
If GetKeyState(VK_DELETE) < 0 Then
MSFlexGrid1.Text = ""
Text1.Text = ""
End If
End Sub
Private Sub MSFlexGrid1_GotFocus()
'IMEモードオフ
hIMC = ImmGetContext(Me.hwnd)
Call ImmSetOpenStatus(hIMC, 0)
Call ImmReleaseContext(Me.hwnd, hIMC)
End Sub
Private Sub MSFlexGrid1_KeyPress(KeyAscii As Integer)
'リターンの場合、そのまま下がる
Dim dRow As Long
If GetKeyState(VK_RETURN) < 0 Then
dRow = MSFlexGrid1.Row + 1
If dRow < MSFlexGrid1.Rows Then
MSFlexGrid1.Row = dRow
End If
Exit Sub
End If
With Text1
.Text = Chr(KeyAscii)
.SelStart = 1
.Visible = True
.SetFocus
End With
End Sub