ab.com コミュニティ https://www.activebasic.com/forum/ |
|
Treeviewラベルの変更 https://www.activebasic.com/forum/viewtopic.php?t=4566 |
ページ 1 / 1 |
作成者: | 水波形 [ 2014年8月11日(月) 23:07 ] |
記事の件名: | Treeviewラベルの変更 |
お世話になっております、水波形です。 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に関してご質問されてないみたいですが、やはりあまり使わないものなのでしょうか^^; ううん、難しい!! ご存じの方がいらっしゃいましたら、ご教授お願いします |
作成者: | たかせ [ 2014年8月25日(月) 12:55 ] |
記事の件名: | Re: Treeviewラベルの変更 |
>TreeViewって、何でこんなに面倒…難しいのでしょうか。 >みなさんあまりTreeviewに関してご質問されてないみたいですが、やはりあまり使わないものなのでしょうか^^; >ううん、難しい!! たしかにTreeviewは難しいですね。 私はまったくわからないのでTreeviewのプログラム作成したことがないのです。 それはそれとしてGetSelectNodeHandle関数をYahoo検索しましたが表示されませんでした。 これはWin32 APIにある関数ですか? それとSendMessage(GetSelectNodeHandle(),WM_GETTEXT,255,buf)を SendMessage(hEditing,WM_GETTEXT,255,buf)にしたほうがよいのでは。 つまり編集開始時に取得した該当ノードのハンドルをそのまま引用することです。 念のためSendMessage関数の結果を確認してみてください。 よろしくお願いします。 |
作成者: | 水波形 [ 2014年8月26日(火) 05:43 ] |
記事の件名: | Re: Treeviewラベルの変更 |
たかせ様 ご返信有難うございます。 引用: それはそれとして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 |
作成者: | kobo [ 2014年8月27日(水) 20:33 ] |
記事の件名: | Re: Treeviewラベルの変更 |
昔の資料集みたいなのです。 昔のどなたかが作られたもので、今でも使っていますが どこにも公開されていないようで、他の質問に公開しても いいよ的なことがかいてあったので、こっそり知人が借りてる サーバーに置いてもらいました。怒られたら引っ込めます。 http://book.geocities.jp/kinkokinko2/BackSearchAB.zip ここからDL、解凍してください。 カスペでチェック済みですが確認してご利用ください。 |
作成者: | kobo [ 2014年8月27日(水) 21:10 ] |
記事の件名: | Re: Treeviewラベルの変更 |
初めにツリービューの知識はありません。 ですががんばって考えてみました。 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()で数値が帰ってきているかも確認が必要かとおもいます。 |
作成者: | 水波形 [ 2014年10月16日(木) 02:09 ] |
記事の件名: | Re: Treeviewラベルの変更 |
>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()では値はしっかりと返ってきています。 よろしくお願いいたします。 |
作成者: | kobo [ 2014年10月29日(水) 18:16 ] |
記事の件名: | Re: Treeviewラベルの変更 |
こんにちは。 色々な方のコードを切り張りしました。 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 |
作成者: | 水波形 [ 2015年2月22日(日) 20:21 ] |
記事の件名: | Re: Treeviewラベルの変更 |
koto様 お返事かなり遅くなってしまい、申し訳ありません。 院試と卒業発表も漸く終わり、次は学会発表でバタバタしております…… さて、頂いたコードなのですが、うまく動作いたしました! 本当に有難うございます!! コード: Type TVDISPINFO hdr As NMHDR item As TVITEM End Type Sub MainWnd_Notify(ByRef sEdit As TVDISPINFO)こんなことしちゃっていいんですね……知りませんでした。 というか、hdrに、今までのデータが何故ちゃんと入っているのかが謎です^^; 何はともあれ、次はドラッグアンドドロップでツリーを動かす方法をお聞きすると思いますが、その時もよろしくお願い致します。。。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |