MSFlexGridとテキストボックスを組み合わせた場合の不具合について?

解決


聖二  2004-02-10 17:14:05  No: 81943  IP: [192.*.*.*]

いつもお世話になりありがとうございます。よろしくお願い致します。

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

編集 削除
聖二  2004-02-18 15:16:25  No: 81944  IP: [192.*.*.*]

日本語入力の制御については
以下を参考に解決しました。
http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips075.htm

Deleteキーが使えないというのは、まだまだ未解決です。
また、Enterの2度押しでデータは消えるものの
たぶん、セルには見えないのですが、
リターンマーク?が入っている模様です。
ので、空白セルとは認識してくれません。

このあたりについて、何か見解はございませんでしょうか。
よろしくお願い致します。

編集 削除
聖二  2004-02-18 16:19:16  No: 81945  IP: [192.*.*.*]

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

編集 削除