ツリービュー
Re: ツリービュー
RADの「コントロール」の一番右側、上から2つ目にツリービューがあります。雷電さん さんが書きました:> ツリービューの作成方法を教えてください。
> 手短に教えていただければ幸いです。
>
> コードをそのまま書いてもらったら結構です。
それを貼り付けて、「TreeViewプロパティ」の「ボタンあり」「線を表示」「ルートにも線を表示」の三つをチェックしてください。
アイテムの追加例はこんな感じです。
コード: 全て選択
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim hAny As Long
Dim tvi As TVINSERTSTRUCT
Dim hTreeItem As Long
'ツリービューのハンドルを得る
hAny = GetDlgItem( hMainWnd, TreeView1 )
'ルートの項目(アイテム)を追加する。
tvi.hParent = TVI_ROOT
tvi.hInsertAfter = TVI_SORT
tvi.item.mask = TVIF_TEXT
tvi.item.pszText = "る~と"
hTreeItem = TreeView_InsertItem( hAny , tvi )
'子アイテムを追加する。
tvi.hParent = hTreeItem
tvi.item.pszText = "その次"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "その次にもう1つ"
hTreeItem = TreeView_InsertItem( hAny , tvi )
'子の子アイテムを追加する。
tvi.hParent = hTreeItem
tvi.item.pszText = "その次の次"
hTreeItem = TreeView_InsertItem( hAny , tvi )
End Sub
'TreeViewで使用する追加定義。
Const TVI_ROOT = &HFFFF0000
Const TVI_SORT = (&HFFFF0003)
Const TV_FIRST = &H1100
Const TVM_INSERTITEM = (TV_FIRST + 0)
Type TVINSERTSTRUCT
hParent As Long
hInsertAfter As Long
item As TVITEM
End Type
Function TreeView_InsertItem( hWnd As Long, ByRef lpis As TVINSERTSTRUCT ) As Long
TreeView_InsertItem = SendMessage( hWnd, TVM_INSERTITEM, 0, VarPtr(lpis) )
EndFunction
(「'TreeViewで使用する追加定義。」以下の部分は、
「' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。」の
部分に書くべきかもしれませんね^^;)
ProjectEditorの
「表示」メニュー→「プロジェクト オプション」をクリックし、
出てきたダイアログのタブを「Win32API」に切り替えて、「コモン コントロールを使用する」にチェックを入れ、OKをクリックすれば使えるようになるはずです。
「表示」メニュー→「プロジェクト オプション」をクリックし、
出てきたダイアログのタブを「Win32API」に切り替えて、「コモン コントロールを使用する」にチェックを入れ、OKをクリックすれば使えるようになるはずです。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
Re: できました
> それに付け加えなんですが、ルートのところをダブルクリックするとそのコードが書いてある位置に移動するというのを作ろうと思えば、どうやったら作れますか?
TVM_HITTESTというウィンドウメッセージを使います。
「コントロール内でマウスの左ボタンがダブルクリックされた時に」の場所に、下のように書きます。
また、質問の意味を汲み取れてないので間違った解答かもしれません。
> また、定期的にそのツリービューの中の内容を更新しようと思えば、どういうコードを付け足さなければいけないですか?
定期的にツリービューの中の内容を描写について更新するならUpdateWindow()関数、
定期的にツリービューの中のアイテムを更新するならTVM_INSERTITEMやTVM_DELETEITEMというメッセージを送ります。
TVM_HITTESTというウィンドウメッセージを使います。
「コントロール内でマウスの左ボタンがダブルクリックされた時に」の場所に、下のように書きます。
[ここをクリックすると内容が表示されます]
テストしてないので上手く行かないかもしれません。コード: 全て選択
Dim tvHitTestInfo As TVHITTESTINFO
Dim pointApi As POINTAPI
GetCursorPos(pointApi)
tvHitTestInfo.pt.x=pointApi.x
tvHitTestInfo.pt.y=pointApi.y
'hWndはツリービューのハンドル
ScreenToClient(hWnd,tvHitTestInfo.pt)
SendMessage(hWnd,TVM_HITTEST,NULL,tvHitTestInfo As LPARAM)
If tvHitTestInfo.flags And TVHT_ONITEMBUTTON Then
'ここにそのコードが書いてある位置に移動するコード?を書く
'ダブルクリックされたノードのハンドルはtvHitTestInfo.hItemに格納されている
End If
また、質問の意味を汲み取れてないので間違った解答かもしれません。
> また、定期的にそのツリービューの中の内容を更新しようと思えば、どういうコードを付け足さなければいけないですか?
定期的にツリービューの中の内容を描写について更新するならUpdateWindow()関数、
定期的にツリービューの中のアイテムを更新するならTVM_INSERTITEMやTVM_DELETEITEMというメッセージを送ります。
うわーー
いろんなことが引っかかりましたーー。
無効な識別子とかいろんなのが出てきてしまった。
一応、コードだけ書いときます。
以上のことが、デバックで引っかかった内容です。
無効な識別子とかいろんなのが出てきてしまった。
一応、コードだけ書いときます。
コード: 全て選択
MainWnd.sbp(279) - "TVHITTESTINFO" 無効な識別子です
MainWnd.sbp(283) - "tvHitTestInfo.pt.x" 無効な識別子です
MainWnd.sbp(284) - "tvHitTestInfo.pt.y" 無効な識別子です
MainWnd.sbp(287) - "tvHitTestInfo.pt" 無効な識別子です
MainWnd.sbp(287) - "hWnd" 無効な識別子です
MainWnd.sbp(288) - "tvHitTestInfo" 無効な識別子です
MainWnd.sbp(288) - "TVM_HITTEST" 無効な識別子です
MainWnd.sbp(290) - "tvHitTestInfo.flags" 無効な識別子です
MainWnd.sbp(290) - "TVHT_ONITEMBUTTON" 無効な識別子です
MainWnd.sbp(290) - 実数に対して "and" 演算子は利用できません
それでも
それでも引っかかります。
書いときますね。
です。また、アドバイスお願いします。
それと、今やってるんですが、コードがおかしいのか、何か変なことになるんです。
それも、コードを書いておきます。
下のようにするにはどうしたらいいですか?
書いときますね。
コード: 全て選択
MainWnd.sbp(389) - "hWnd" 無効な識別子です
MainWnd.sbp(390) - "tvHitTestInfo" 型が違います
それと、今やってるんですが、コードがおかしいのか、何か変なことになるんです。
それも、コードを書いておきます。
[ここをクリックすると内容が表示されます]
こうすると、ツリービューの内容が、コード: 全て選択
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim hAny As Long
Dim tvi As TVINSERTSTRUCT
Dim hTreeItem As Long
'ツリービューのハンドルを得る
hAny = GetDlgItem( hMainWnd, TreeView1 )
'ルートの項目(アイテム)を追加する。
tvi.hParent = TVI_ROOT
tvi.hInsertAfter = TVI_SORT
tvi.item.mask = TVIF_TEXT
tvi.item.pszText = "MISSION"
hTreeItem = TreeView_InsertItem( hAny , tvi )
'子アイテムを追加する。
tvi.hParent = hTreeItem
tvi.item.pszText = "Camp1"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "Camp2"
hTreeItem = TreeView_InsertItem( hAny , tvi )
'子の子アイテムを追加する。
tvi.hParent = hTreeItem
tvi.item.pszText = "戦闘機"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "軽爆撃機"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "重爆撃機"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "艦船"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "地上部隊"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "地上物"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "SetName"
hTreeItem = TreeView_InsertItem( hAny , tvi )
'子の子アイテムを追加する。
tvi.hParent = hTreeItem
tvi.item.pszText = "戦闘機"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "軽爆撃機"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "重爆撃機"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "艦船"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "地上部隊"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "地上物"
hTreeItem = TreeView_InsertItem( hAny , tvi )
tvi.item.pszText = "SetName"
hTreeItem = TreeView_InsertItem( hAny , tvi )
End Sub
となってしまいます。MISSION
Camp1
Camp2
戦闘機
軽爆撃機
重爆撃機
艦船
地上部隊
地上物
SetName
下のようにするにはどうしたらいいですか?
MISSION
Camp1
戦闘機
軽爆撃機
重爆撃機
艦船
地上部隊
地上物
SetName
Camp2
戦闘機
軽爆撃機
重爆撃機
艦船
地上部隊
地上物
SetName
Re: それでも
> それでも引っかかります。
hWndはツリービューのハンドルをそこに書いて下さいという意味で書いただけなので、ツリービューのハンドルを書いて下さい。
tvHitTestInfoの型については、構造体の扱いを誤ってました。ポインタを渡す必要があるので下のように書き直してください。
> 下のようにするにはどうしたらいいですか?
>
所で、コードの動きをしっかりと理解していますか?
指定すべき値や戻り値をしっかりと把握していればスムーズに行くはずです。
でも、ツリービューは面倒ですよね。自分はフォルダの階層構造をツリービューに表示するのに悪戦苦闘しています...。
hWndはツリービューのハンドルをそこに書いて下さいという意味で書いただけなので、ツリービューのハンドルを書いて下さい。
tvHitTestInfoの型については、構造体の扱いを誤ってました。ポインタを渡す必要があるので下のように書き直してください。
コード: 全て選択
SendMessage(hWnd,TVM_HITTEST,NULL,VarPtr(tvHitTestInfo) As LPARAM)
>
変数の識別名は勝手に変えちゃいました...(_ _)MISSION
> Camp1
> 戦闘機
> 軽爆撃機
> 重爆撃機
> 艦船
> 地上部隊
> 地上物
> SetName
> Camp2
> 戦闘機
> 軽爆撃機
> 重爆撃機
> 艦船
> 地上部隊
> 地上物
> SetName
[ここをクリックすると内容が表示されます]
うまいコメントが思い付きません...。コード: 全て選択
Dim hTreeView As HWND
Dim tvi As TVINSERTSTRUCT
Dim hTreeItem As HANDLE
Dim hTreeChildItem As HANDLE
'ツリービューのハンドルを得る
hTreeView=GetDlgItem(hMainWnd,TreeView1)
'ルートの項目(アイテム)を追加する。
With tvi
.hParent =TVI_ROOT
.hInsertAfter =TVI_SORT
.item.mask =TVIF_TEXT
.item.pszText ="MISSION"
End With
hTreeItem=TreeView_InsertItem(hTreeView,tvi)
'子アイテムを追加する。
With tvi
'親(ルート)のハンドルを設定
.hParent =hTreeItem
.item.pszText="Camp1"
hTreeChildItem=TreeView_InsertItem(hTreeView,tvi)
'孫アイテムを追加する。
'親(子)ノードのハンドルを設定
.hParent =hTreeChildItem
.hInsertAfter =TVI_LAST
.item.pszText ="戦闘機"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="軽爆撃機"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="重爆撃機"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="艦船"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="地上部隊"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="地上物"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="SetName"
TreeView_InsertItem(hTreeView,tvi)
End With
'子アイテムを追加する。
With tvi
'親(ルート)のハンドルを設定
.hParent =hTreeItem
.item.pszText="Camp2"
hTreeChildItem=TreeView_InsertItem(hTreeView,tvi)
'孫アイテムを追加する。
'親(子)ノードのハンドルを設定
.hParent =hTreeChildItem
.hInsertAfter =TVI_LAST
.item.pszText ="戦闘機"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="軽爆撃機"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="重爆撃機"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="艦船"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="地上部隊"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="地上物"
TreeView_InsertItem(hTreeView,tvi)
.item.pszText ="SetName"
TreeView_InsertItem(hTreeView,tvi)
End With
所で、コードの動きをしっかりと理解していますか?
指定すべき値や戻り値をしっかりと把握していればスムーズに行くはずです。
でも、ツリービューは面倒ですよね。自分はフォルダの階層構造をツリービューに表示するのに悪戦苦闘しています...。
Re: すいません
ちょっと気になったので。横レスです(というか、放置しててすいません)。雷電さん さんが書きました:> またも、無効な識別子と出ました。
「無効な識別子」というエラーメッセージの意味を理解しておられますでしょうか?
「定義されていない変数、定数、構造体(その他もろもろ)ですよ!」という意味になります。
変数であれば定義忘れor記述ミスを調べる、定数や構造体であればその定義を探してきて記述する、と解決への手段をとります。
・・・理解しておられるのでしたら、大変失礼いたしましたm(_ _)m。
ははは。意味の分からないエラーメッセージほど頭にくる(イライラさせられる)ものはないですよね~、と共感したものでして、つい^^;
と、これだけで終わるのは大変失礼ですね(^^;)
えっと。これを記述してみてください。
コード: 全て選択
Const TVI_ROOT = &HFFFF0000
Const TVI_FIRST = (TVI_ROOT+1)
Const TVI_LAST = (TVI_ROOT+2)
Const TVI_SORT = (TVI_ROOT+3)
以下、いつものように蛇足。
ツリービューのマクロ(C/C++のヤツ)を誰か全部移植してくれると嬉しいですね~。
ABでの定義済み/未定義にあわせて、必要な部分だけを記述したファイルの投稿もとむ☆(マテ。
…自分でしろって罠?はい、その通りですね。ま、まぁ、時間が出来たらやります(  ̄▽ ̄;)
てか、NoWest様がかなりの部分を既に移植してくださっているって罠。
http://www.discoversoft.net/forum/viewtopic.php?t=202
Re: できました2
> TVM_INSERTITEMやTVM_DELETEITEMのメッセージの送り方は、ヘルプにもかかれてないんですが、教えていただけますか?
SendMessage()関数、PostMessage()関数でメッセージを送ることが出来ます。
これはヘルプにしっかり書かれています。
指定するべき値や戻り値は、http://yokohama.cool.ne.jp/chokuto/uraw ... index.htmlが参考になります。
SendMessage()関数、PostMessage()関数でメッセージを送ることが出来ます。
これはヘルプにしっかり書かれています。
指定するべき値や戻り値は、http://yokohama.cool.ne.jp/chokuto/uraw ... index.htmlが参考になります。
...
意味がわからなくなってきた。
途中で、ぐしゃぐしゃになりました。
あ~、プログラムできるのかな?
http://yokohama.cool.ne.jp/chokuto/uraw ... index.html
見ても、余計にわからなくなった。
下にやりたいことを書きますので、そちらのほうに合うコードを書いてください。よろしくお願いします。
1、ツリービューに"エディットボックス"に書いてある内容で、アイテムを出す。
2、変数で、(~×変数)のようにする{ツリービューの中の内容を}
その他多数。
すいません、なんでも人に頼ってしまって
途中で、ぐしゃぐしゃになりました。
あ~、プログラムできるのかな?
どうやるのー?>SendMessage()関数、PostMessage()関数でメッセージを送ることが出来ます。
http://yokohama.cool.ne.jp/chokuto/uraw ... index.html
見ても、余計にわからなくなった。
下にやりたいことを書きますので、そちらのほうに合うコードを書いてください。よろしくお願いします。
1、ツリービューに"エディットボックス"に書いてある内容で、アイテムを出す。
2、変数で、(~×変数)のようにする{ツリービューの中の内容を}
その他多数。
すいません、なんでも人に頼ってしまって