ツリービュー

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
雷電

ツリービュー

#1 投稿記事 by 雷電 »

ツリービューの作成方法を教えてください。
手短に教えていただければ幸いです。

コードをそのまま書いてもらったら結構です。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: ツリービュー

#2 投稿記事 by 淡幻星 »

雷電さん さんが書きました:> ツリービューの作成方法を教えてください。
> 手短に教えていただければ幸いです。
>
> コードをそのまま書いてもらったら結構です。
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
Ver. 4.10.02で動作確認。
(「'TreeViewで使用する追加定義。」以下の部分は、
 「' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。」の
 部分に書くべきかもしれませんね^^;)
雷電

....

#3 投稿記事 by 雷電 »

入力してみましたが、

コード: 全て選択

item As TVITEM
のところで、無効な識別子と出るのですが。・・
バグですか?それとも、私が使っているソフトが悪いのでしょうか?

ちゃんとできてるはずなのに、。

ほかの方も、書込みよろしくお願いします。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#4 投稿記事 by hira »

ProjectEditorの
「表示」メニュー→「プロジェクト オプション」をクリックし、
出てきたダイアログのタブを「Win32API」に切り替えて、「コモン コントロールを使用する」にチェックを入れ、OKをクリックすれば使えるようになるはずです。
雷電

できました

#5 投稿記事 by 雷電 »

できましたよおーーーーー。
感激 (^^)v

それに付け加えなんですが、ルートのところをダブルクリックするとそのコードが書いてある位置に移動するというのを作ろうと思えば、どうやったら作れますか?
というのは、ツリービューの中に編集されているルート(さっきの場合は”る~と”になってましたけど・・・)をダブルクリックするということです。

また、定期的にそのツリービューの中の内容を更新しようと思えば、どういうコードを付け足さなければいけないですか?
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: できました

#6 投稿記事 by 7 »

> それに付け加えなんですが、ルートのところをダブルクリックするとそのコードが書いてある位置に移動するというのを作ろうと思えば、どうやったら作れますか?
TVM_HITTESTというウィンドウメッセージを使います。
「コントロール内でマウスの左ボタンがダブルクリックされた時に」の場所に、下のように書きます。 テストしてないので上手く行かないかもしれません。
また、質問の意味を汲み取れてないので間違った解答かもしれません。

> また、定期的にそのツリービューの中の内容を更新しようと思えば、どういうコードを付け足さなければいけないですか?
定期的にツリービューの中の内容を描写について更新するならUpdateWindow()関数、
定期的にツリービューの中のアイテムを更新するならTVM_INSERTITEMやTVM_DELETEITEMというメッセージを送ります。
雷電

うわーー

#7 投稿記事 by 雷電 »

いろんなことが引っかかりましたーー。
無効な識別子とかいろんなのが出てきてしまった。

一応、コードだけ書いときます。

コード: 全て選択

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" 演算子は利用できません
以上のことが、デバックで引っかかった内容です。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: うわーー

#8 投稿記事 by 7 »

定数のことをサラっと忘れてました...。
以下のコードをグローバルな所に書いておけば大丈夫なはずです。

コード: 全て選択

Type TVHITTESTINFO
	pt As POINTAPI
	flags As DWord
	hItem As DWord
End Type

Const TVM_HITTEST=&H1111
Const TVHT_ONITEMBUTTON=&H0010
定数や構造体の定義はインターネットで検索すると大抵説明が見つかりますよ。
雷電

それでも

#9 投稿記事 by 雷電 »

それでも引っかかります。
書いときますね。

コード: 全て選択

MainWnd.sbp(389) - "hWnd" 無効な識別子です
MainWnd.sbp(390) - "tvHitTestInfo" 型が違います
です。また、アドバイスお願いします。
それと、今やってるんですが、コードがおかしいのか、何か変なことになるんです。
それも、コードを書いておきます。 こうすると、ツリービューの内容が、
MISSION
   Camp1
   Camp2
     戦闘機
     軽爆撃機
     重爆撃機
     艦船
     地上部隊
     地上物
     SetName
となってしまいます。
下のようにするにはどうしたらいいですか?
MISSION
   Camp1
     戦闘機
     軽爆撃機
     重爆撃機
     艦船
     地上部隊
     地上物
     SetName
   Camp2
     戦闘機
     軽爆撃機
     重爆撃機
     艦船
     地上部隊
     地上物
     SetName
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: それでも

#10 投稿記事 by 7 »

> それでも引っかかります。
hWndはツリービューのハンドルをそこに書いて下さいという意味で書いただけなので、ツリービューのハンドルを書いて下さい。
tvHitTestInfoの型については、構造体の扱いを誤ってました。ポインタを渡す必要があるので下のように書き直してください。

コード: 全て選択

SendMessage(hWnd,TVM_HITTEST,NULL,VarPtr(tvHitTestInfo) As LPARAM)
> 下のようにするにはどうしたらいいですか?
>
MISSION
>    Camp1
>      戦闘機
>      軽爆撃機
>      重爆撃機
>      艦船
>      地上部隊
>      地上物
>      SetName
>    Camp2
>      戦闘機
>      軽爆撃機
>      重爆撃機
>      艦船
>      地上部隊
>      地上物
>      SetName
変数の識別名は勝手に変えちゃいました...(_ _) うまいコメントが思い付きません...。
所で、コードの動きをしっかりと理解していますか?
指定すべき値や戻り値をしっかりと把握していればスムーズに行くはずです。
でも、ツリービューは面倒ですよね。自分はフォルダの階層構造をツリービューに表示するのに悪戦苦闘しています...。
雷電

すいません

#11 投稿記事 by 雷電 »

何回もすいません。
またも、無効な識別子と出ました。

あ~~~いやだーー。
めんどくさいーー。

コード: 全て選択

MainWnd.sbp(289) - "TVI_LAST" 無効な識別子です
何回出るんだろ。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: すいません

#12 投稿記事 by 淡幻星 »

雷電さん さんが書きました:> またも、無効な識別子と出ました。
ちょっと気になったので。横レスです(というか、放置しててすいません)。
「無効な識別子」というエラーメッセージの意味を理解しておられますでしょうか?
「定義されていない変数、定数、構造体(その他もろもろ)ですよ!」という意味になります。
変数であれば定義忘れ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
雷電

できました2

#13 投稿記事 by 雷電 »

えと、

コード: 全て選択

Const TVI_ROOT = &HFFFF0000
Const TVI_SORT = (TVI_ROOT+3) 
は、入力済みでした。

後は作っていくだけーーー、何ですが、ツリービューの中の内容をアップデートするコード、TVM_INSERTITEMやTVM_DELETEITEMのメッセージの送り方は、ヘルプにもかかれてないんですが、教えていただけますか?
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: できました2

#14 投稿記事 by 7 »

> TVM_INSERTITEMやTVM_DELETEITEMのメッセージの送り方は、ヘルプにもかかれてないんですが、教えていただけますか?
SendMessage()関数、PostMessage()関数でメッセージを送ることが出来ます。
これはヘルプにしっかり書かれています。

指定するべき値や戻り値は、http://yokohama.cool.ne.jp/chokuto/uraw ... index.htmlが参考になります。
雷電

...

#15 投稿記事 by 雷電 »

意味がわからなくなってきた。
途中で、ぐしゃぐしゃになりました。

あ~、プログラムできるのかな?
>SendMessage()関数、PostMessage()関数でメッセージを送ることが出来ます。
どうやるのー?
http://yokohama.cool.ne.jp/chokuto/uraw ... index.html
見ても、余計にわからなくなった。

下にやりたいことを書きますので、そちらのほうに合うコードを書いてください。よろしくお願いします。

1、ツリービューに"エディットボックス"に書いてある内容で、アイテムを出す。

2、変数で、(~×変数)のようにする{ツリービューの中の内容を}

その他多数。

すいません、なんでも人に頼ってしまって
返信する