Re: Spreadで、GetLineがしたい。


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by Uz on 2001/07/23 17:25:40

In Reply to: Spreadで、GetLineがしたい。 Posted by たぬき on 2001/07/23 12:37:51


    > Spreadコントロール(表形式入力OCX)で、セルを文字型に、
    > さらに複数行入力を可にします。そして、複数行入力するのですが、
    > カーソルのある行番号を取得したいのです。
    > SendMessage(Spread.hWnd, EM_LINEFROMCHAR, -1&, ByVal 0&)
    > では、ゼロしか帰ってきません。(当然?)
    まず、Spread.hWndがまずいでしょうね。
    Spreadがどういう作りをしているかはわかりませんが、
    テキスト入力の部分は内部的なTextBoxを使っていると
    思うので、そのTextBoxのhWndを渡さないといけないと思います。
    おそらくそんなhWndを返すプロパティが用意されていれば、
    いいのですが、おそらく無いように思います。
    何らかの方法でhWndを取得できればいいのですが、
    それが出来ないと、BOCの言うとおりかもしれません。

    で、とりあえず、BOCからDLして、試してみました。
    バージョンはかかれていなかったので、SPREAD Ver.3.0J
    トライアル版で。


    '標準モジュール側〜〜〜〜〜〜〜〜〜〜〜
    Option Explicit


    Public Const EM_LINEFROMCHAR = &HC9
    Public Const EM_GETSEL = &HB0

    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any _
    ) As Long

    Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
    ByVal hWnd1 As Long, _
    ByVal hWnd2 As Long, _
    ByVal lpsz1 As String, _
    ByVal lpsz2 As String _
    ) As Long

    Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" ( _
    ByVal hWnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long _
    ) As Long

    Public Function GetLineFromCurrent(hWnd As Long) As Long
    Dim nCharIndex As Long

    Call SendMessage(hWnd, EM_GETSEL, 0, nCharIndex)
    GetLineFromCurrent = SendMessage(hWnd, EM_LINEFROMCHAR, nCharIndex, 0) + 1
    End Function

    'Form側〜〜〜〜〜〜〜〜〜〜〜〜
    Option Explicit

    Private Sub Timer1_Timer()
    Dim hWnd As Long
    Dim sName As String

    On Error Resume Next

    Text2.Text = ""
    hWnd = FindWindowEx(vaSpread1.hWnd, 0, ByVal vbNullString, ByVal vbNullString)
    While hWnd <> 0
    sName = Space(255)
    Call GetClassName(hWnd, sName, 255)
    Text2.Text = Text2.Text & vbCrLf & hWnd & "-" & sName
    If Left$(sName, 20) = "SPRJ32X30EditHScroll" Then
    Text3.Text = hWnd
    Text1.Text = GetLineFromCurrent(hWnd) & "行目"
    End If
    hWnd = FindWindowEx(vaSpread1.hWnd, hWnd, ByVal vbNullString, ByVal vbNullString)
    Wend
    End Sub



    これで、なんとなくやり方がわかるでしょう。
    ただし、このままではいくつか問題があるので、
    いろいろ細工が必要です。

    問題点
    1.複数行と単行のセルが混じってると、SPRJ32X30EditHScroll
    が2つ現れる。(その他の属性によっても、複数表れるかも?)
    どこで何が現れるか、どれを使われるのか、管理する必要がある。
    2.タイマーを使っているので、理想的でない。

    あまりいいやり方ではありませんが、何らかのヒントになれば
    幸いです。


記事スレッド一覧