ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月21日(火) 11:35

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 8 件の記事 ] 
作成者 メッセージ
 記事の件名: Treeviewラベルの変更
投稿記事Posted: 2014年8月11日(月) 23:07 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
お世話になっております、水波形です。

Treeviewのラベルの変更がうまく出来ずに困っています。

RADツールの、Treeview > ラベルの編集にチェック
コード:
/* コモンコントロールからメッセージが来た時 */
Dim hEditing As HWND
Sub MainWnd_Notify(ByRef nmHdr As NMHDR)
	If nmHdr.code = TVN_BEGINLABELEDIT Then
		hEditing = GetSelectNodeHandle()
	End If

	If nmHdr.code = TVN_ENDLABELEDIT Then
		If nmHdr.hwndFrom = hTree Then
			Dim buf[256] As Byte
			SendMessage(GetSelectNodeHandle(),WM_GETTEXT,255,buf)
			d(buf)
		End If
	End If

End Sub
※GetSelectNodeHandle()関数は選択さているノードのハンドルが返ります

このように書きましたが、bufの中身が空っぽです……
これは何処が間違えているのでしょうか。

参考にさせていただいたサイト様は
http://wisdom.sakura.ne.jp/system/winap ... mon16.html
http://www.geocities.jp/pgm513/maisono/c/
です。

TreeViewって、何でこんなに面倒…難しいのでしょうか。
みなさんあまりTreeviewに関してご質問されてないみたいですが、やはりあまり使わないものなのでしょうか^^;
ううん、難しい!!

ご存じの方がいらっしゃいましたら、ご教授お願いします

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2014年8月25日(月) 12:55 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 189
住所: 東京都
>TreeViewって、何でこんなに面倒…難しいのでしょうか。
>みなさんあまりTreeviewに関してご質問されてないみたいですが、やはりあまり使わないものなのでしょうか^^;
>ううん、難しい!!

たしかにTreeviewは難しいですね。
私はまったくわからないのでTreeviewのプログラム作成したことがないのです。

それはそれとしてGetSelectNodeHandle関数をYahoo検索しましたが表示されませんでした。
これはWin32 APIにある関数ですか?

それとSendMessage(GetSelectNodeHandle(),WM_GETTEXT,255,buf)を
SendMessage(hEditing,WM_GETTEXT,255,buf)にしたほうがよいのでは。
つまり編集開始時に取得した該当ノードのハンドルをそのまま引用することです。
念のためSendMessage関数の結果を確認してみてください。
よろしくお願いします。


通報する
ページトップ
投稿記事Posted: 2014年8月26日(火) 05:43 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
たかせ様

ご返信有難うございます。
引用:
それはそれとしてGetSelectNodeHandle関数をYahoo検索しましたが表示されませんでした。
これはWin32 APIにある関数ですか?
言葉足らずですいません。
私がかってに定義している関数です。
コード:
/* 選択されているノードハンドルを取得する */
Function GetSelectNodeHandle() As HWND
	Dim focus As HWND

	focus = GetFocus()

	SetFocus(hTree)
	GetSelectNodeHandle=SendMessage(hTree,TVM_GETNEXTITEM,&H0009,0)
	SetFocus(focus)

End Function
引用:
それとSendMessage(GetSelectNodeHandle(),WM_GETTEXT,255,buf)を
SendMessage(hEditing,WM_GETTEXT,255,buf)にしたほうがよいのでは。
つまり編集開始時に取得した該当ノードのハンドルをそのまま引用することです。
念のためSendMessage関数の結果を確認してみてください。
こちらも確認させていただきましたが、空のバッファが返ってくるだけです……

コード:
たしかにTreeviewは難しいですね。
私はまったくわからないのでTreeviewのプログラム作成したことがないのです。
難しいというか、そもそ資料があまりないというのが難しい理由ですかね…
VBとかにはマクロ……と言うかメソッドがありますし……
楽はできますが、コアな部分の勉強が出来ないので私は結局ABに戻ってきてしまいますw

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2014年8月27日(水) 20:33 
昔の資料集みたいなのです。
昔のどなたかが作られたもので、今でも使っていますが
どこにも公開されていないようで、他の質問に公開しても
いいよ的なことがかいてあったので、こっそり知人が借りてる
サーバーに置いてもらいました。怒られたら引っ込めます。
http://book.geocities.jp/kinkokinko2/BackSearchAB.zip

ここからDL、解凍してください。
カスペでチェック済みですが確認してご利用ください。


通報する
ページトップ
   
投稿記事Posted: 2014年8月27日(水) 21:10 
初めにツリービューの知識はありません。
ですががんばって考えてみました。
SendMessage(GetSelectNodeHandle(),WM_GETTEXT,255,buf)
これですが、おそらく WM_GETTEXTはウィンドに対してアプローチだと思われます。
wm_て書いてあるので。なのでTVM_GETITEMを使うのかなと思います。
以下、どなたかの資料丸写し
'---------------
' 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 tvitem As TV_ITEM 'TV_ITEM構造体
Dim Buff[MAX_PATH] As Byte '文字列長はMAX_PATH限度 MAX_PATHが通らなければ256
tvitem.hItem = hEditing
tvitem.mask = TVIF_TEXT Or TVIF_CHILDREN
tvitem.pszText = Buff
tvitem.cchTextMax = MAX_PATH

SendMessage(GetDlgItem(hMainWnd,TreeView1), TVM_GETITEM, 0, VarPtr(tvitem))

構造体については以下を参照
http://wisdom.sakura.ne.jp/system/winap ... mon16.html

まずはGetSelectNodeHandle()で数値が帰ってきているかも確認が必要かとおもいます。


通報する
ページトップ
   
投稿記事Posted: 2014年10月16日(木) 02:09 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
>kobo様

遅くなりました。
ご返信有難うございます。
引用:
'---------------
' 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 tvitem As TV_ITEM 'TV_ITEM構造体
Dim Buff[MAX_PATH] As Byte '文字列長はMAX_PATH限度 MAX_PATHが通らなければ256
tvitem.hItem = hEditing
tvitem.mask = TVIF_TEXT Or TVIF_CHILDREN
tvitem.pszText = Buff
tvitem.cchTextMax = MAX_PATH

SendMessage(GetDlgItem(hMainWnd,TreeView1), TVM_GETITEM, 0, VarPtr(tvitem))
では、値が返ってきませんでした。
そもそも、これは何処に記述するのでしょうか?
コールバック関数?MainWnd_Notify?
この辺りもまだ曖昧な私……勉強不足で申し訳ありません。

GetSelectNodeHandle()では値はしっかりと返ってきています。

よろしくお願いいたします。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
投稿記事Posted: 2014年10月29日(水) 18:16 
こんにちは。
色々な方のコードを切り張りしました。
Ver4.24 Win7 64bit で動作確認済みです。
コモンコントロール使用するでpj作成
RADで空っぽツリービュー(ラベル編集にチェック)1個作成
ボタン1個作成
追加と変更した文字の確認ができます
コード:
'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。



Type TVDISPINFO
	hdr As NMHDR
	item As TVITEM
End Type

/*
Type TVITEM
	mask As Long				'有効メンバを示すフラグ
	hItem As Long				'アイテムのハンドル
	state As Long				'アイテムの状態・イメージ
	stateMask As Long			'state のフラグ
	pszText As BytePtr			'アイテムの文字列
	cchTextMax As Long			'アイテムの文字列の長さ
	iImage As Long				'イメージのインデックス(非選択時)
	iSelectedImage As Long		'イメージのインデックス(選択時)
	cChildren As Long			'子アイテムを持つかどうかのフラグ
	lParam As Long				'アイテムの持つ32ビット値
End Type
*/


Const TVM_SETITEM		= &h110D
Const TVGN_CARET		= &h9
Const TVM_SELECTITEM	= &h110B




'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	Treeview4_DestroyObjects()
	PostQuitMessage(0)
End Sub

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim rect As RECT
Dim i As Long
Dim j As Long
Dim wst As Long
Dim hRoot As Long
Dim temp As String

  For i = 0 To 4
    temp = "Item " + Str$(i)
    hRoot = AddTVItem(0,temp)
    For j = 0 To 6
      temp = "Item " + Str$(i) + " - Sub " + Str$(j)
      AddTVItem(hRoot,temp)
    Next j
  Next i

End Sub

Sub MainWnd_Notify(ByRef sEdit As TVDISPINFO)
'引き数で編集内容取得
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)

	If sEdit.hdr.code=TVN_ENDLABELEDIT Then
		SendMessage(hTreeView,TVM_SETITEM,0,VarPtr(sEdit.item) as long )
		'変更された文字列---------------------------------
		msgbox 0,MakeStr(sEdit.item.pszText),"sEdit.item.pszText"
		'-------------------------------------------------
	End If

End Sub


Sub MainWnd_CommandButton1_Click()
Dim hCaret As Long
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)

  hCaret = SendMessage(hTreeView,TVM_GETNEXTITEM,TVGN_CARET,0)
  AddTVItem(hCaret,"追加")
  SendMessage(hTreeView,TVM_SELECTITEM,TVGN_CARET,0)
  SetFocus(hTreeView)
End Sub

Function AddTVItem(hParent As long ,s As String) As Long
'選択した場所の下層に追加する
'hParentが0の場合は最上階層に追加
Dim tvStruct As TVINSERTSTRUCT
Dim pText As BytePtr
Dim hTreeView As HWND
hTreeView = GetDlgItem(hMainWnd,TreeView1)

    ZeroMemory(VarPtr(tvStruct),Len(tvStruct))
    tvStruct.hParent = hParent as HTREEITEM
    tvStruct.hInsertAfter = TVI_LAST
    tvStruct.item.mask = LVIF_TEXT
    pText = calloc( lstrlen( s )+1 )
    memcpy(pText,StrPtr(s),Len(s))
    tvStruct.item.pszText = pText
    tvStruct.item.cchTextMax = lstrlen( pText )+1
    AddTVItem = SendMessage(hTreeView,TVM_INSERTITEM,0,VarPtr(tvStruct) as Long)
	free( pText )
End Function





通報する
ページトップ
   
投稿記事Posted: 2015年2月22日(日) 20:21 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
koto様

お返事かなり遅くなってしまい、申し訳ありません。
院試と卒業発表も漸く終わり、次は学会発表でバタバタしております……

さて、頂いたコードなのですが、うまく動作いたしました!
本当に有難うございます!!
コード:
Type TVDISPINFO
   hdr As NMHDR
   item As TVITEM
End Type

Sub MainWnd_Notify(ByRef sEdit As TVDISPINFO)
こんなことしちゃっていいんですね……知りませんでした。
というか、hdrに、今までのデータが何故ちゃんと入っているのかが謎です^^;

何はともあれ、次はドラッグアンドドロップでツリーを動かす方法をお聞きすると思いますが、その時もよろしくお願い致します。。。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 8 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke