ページ 1 / 1
ListView コントロール
Posted: 2006年1月29日(日) 13:44
by M.S.
ListView に Favorite (お気に入り) のフォルダの中にある、
インターネット ショートカットと、フォルダを表示させようとしたのですが、
過去ログを見てもうまくできないので、質問させていただきます。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (hwndOwner As Long,lpszPath As String,nFolder As Long,fCreate As Long) As Long
Const CSIDL_FAVORITIES=&H6
Sub SetMsgText_To_ListView(lpszText As BytePtr, ParamNum As Long)
Dim lvFind As LVFINDINFO
Dim lvItem As LVITEM
Dim nIndex As Long
'ParamNumを元に、先頭からのインデックス番号を取得
lvFind.flags=LVFI_PARAM
lvFind.lParam=ParamNum
nIndex=SendDlgItemMessage(hMainWnd,ListView1,LVM_FINDITEM,-1,VarPtr(lvFind))
'リストビューの「Favorite」欄を設定
dim Favorite as long
do
Dim ListViewNum As Long
Dim buffer As String
buffer=String$(255,Chr$(0))
SHGetSpecialFolderPath(GetDesktopWindow(),buffer,&H6,FALSE)
'お気に入りのフォルダの中を検索
dim Find as WIN32_FIND_DATA
dim hFind as DWord
Dim lvItem As LVITEM
hFind=FindFirstFile(buffer+"\*.",Find)
lvItem.mask=LVIF_TEXT or LVIF_PARAM
lvItem.pszText=Find.cFileName
lvItem.iItem=0
lvItem.iSubItem=0
lvItem.lParam=ListViewNum
SendDlgItemMessage(hMainWnd,ListView1,LVM_SETITEM,0,VarPtr(lvItem))
Loop while FindNextFile(hFind, Find)
FindClose(hFind)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
SendDlgItemMessage(hMainWnd,ListView1,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT)
'----------------------------
' リストビューのカラムを設定
'----------------------------
Dim lc As LVCOLUMN
lc.mask=LVCF_FMT or LVCF_WIDTH or LVCF_TEXT or LVCF_SUBITEM
lc.fmt=LVCFMT_LEFT
lc.cx=196
lc.pszText="Favorite"
lc.iSubItem=0
SendDlgItemMessage(hMainWnd,ListView1,LVM_INSERTCOLUMN,0,VarPtr(lc))
End Sub
僕の技量ではこれが限界です・・・。
これをどうすればちゃんとなるのか、教えて下さい。
Re: ListView コントロール
Posted: 2006年1月29日(日) 16:55
by hira
FindFirstFileは1回だけ呼び出し(→doより前)、ループ内ではFindNextFileを呼び出すようにしてはいかがでしょう?
※実験してませんが(^^;
Re: ListView コントロール
Posted: 2006年1月30日(月) 15:32
by ノッチ
いくつか修正して動作するようになりました。
1) doの位置をhFind=FindFirstFile(buffer,Find)の後にする
2) buffer+"\*." が正しく結合されないのでlstrcat(buffer,"\*.")に変更
(ABは久しくさわってないので文字列の結合方法がわかりません)
3) アイテム追加のLVM_SETITEMをLVM_INSERTITEMに変更
FindFirstFileのbufferが"c:\~~~~\Favorites\*"だとフォルダも追加されます。
サブフォルダ以下はそのフォルダから個別に検索して下さい。
Re: ListView コントロール
Posted: 2006年2月01日(水) 18:29
by M.S.
> 1) doの位置をhFind=FindFirstFile(buffer,Find)の後にする
> 2) buffer+"\*." が正しく結合されないのでlstrcat(buffer,"\*.")に変更
> (ABは久しくさわってないので文字列の結合方法がわかりません)
> 3) アイテム追加のLVM_SETITEMをLVM_INSERTITEMに変更
こういうことでしょうか?
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (hwndOwner As Long,lpszPath As String,nFolder As Long,fCreate As Long) As Long
Const CSIDL_FAVORITIES=&H6
Sub SetFavorite(lpszText As BytePtr, ParamNum As Long)
Dim lvFind As LVFINDINFO
Dim lvItem As LVITEM
Dim nIndex As Long
dim Find as WIN32_FIND_DATA
dim hFind as DWord
Dim ListViewNum As Long
Dim buffer As String
buffer=String$(255,Chr$(0))
SHGetSpecialFolderPath(GetDesktopWindow(),buffer,&H6,FALSE)
hFind=FindFirstFile(lstrcact(buffer,"\*."),Find)
'ParamNumを元に、先頭からのインデックス番号を取得
lvFind.flags=LVFI_PARAM
lvFind.lParam=ParamNum
Find.cFileName=SendDlgItemMessage(hMainWnd,ListView1,LVM_FINDITEM,-1,VarPtr(lvFind))
'リストビューの「Favorites」欄を設定
do
lvItem.mask=LVIF_TEXT or LVIF_PARAM
lvItem.pszText=Find.cFileName
lvItem.iItem=0
lvItem.iSubItem=0
lvItem.lParam=ListViewNum
SendMessage(GetDlgItem(hMainWnd,ListView1),LVM_INSERTITEM,0,VarPtr(lvItem))
Loop while FindNextFile(hFind,Find)
FindClose(hFind)
End Sub
'Create イベントは変更なし
上のようにへんこうしましたが、表示されませんでした。
間違っている点がありましたら、ご指摘ください。
Re: ListView コントロール
Posted: 2006年2月02日(木) 11:30
by ノッチ
コード: 全て選択
> 'ParamNumを元に、先頭からのインデックス番号を取得
> lvFind.flags=LVFI_PARAM
> lvFind.lParam=ParamNum
> Find.cFileName=SendDlgItemMessage(hMainWnd,ListView1,LVM_FINDITEM,-1,VarPtr(lvFind))
上記の部分でLVIF_PARAMがLVFI_PARAMになってるのはただの打ち間違いだと思いますが、
コード: 全て選択
Find.cFileName=SendDlgItemMessage(hMainWnd,ListView1,LVM_FINDITEM,-1,VarPtr(lvFind))
の部分がよくわからないので、これをコメントアウトすればとりあえずは
動作するようになるはずです。
Re: ListView コントロール
Posted: 2006年2月02日(木) 11:38
by ノッチ
ところでListViewじゃなくてTreeViewだった、ってオチはないですか?
エクスプローラーのフォルダ表示で左側に表示されるのがTreeViewです。
反対に、右側に表示されるのがListViewです。
どういった用途で使用するのかわかりませんが、フォルダとファイルのような
階層状態を表現するのはTreeViewの方がわかりやすいと思います。
Re: ListView コントロール
Posted: 2006年2月02日(木) 18:07
by M.S.
> ところでListViewじゃなくてTreeViewだった、ってオチはないですか?
> エクスプローラーのフォルダ表示で左側に表示されるのがTreeViewです。
> 反対に、右側に表示されるのがListViewです。
いえ、それはありません。
コントロール ID は、配置したときのままなので・・・。
> どういった用途で使用するのかわかりませんが、フォルダとファイルのような
> 階層状態を表現するのはTreeViewの方がわかりやすいと思います。
そうですか、TreeView でやろうと思ったのですが、
なんか難しそうだし過去のサンプル的なものがなかったので、
ListView でやっています。
TreeView のサンプル コードみたいなものを検索してみます。
Posted: 2006年5月15日(月) 21:48
by M.S.
かなり古いトピックですが…。
今日 ListBox でやってみたら出来たのですが、
ファイル名を表示させることについてと、
Win XP での動作について聞きたいことがあります。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (hwndOwner as long,lpszPath as String,nFolder as long,fCreate as long) as long
const CSIDL_FAVORITES=&H6
sub GetFavorite()
dim hLst as long
hLst=GetDlgItem(hMainWnd,ListBox1)
' ListBox1 の内容をリセット
SendMessage(hLst,LB_RESETCONTENT,0,0)
' 特殊フォルダ「Favorite」を指定
dim buffer as String
buffer=String$(255,Chr$(0))
SHGetSpecialFolderPath(GetDesktopWindow(),buffer,&H6,FALSE)
dim Find as WIN32_FIND_DATA
dim hFind as DWord
hFind=FindFirstFile(lstrcat(buffer,"\*.url"),Find)
' Favorite フォルダ内の「*.url」を検索・セット
do
dim buf[255] as long
wsprintf(buf,"Internet Shortcut")
SendMessage(hLst,LB_ADDSTRING,0,buf)
Loop while FindNextFile(hFind,Find)
FindClose(hFind)
End Sub
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
GetFavorite()
End Sub
上のコードで ListBox1 にセットすることに成功したのですが、
Win 95 では正常に動作したのに、Win XP では正常に動作しません。
これは、何故おこるのでしょうか?
それから、「do ~ loop while …」内にある、
「wsprintf(buf,"Internet Shortcut")」の「"Internet Shortcut"」を、
検索したファイル名にしたいのですが、どうすればいいのですか?
よろしくお願いします。
P.S.
関係ないですが、
Win 95 の "C:\WINDOWS\System\options\CABS"
の中を見ていたら、IE4 のインストーラがあったので、
IE4 をインストールして AB プログラミングができるようになりました。
Posted: 2006年5月15日(月) 22:29
by 7
> かなり古いトピックですが…。
そうですね...。
> 上のコードで ListBox1 にセットすることに成功したのですが、
> Win 95 では正常に動作したのに、Win XP では正常に動作しません。
> これは、何故おこるのでしょうか?
Win XP しか持ってないので検証できないのですけど、たぶんDeclareが問題になってるんじゃないでしょうか。String型ではなくBytePtr型にするべきです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32" Alias "SHGetSpecialFolderPathA" (
ByVal hwndOwner As HWND,
ByVal lpszPath As BytePtr,
ByVal nFolder As Long,
ByVal fCreate As BOOL) As BOOL
> それから、「do ~ loop while …」内にある、
> 「wsprintf(buf,"Internet Shortcut")」の「"Internet Shortcut"」を、
> 検索したファイル名にしたいのですが、どうすればいいのですか?
検索したファイルの情報は
WIN32_FIND_DATA構造体に格納されます。ファイル名は cFileName メンバです。
ActiveBasic Ver 4.24.00
Windows XP Home SP2で動きました。
毎度のことなんですけどちょっと変えてしまいました [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32" Alias "SHGetSpecialFolderPathA" (
ByVal hwndOwner As HWND,
ByVal lpszPath As BytePtr,
ByVal nFolder As Long,
ByVal fCreate As BOOL) As BOOL
Sub GetFavorite()
Dim hList As HWND
Dim hFind As HANDLE
Dim ffd As WIN32_FIND_DATA
Dim path[MAX_PATH-1] As Byte
hList=GetDlgItem(hMainWnd,ListBox1)
' ListBox1 の初期化
SendMessage(hList,LB_RESETCONTENT,0,0)
' 「Favorite」へのパスを取得
SHGetSpecialFolderPath(hMainWnd,path,CSIDL_FAVORITES,FALSE)
' 「Favorite」内にあるすべての「.url」を検索
hFind=FindFirstFile(lstrcat(path,"\*.url"),ffd)
If hFind<>INVALID_HANDLE_VALUE Then
Do
SendMessage(hList,LB_ADDSTRING,0,ffd.cFileName)
Loop While FindNextFile(hFind,ffd)
FindClose(hFind)
End If
End Sub
Posted: 2006年5月24日(水) 13:49
by M.S.
返信遅れてしまってすいません。
7 さんのコードで Win95 でも動作できました。
ありがとうございました。
そしてみなさん、ありがとうございました。
Posted: 2006年5月24日(水) 20:53
by C1000
> そうですか、TreeView でやろうと思ったのですが、
> なんか難しそうだし過去のサンプル的なものがなかったので、
> ListView でやっています。
>
> TreeView のサンプル コードみたいなものを検索してみます。
今自分はTreeViewで同じことをやっています。