初歩的な質問ですが リストボックスデータの取得が うまくいきません
ヘルプで 調べてましたが 調子よくないので このコミュに あった例を使ってみました。APIも ポインタも良く理解していない事が 原因でしょうが はっきりしません。
”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)
End Sub
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
このコードで Dataに 期待した文字が 返らないのです
ここで pos は リストボックスのindexと考えて良いのでしょうか
また GetDlgLisBoxStr() は 何の役目があるのでしょう?
やりたい事:
文字列を リストボックスに追加したいが 既に 登録されているものは 除きたい
そのため リストボックスの中身を index毎に 取り出したい
複数列のリストボックスは ややこしそうなので 1列に設定しています
(index番号は 不要)
リストボックスのデータを 取得したいのですが・・
Re: リストボックスのデータを 取得したいのですが・・
> 初歩的な質問ですが リストボックスデータの取得が うまくいきません
> ヘルプで 調べてましたが 調子よくないので このコミュに あった例を使ってみました。APIも ポインタも良く理解していない事が 原因でしょうが はっきりしません。
> ”NoWest” さんの投稿に 以下があり 使ってみようと思いますが 初期でつまづいてしまいます。
そのやり方ではないのですが、自分はこのようにしています。
Long型変数posはリストボックスの選択されている項目の位置を操作しています。このことはLB_GETCURSELの説明を読めば分かると思います。
> また GetDlgLisBoxStr() は 何の役目があるのでしょう?
GetDlgListBoxStr関数は、GetListBoxStr関数のようにリストビューのウィンドウハンドルを指定するのではなく、親ウィンドウのウィンドウハンドルとリストビューのコントロールIDを指定する為の関数です。何の役目、適当な説明になるんですけどSendMessage()関数とSendDlgItemMessage()関数の関係と同じものです...。
> やりたい事:
> 文字列を リストボックスに追加したいが 既に 登録されているものは 除きたい
> そのため リストボックスの中身を index毎に 取り出したい
その場合、リストボックスの中身をすべて取得して検査していてはデータの量が多いときに困ります。
LB_FINDSTRINGというメッセージを使うとリストボックスに指定された項目が存在するか調べることができます。これを利用して、指定された項目が存在するなら追加しない、指定された項目が存在しないなら追加するという処理にするとお望み通りになると思います。
> ヘルプで 調べてましたが 調子よくないので このコミュに あった例を使ってみました。APIも ポインタも良く理解していない事が 原因でしょうが はっきりしません。
> ”NoWest” さんの投稿に 以下があり 使ってみようと思いますが 初期でつまづいてしまいます。
そのやり方ではないのですが、自分はこのようにしています。
[ここをクリックすると内容が表示されます]
> ここで pos は リストボックスのindexと考えて良いのでしょうかコード: 全て選択
Function ListBox_GetCurSel(ByVal hWnd As HWND) As Long
Return SendMessage(hWnd,LB_GETCURSEL,0,0) As Long
End Function
Function ListBox_GetText(ByVal hWnd As HWND,ByVal nIndex As Long,ByVal lpString As LPSTR) As Long
Return SendMessage(hWnd,LB_GETTEXT,nIndex As WPARAM,lpString As LPARAM) As Long
End Function
Function ListBox_GetTextLen(ByVal hWnd As HWND,ByVal nIndex As Long) As Long
Return SendMessage(hWnd,LB_GETTEXTLEN,nIndex As WPARAM,0) As Long
End Function
Sub MainWnd_ListBox1_SelChange()
Dim hList As HWND
Dim nCur As Long
Dim lpStr As LPSTR
hList=GetDlgItem(hMainWnd,ListBox1)
nCur=ListBox_GetCurSel(hList)
lpStr=malloc(ListBox_GetTextLen(hList,nCur)+1)
ListBox_GetText(hList,nCur,lpStr)
MessageBox(hMainWnd,lpStr,NULL,MB_OK)
free(lpStr)
End Sub
Long型変数posはリストボックスの選択されている項目の位置を操作しています。このことはLB_GETCURSELの説明を読めば分かると思います。
> また GetDlgLisBoxStr() は 何の役目があるのでしょう?
GetDlgListBoxStr関数は、GetListBoxStr関数のようにリストビューのウィンドウハンドルを指定するのではなく、親ウィンドウのウィンドウハンドルとリストビューのコントロールIDを指定する為の関数です。何の役目、適当な説明になるんですけどSendMessage()関数とSendDlgItemMessage()関数の関係と同じものです...。
> やりたい事:
> 文字列を リストボックスに追加したいが 既に 登録されているものは 除きたい
> そのため リストボックスの中身を index毎に 取り出したい
その場合、リストボックスの中身をすべて取得して検査していてはデータの量が多いときに困ります。
LB_FINDSTRINGというメッセージを使うとリストボックスに指定された項目が存在するか調べることができます。これを利用して、指定された項目が存在するなら追加しない、指定された項目が存在しないなら追加するという処理にするとお望み通りになると思います。
[ここをクリックすると内容が表示されます]
コード: 全て選択
Function ListBox_FindString(ByVal hWnd As HWND,ByVal nIndexStart As Long,ByVal lpszFind As LPCSTR) As Long
Return SendMessage(hWnd,LB_FINDSTRING,nIndexStart As WPARAM,lpszFind As LPARAM) As Long
End Function
Function ListBox_AddString(ByVal hWnd As HWND,ByVal lpszStr As LPCSTR) As Long
Return SendMessage(hWnd,LB_ADDSTRING,0,lpszStr As LPARAM) As Long
End Function
Dim hList As HWND
Dim str="text1" As LPCSTR
hList=GetDlgItem(hMainWnd,ListBox1)
If ListBox_FindString(hList,0,str)=LB_ERR Then
ListBox_AddString(hList,str)
End If
Re: リストボックスのデータを 取得したいのですが・・
>LB_FINDSTRINGというメッセージを使うとリストボックスに指定された項目が存在するか調べることができます。これを利用して、指定された項目が存在するなら追加しない、指定された項目が存在しないなら追加するという処理にするとお望み通りになると思います。
なるほど そうですね。 indexを 1個づつサーチして 取得し判定しようと考えて
いました。簡単な方法がみつかりました。ありがとうございます。
悩んでいた事が
Dim buf[256] as Byte
if SendMessage(hList,LB_FINDSTRING,0,buf)=LB_ERR Then
SendMessage (hList, LB_ADDSTRING, 0, buf)
'syori
End If
で 解決しました。
また LB_GETCARETINDEX は パラメなしとなっていたのですが
test=SendMessage(hList,LB_GETCARETINDEX,0,0)
のように パラメを ”0”で 配置するのさえ 知らないものですから・・・
初歩的な質問に丁寧に答えていただき 毎回感謝します。
ありがとうです。
なるほど そうですね。 indexを 1個づつサーチして 取得し判定しようと考えて
いました。簡単な方法がみつかりました。ありがとうございます。
悩んでいた事が
Dim buf[256] as Byte
if SendMessage(hList,LB_FINDSTRING,0,buf)=LB_ERR Then
SendMessage (hList, LB_ADDSTRING, 0, buf)
'syori
End If
で 解決しました。
また LB_GETCARETINDEX は パラメなしとなっていたのですが
test=SendMessage(hList,LB_GETCARETINDEX,0,0)
のように パラメを ”0”で 配置するのさえ 知らないものですから・・・
初歩的な質問に丁寧に答えていただき 毎回感謝します。
ありがとうです。