ツリービュー
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、変数で、(~×変数)のようにする{ツリービューの中の内容を}
その他多数。
すいません、なんでも人に頼ってしまって