ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 15:18

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - TreeView プログラム内からノードを選択
作成者 メッセージ
  記事の件名:  Re: TreeView プログラム内からノードを選択  引用付きで返信する
アイテム数が取得できずに悩んだ方へ

いまさらですが、
Const TVM_GETCOUNT = 4357
の設定が無いとアイテム数がゼロで返って来ます

----------------------------------------------------
余談ですが、できれば
Const TVGN_ROOT = 0
も設定しておいていた方が親切かも、、、。

ちなみに、私はVBSでこのソースの一部を
intアイテム数 = objEx.ExecuteExcel4Macro("CALL(""user32"", ""SendMessageA"", ""JJJJJ"", " & lngハンドル番号 & ", " & TVM_GETCOUNT & ", 0, 0)")
こんな感じで使用させて頂きました。

ありがとうございました。
投稿記事 Posted: 2021年4月21日(水) 09:22
  記事の件名:  Re: TreeView プログラム内からノードを選択  引用付きで返信する
kobo様

ご返信有難うございます!
大変参考になりました。

'---------------------------------
'現在選択されているアイテムを取得
'---------------------------------
Function TV_GetSelection() As Long

TV_GetSelection = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CARET, 0)

End Function

この命令を探して探して……
1行で出来たのですね……
完成にまた一つ近づきました!ありがとうございました
投稿記事 Posted: 2014年6月11日(水) 11:26
  記事の件名:  Re: TreeView プログラム内からノードを選択  引用付きで返信する
こんにちは
絵が既に消えていたので病状もわからず
ツリービューも使ったことがないのでさっぱりですが
よく参考にしているサイトとバックサーチに情報があったので
貼り付けておきます。少しでも参考になれば

http://www.kumei.ne.jp/c_lang/sdk3/sdk_201.htm
コード:
投稿時間:2003/10/05(Sun) 11:14
投稿者名:ysama
Eメール:
URL :
タイトル:TreeViewライブラリー

コモンコントロールのひとつ、TreeViewがRADツールで貼っ付けら
れますが、結構めんどいのでけいえんされているのではないかし
ら?自作のCTREEVIEWクラスを関数ライブラリーとしてABに移植し
ました。一応RADで作ったテストプログラムで完動してます。ご参
考まで。

'------------------------------
' TREEVIEWライブラリーファイル
'------------------------------
'--------------
' 外部関数宣言
'--------------
'Declare Function ImageList_Create Lib "comctl32.dll" (cx As Long, cy As Long, flags As Long, cInitial As Long, cGrow As Long) As Long
'Declare Function ImageList_Destroy Lib "comctl32.dll" (himl As Long) As Long
Declare Function ImageList_AddMasked Lib "comctl32.dll" (himl As Long, hbmImage As Long, crMask As Long) As Long

'-------------
' TV 定数宣言
'-------------
Const TVSIL_NORMAL		= 0
Const TVS_HASBUTTONS	= 1
Const TVS_HASLINES		= 2
Const TVS_LINESATROOT	= 4
Const TVS_SHOWSELALWAYS	= 32
Const TVI_ROOT			= -65536
Const TVI_LAST			= -65534
Const TVM_INSERTITEM	= 4352
Const TVM_DELETEITEM	= 4353
Const TVM_EXPAND		= 4354
Const TVM_SETIMAGELIST	= 4361
Const TVM_GETNEXTITEM	= 4362
Const TVM_SELECTITEM	= 4363
Const TVM_SORTCHILDREN	= 4371
Const TVM_GETITEM		= 4364
Const TVGN_CHILD		= 4
Const TVGN_NEXTVISIBLE	= 6
Const TVGN_CARET		= 9
Const TVE_COLLAPSE		= 1
Const TVE_EXPAND		= 2
Const TVE_TOGGLE		= 3
Const TVE_COLLAPSERESET	= 32768

'-----------------------
' TV_INSERTSTRUCT構造体
'-----------------------
Type TV_INSERTSTRUCT
	hParent As Long 
	hInsertAfter As Long 
    item As TV_ITEM
End Type

'---------------
' TV_ITEM構造体
'---------------
Type TV_ITEM
	mask As Long
	hItem As Long
	state As Long
	stateMask As Long
	pszText As BytePtr
	cchTextMax As Long
	iImage As Long
	iSelectedImage As Long
	cChildren As Long
	lParam As Long
End Type

'----------
' 外部変数
'----------
Dim g_hTVWnd As Long					'ツリービューコントロールのハンドル
Dim g_hIList As Long					'ツリービュー用イメージリスト
Dim g_imgw As Long						'イメージリスト用イメージの幅
Dim g_imgh As Long						'イメージリスト用イメージの高さ
Dim g_imgnum As Long					'イメージリスト用イメージの最大数
Dim g_ext As Long						'イメージリスト用イメージの拡張数
Dim g_tvItem As TV_ITEM					'アイテム情報構造体(情報取得用)
Dim g_tvInst As TV_INSERTSTRUCT			'アイテム追加構造体

'-----------------------------
'コンストラクター
'イメージを使う際に初期化する
'-----------------------------
Sub TV_Init(imgw As Long, imgh As Long, imgnum As Long, ext As Long)

	g_imgw = imgw
	g_imgh = imgh
	g_imgnum = imgnum
	g_ext = ext
	g_hIList = ImageList_Create(imgw, imgh, ILC_COLOR4 Or ILC_MASK, imgnum, ext)

End Sub

'-----------------------------------
'イメージリストへのビットマップ登録
'TV_Init実行後すぐに登録する
'-----------------------------------
Function TV_AddBitmap(ID As BytePtr, hInstance As Long)  As Long

	Dim hBmp As Long
	hBmp = LoadBitmap(hInstance, ID)
	TV_AddBitmap = ImageList_AddMasked(g_hIList, hBmp, RGB(0, 0, 0))
	DeleteObject(hBmp)

End Function

'-------------------------------------
'デストラクター
'イメージを使ったら必ず終了時実行する
'-------------------------------------
Sub TV_Quit()

	'ツリービューで作成したイメージリスト、ツリービューを廃棄する
	ImageList_Destroy(g_hIList)

End Sub

'--------------------------------------
'CTREEVIEWコントロール作成関数 (1)
'RADツールでTVコントロールを作った場合
'--------------------------------------
Function TV_Create1(hWnd As Long, ID As Long) As Long

	g_hTVWnd = GetDlgItem(hWnd, ID)
	'ツリービューにイメージコントロールをセット
	TV_Create1 = SendMessage(g_hTVWnd, TVM_SETIMAGELIST, TVSIL_NORMAL, g_hIList)

End Function

'----------------------------------
'CTREEVIEWコントロール作成関数 (2)
'自分でTVコントロールを作る場合
'----------------------------------
Function TV_Create2(hWnd As Long, hInstance As Long, ID As Long, x As Long, y As Long, w As Long, h As Long) As Long

	g_hTVWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "SYSTREEVIEW32", "", WS_CHILD Or WS_VISIBLE Or TVS_HASLINES Or TVS_LINESATROOT Or TVS_HASBUTTONS Or TVS_SHOWSELALWAYS, x, y, w, h, hWnd, ID, hInstance, 0)
	'ツリービューにイメージコントロールをセット
	TV_Create2 = SendMessage(g_hTVWnd, TVM_SETIMAGELIST, TVSIL_NORMAL, g_hIList)

End Function

'--------------------------------
'TREEVIEWコントロールの移動
'本体ウィンドウのWM_SIZE時に使用
'--------------------------------
Sub TV_Move(x As Long, y As Long, w As Long, h As Long)

	MoveWindow(g_hTVWnd, x, y, w, h, TRUE)

End Sub

'-----------------
'アイテム数を取得
'-----------------
Function TV_GetCount() As Long

	TV_GetCount = SendMessage(g_hTVWnd, TVM_GETCOUNT, 0, 0)

End Function

'-----------------
'ルートを取得する
'-----------------
Function TV_GetRoot() As Long

	TV_GetRoot = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0)

End Function

'---------------------------------
'現在選択されているアイテムを取得
'---------------------------------
Function TV_GetSelection() As Long

	TV_GetSelection = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CARET, 0)

End Function

'-----------------------------
'指定されたアイテムの親を取得
'-----------------------------
Function TV_GetParent(hitem As Long) As Long

	TV_GetParent = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_PARENT, hitem)

End Function

'-----------------------------------
'指定されたアイテムの次の兄弟を取得
'-----------------------------------
Function TV_GetNext(hitem As Long) As Long

	TV_GetNext = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, hitem)

End Function

'-----------------------------------
'指定されたアイテムの最初の子を取得
'-----------------------------------
Function TV_GetChild(hitem As Long) As Long

	TV_GetChild = SendMessage(g_hTVWnd, TVM_GETNEXTITEM, TVGN_CHILD, hitem)

End Function

'-------------------
'アイテム情報の取得
'-------------------
Function TV_GetItem(hitem As Long, Buff As BytePtr, size As Long) As VoidPtr

	TV_GetItem = VarPtr(g_tvItem)
	g_tvItem.hItem = hitem
	If(Buff = 0) Then
		g_tvItem.mask = TVIF_CHILDREN Or TVIF_HANDLE Or TVIF_IMAGE Or TVIF_PARAM Or _
						TVIF_SELECTEDIMAGE Or TVIF_STATE
	Else
		g_tvItem.mask = TVIF_CHILDREN Or TVIF_HANDLE Or TVIF_IMAGE Or TVIF_PARAM Or _
						TVIF_SELECTEDIMAGE Or TVIF_STATE Or TVIF_TEXT
		g_tvItem.cchTextMax = size
		g_tvItem.pszText = Buff
	End If
	SendMessage(g_hTVWnd, TVM_GETITEM, 0, TV_GetItem)

End Function

'-----------------------------------
'UINTで指定した関係のアイテムを取得
'-----------------------------------
Function TV_GetNextItem(hitem As Long, flag As Long) As Long

	TV_GetNextItem = SendMesage(g_hTVWnd, TVM_GETNEXTITEM, flag, hitem)

End Function

'--------------------------------------
'char*で指定した文字列のアイテムを取得
'--------------------------------------
Function TV_FindItem(hitem As Long, text As BytePtr) As Long

	TV_FindItem = NULL				'全てのSiblingに無ければNULLを返す
	Dim hSelected As Long, hFound As Long
	hSelected = hitem
	Dim tvitem As TV_ITEM			'TV_ITEM構造体
	Dim Buff[MAX_PATH] As Byte		'文字列長はMAX_PATH限度
	While(hSelected)				'最後まで見つからなければhSelectedは0になる
		tvitem.hItem = hSelected
		tvitem.mask = TVIF_TEXT Or TVIF_CHILDREN
		tvitem.pszText = Buff
		tvitem.cchTextMax = MAX_PATH
		SendMessage(g_hTVWnd, TVM_GETITEM, 0, VarPtr(tvitem))
		If(lstrcmp(Buff, text) = 0) Then	'取得した文字列が同じ場合
			TV_FindItem = hSelected
			Exit Function
		Else						'同じでない場合
			'子がいれば再起呼出でサーチ、見つかれば終了
			If(tvitem.cChildren) Then
				hFound = TV_FindItem(TV_GetChild(hSelected), text)
				If(hFound) Then
					TV_FindItem = hFound
					Exit Function
				End If
			End If
			'矢張り見つからなければ次を探す
			hSelected = TV_GetNext(hSelected);
		End If
	Wend

End Function

'----------------------------------
'HTREEITEMで指定したアイテムを選択
'----------------------------------
Function TV_SelectItem(hitem As Long) As Long

	TV_SelectItem = SendMessage(g_hTVWnd, TVM_SELECTITEM, TVGN_CARET, hitem)

End Function

'-------------
'アイテム追加
'-------------
Function TV_InsertItem(Title As BytePtr, InsAfter As Long, Parent As Long, Image As Long, SelImage As Long) As Long

	If(InsAfter = 0) Then InsAfter = TVI_LAST
	If(Parent = 0) Then Parent = TVI_ROOT
	ZeroMemory(VarPtr(g_tvInst), Len(g_tvInst))
	g_tvInst.hInsertAfter = InsAfter
	g_tvInst.hParent = Parent
	g_tvInst.item.pszText = Title
	If(Image = -1) Then
		g_tvInst.item.mask = TVIF_TEXT
	Else
		g_tvInst.item.mask = TVIF_TEXT Or TVIF_IMAGE
		g_tvInst.item.iImage = Image
		If(SelImage <> -1) Then
			g_tvInst.item.mask = g_tvInst.item.mask Or TVIF_SELECTEDIMAGE
			g_tvInst.item.iSelectedImage = SelImage
		End If
	EndIf
	TV_InsertItem = SendMessage(g_hTVWnd, TVM_INSERTITEM, 0, VarPtr(g_tvInst))

End Function

'-----------------------------------------
'g_tvItemのデータを予めセットして実行する
'-----------------------------------------
Function TV_SetItem(hitem As Long) As Long

	g_tvItem.mask = TVIF_CHILDREN Or TVIF_HANDLE Or TVIF_IMAGE Or TVIF_PARAM Or _
					TVIF_SELECTEDIMAGE Or TVIF_STATE Or TVIF_TEXT
	g_tvItem.hItem = hitem
	TV_SetItem = SendMessage(g_hWnd, TVM_SETITEM, 0, VarPtr(g_tvItem))

End Function

'---------------------
'全てのアイテムを削除
'---------------------
Function TV_DeleteAllItems()  As Long

	TV_DeleteAllItems = SendMessage(g_hTVWnd, TVM_DELETEITEM, 0, TVI_ROOT)

End Function

'-----------------------
'指定したアイテムを削除
'-----------------------
Function TV_DeleteItem(hitem As Long) As Long

	TV_DeleteItem = SendMessage(g_hTVWnd, TVM_DELETEITEM, 0, hitem)

End Function

'-------------------
'アイテムを展開する
'-------------------
Function TV_Expand(hitem As Long, flag As Long) As Long

	If(flag = 0) Then flag  = TVE_TOGGLE
	TV_Expand =  SendMessage(g_hTVWnd, TVM_EXPAND, flag, hitem)

End Function

'-------------------
'子供達をソートする
'-------------------
Function TV_SortChildren(hitem As Long) As Long

	TV_SortChildren = SendMessage(g_hTVWnd, TVM_SORTCHILDREN, 0, hitem)

End Function

投稿記事 Posted: 2014年4月28日(月) 16:20
  記事の件名:  TreeView プログラム内からノードを選択  引用付きで返信する
教えてGooに投稿していたのですが,いまいちいい感じの反応がなかったのでこちらにも.

TreeViewをプログラムの内部から選択したり、選択を外したりする方法を探しています。
http://okwave.jp/qa/q8518352.html

症状を画像でまとめてみました。
(A)http://fast-uploader.com/file/6950711390639/
(B)http://fast-uploader.com/file/6950711438023/
なお、(B)の症状については、TreeViewを一度クリックするとクリアされます。
直接ノードをクリックすると(A)の状態になるのです……

これはどのように修正したらいいのでしょうか?
よろしくお願いいたします.
投稿記事 Posted: 2014年4月14日(月) 14:02

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean