ページ 1 / 1
リストボックスの指定している文字列の取得
Posted: 2006年7月05日(水) 21:39
by 雷電
現在、リストボックスの内容を変更したときに、同じウィンドウにあるエディットボックス(ここでは2です)に説明書きをしたいと思ってコーディングしています。
しかし、リストボックスの内容が変化しても、GetWindowText関数がちゃんと働かず、デバッグ命令で変数(ここではData)の中身を見てみると、何も入っていない・・・
という事態になっています。
コードを載せておきますので、間違っている点ありましたら、書込みお願いします。
それと、これには、GetDlgItemTextStrという関数を使っていますが、これはイグトランスさんが作られた関数を利用しています。前に書いてあるものと思ってください。
ウィンドウにはエディットボックスが2個と、リストボックスが1個、コンボボックスが2個設置してあります。
コード: 全て選択
Sub MainWnd_ListBox1_SelChange()
Dim Data As String
GetDlgItemTextStr(hMainWnd,ListBox1,Data)
SetDlgItemText(hMainWnd,EditBox2,Data)
End Sub
Posted: 2006年7月06日(木) 06:07
by NoWest
> 現在、リストボックスの内容を変更したときに、同じウィンドウにあるエディットボックス(ここでは2です)に説明書きをしたいと思ってコーディングしています。
> しかし、リストボックスの内容が変化しても、GetWindowText関数がちゃんと働かず、デバッグ命令で変数(ここではData)の中身を見てみると、何も入っていない・・・
> という事態になっています。
> コードを載せておきますので、間違っている点ありましたら、書込みお願いします。
> それと、これには、GetDlgItemTextStrという関数を使っていますが、これはイグトランスさんが作られた関数を利用しています。前に書いてあるものと思ってください。
> ウィンドウにはエディットボックスが2個と、リストボックスが1個、コンボボックスが2個設置してあります。
全体的な流れは間違っていませんがリストボックスから文字列を取得する場合、GetDlgItemTextStrは使えません。
同じようにString型を使用する関数ですがリストボックス用のものを用意しましたので使ってください。
ListBox用 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Function GetListBoxStr(hLB As HWND, pos As Long, ByRef str As String) As Long
Dim Length As Long
Length = SendMessage(hLB,LB_GETTEXTLEN,pos,0)
str = ZeroString(Length)
If Length = 0 Then
GetListBoxStr = 0
Exit Function
End If
GetListBoxStr = SendMessage(hLB,LB_GETTEXT,pos,StrPtr(str))
SetDWord(StrPtr(str) - SizeOf (DWord), GetListBoxStr)
End Function
Function GetDlgLisBoxStr(hDlg As HWND, idLB As Long, pos As Long, ByRef str As String) As Long
GetDlgLisBoxStr = GetListBoxStr(GetDlgItem(hDlg, idLB), pos, str)
End Function
使い方 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub MainWnd_ListBox1_SelChange()
Dim pos As Long
pos = SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETCURSEL,0,0)
Dim Data As String
GetListBoxStr(GetDlgItem(hMainWnd,ListBox1),pos,Data)
SetWindowText(GetDlgItem(hMainWnd,EditBox2),Data)
End Sub
Posted: 2006年7月06日(木) 20:08
by 雷電
返信ありがとうございます。
早速使わせてもらいました。
やはりできません。
間違っているのかと思ってそのままコピペして使ってみましたが使えませんでした。
それと、コードはこうではないのでしょうか?
コード: 全て選択
Sub MainWnd_ListBox1_SelChange()
Dim pos As Long
pos = SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETCURSEL,0,0)
Dim Data As String
GetListBoxStr(GetDlgItem(hMainWnd,ListBox1),pos,Data)
SetWindowText(GetDlgItem(hMainWnd,EditBox2),Data)
End Sub
ではなく、
コード: 全て選択
Sub MainWnd_ListBox1_SelChange()
Dim pos As Long
pos = SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETCURSEL,0,0)
Dim Data As String
GetDlgLisBoxStr(hMainWnd,ListBox1,pos,Data)
SetWindowText(GetDlgItem(hMainWnd,EditBox2),Data)
End Sub
ではないのでしょうか?
Posted: 2006年7月06日(木) 22:06
by NoWest
> 返信ありがとうございます。
> 早速使わせてもらいました。
> やはりできません。
変ですね。
こちらでは動いていますよ。
こちらでももう少し調べてみることにしますが、情報が不足していますのでもう少しプログラムの前後を見てみないと分かりません。
> それと、コードはこうではないのでしょうか?
>
コード: 全て選択
Sub MainWnd_ListBox1_SelChange()
> Dim pos As Long
> pos = SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETCURSEL,0,0)
> Dim Data As String
> GetListBoxStr(GetDlgItem(hMainWnd,ListBox1),pos,Data)
> SetWindowText(GetDlgItem(hMainWnd,EditBox2),Data)
> End Sub
>
> ではなく、
>
>
コード: 全て選択
Sub MainWnd_ListBox1_SelChange()
> Dim pos As Long
> pos = SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_GETCURSEL,0,0)
> Dim Data As String
> GetDlgLisBoxStr(hMainWnd,ListBox1,pos,Data)
> SetWindowText(GetDlgItem(hMainWnd,EditBox2),Data)
> End Sub
>
> ではないのでしょうか?
単にGetDlgItemTextStrとGetWindowTextStrに仕様をあわせただけなのでどちらを使っても結果は同じのはずです。
Posted: 2006年7月06日(木) 22:16
by NoWest
ふと、考えたのですが
もしかしてListBoxの文字列が変更されたのを検出したいのでしょうか?
だとするとSelChangeイベントではうまくできません。
実装方法をこれから考えて見ますか。。。
Posted: 2006年7月08日(土) 12:47
by 雷電
リストボックス内の文字列の選択が変更されたときです。
変更されたのを取得したいのではありません。
コンボボックスの場合でも、SelChangeイベントでできるので、
リストボックスでもできるか、とおもってやっているのですが・・・
Posted: 2006年7月08日(土) 22:07
by NoWest
> リストボックス内の文字列の選択が変更されたときです。
> 変更されたのを取得したいのではありません。
> コンボボックスの場合でも、SelChangeイベントでできるので、
> リストボックスでもできるか、とおもってやっているのですが・・・
こちらではうまくいっていますのでこれ以上は何ともし難いでしね。
ちゃんと取得したいリストボックスのIDを指定しているか、エディットボックスのIDの指定はできていますか?
もしくはリストボックスのスタイルに「通知」が付いているか確認してみてください。
Posted: 2006年7月09日(日) 11:34
by 雷電
できました。
NoWestさん、ありがとうございました。