ツリーコントロールで指定した場所にアイテムを追加する方法 – プログラミング – Home

ツリーコントロールで指定した場所にアイ...
 
通知
すべてクリア

[解決済] ツリーコントロールで指定した場所にアイテムを追加する方法

固定ページ 1 / 2

こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
Topic starter  

環境
OS:WIN2000
VC++.NET

度々お世話になります。

エクスプローラの画面上でアイテムを選択しなくても、
引数を与える事により、
引数で指定の場所にアイテムを追加する方法を考えています。

選択した後ならGetSelectedItemを使えますが、
今回は選択せずに引数を用いて追加します。

どう考えればいいのかが思いつかないので、
どなたかご教授お願いします。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

なにが問題なのかわかりません。

「階層リストをすべて展開する方法」
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200607/06070034.txt

で、GetRootItem,GetChildItem,GetNextItem によって
すべてのitemを辿ることができたじゃないですか。

「どう考えればいいのかが思いつかない」とは如何なる意味ですか?


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
Topic starter  

>επιστημηさん
返信ありがとうございます。

私が今やろうとしているのはCSVファイルからデータを読み込み、
それを元にツリーを作ろうとしています。
今の疑問は、どんな引数でもらえばいいかです。

何もない状態からツリーを作成していくとき、
その引数を基に作成していきます。
例を以下に示します。

例:
以下のデータを基にツリーを作成する。
CSVテーブル内容
・(アイテム文字列A,作成場所1)
・(アイテム文字列B,作成場所2)
・(アイテム文字列C,作成場所3)
・(アイテム文字列D,作成場所4)
・(アイテム文字列E,作成場所5)

ツリー
□A、1
∟□B、2
 ∟□C、3
 | ∟□E,5
 ∟□D、4

この様にファイルを基にツリーを作成するにあたり、
どうやって作成場所を指定すればいいのかがわからないのです。
もしこれを直書きで作成すると以下のようにするしかありません。

HTREEITEM htree;
HTREEITEM htree1;
HTREEITEM htree2;
HTREEITEM htree3;
htree = m_CtrlTree.InsertItem( csData, TVI_ROOT, TVI_LAST);

// 一階層したのアイテムの追加
htree1 = m_CtrlTree.InsertItem( subroot, htree, TVI_LAST);
htree2 = m_CtrlTree.InsertItem( subroot, htree1, TVI_LAST);
htree3 = m_CtrlTree.InsertItem( subroot, htree2, TVI_LAST);

// 一階層したのアイテムの追加
htree1_1 = m_CtrlTree.InsertItem( subroot, htree1, TVI_LAST);

このように先頭を基準に作成していくことはできます。
しかしファイルを読み込む際、
CSVのファイルをどういう引数にするべきなのかがわかりません。

私が何がわからないかわかっていただけたでしょうか。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

単に親を指定するだけじゃダメでしょうか?

CSVテーブル内容
・(1,アイテム文字列A,0)
・(2,アイテム文字列B,1)
・(3,アイテム文字列C,2)
・(4,アイテム文字列D,2)
・(5,アイテム文字列E,3)

みたいな。
※(ID,文字列,親のID)


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
Topic starter  

>Blueさん
返信ありがとうございます。

>※(ID,文字列,親のID)
とありますが、一番左のIDはこのハンドルのことでしょうか。
仮にだとすればどうやってファイルに個々ハンドルが決定できるのでしょうか。


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
Topic starter  

>とありますが、一番左のIDはこのハンドルのことでしょうか。
「このハンドル」ではなく、「子のハンドル」です。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 一番左のIDはこのハンドルのことでしょうか。
違いますよ。単にこのアイテムはどの親の子か示すための一意な番号です。
一意なら何でもよいのですが、わかりやすく1から昇順にしただけです。

CSVテーブル内容
・(1,アイテム文字列A,0)← これは ID が 0 つまり ルート の子
・(2,アイテム文字列B,1)← これは ID が 1 つまり アイテム文字列A の子
・(3,アイテム文字列C,2)
・(4,アイテム文字列D,2)
・(5,アイテム文字列E,3)

# CSVだからこんな構造にしないといけないわけなんだろうな。。
# もともとXMLのようなツリー構造を持っていれば簡単なんだろうか。


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
Topic starter  

>Blueさん
返信ありがとうございます。

>CSVテーブル内容
>・(1,アイテム文字列A,0)← これは ID が 0 つまり ルート の子
>・(2,アイテム文字列B,1)← これは ID が 1 つまり アイテム文字列A の子
これは親と子をIDで指定するという事ですよね。
IDに対応したハンドルとかはどうやって設定するのでしょうか?

parentID、childIDの値はCSVに書く場合、固定値でどのようにべきなのでしょうか?
もしや固定値で書くべきではないのでしょうか?
ご教授お願いします。

現在CSVのデータを作成するとしたら、
子はどんな値にすればいいのでしょうか。
以下は全て直書きの例です。

void CMGLDlg::OnBnClickedBtnaddcsv()
{
// 以下は簡易テストデータ
// 本来はこのCSVテストデータが大量にある
 CString csData = test1; // アイテム名(文字列)
 HTREEITEM parentID = m_CtrlTree.GetFirstVisibleItem(); // 親のハンドル
 HTREEITEM childID = m_CtrlTree.GetChildItem(parentID); // 子のハンドル

// ツリーにアイテム追加
 Insert( childID, parentID, csData );
}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

ちょっと確認してもよいでしょうか?

ツリーは何もないところから作っていくんですよね?
既存のツリーにCSVのデータを追加するってことではなく。
(↑この場合うまい方法は浮かびません)


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 私が今やろうとしているのはCSVファイルからデータを読み込み、
> それを元にツリーを作ろうとしています。
> 今の疑問は、どんな引数でもらえばいいかです。

…タイトル下手すぎ。

ツリーコントロールとは何の関係もなく、
「木構造をCSVで表現するには?」
ってことやんか。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> □A、1
> ∟□B、2
> ∟□C、3
> | ∟□E,5
> ∟□D、4

CSVでなくちゃダメ?
XMLならそのものヅバリの木構造が表現できるのに。

<?xml version='1.0' ?>
<item name='A'>
<item name='B'>
<item name='C'>
<item name='E' />
<item name='D' />
</item>
</item>


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
Topic starter  

>Blueさん
返信ありがとうございます。
ツリーは何もないところから作成していきます。
勘違いされるような記述をして申し訳ありません。

>επιστημηさん
返信ありがとうございます。
現状ではCSVで作成されるデータをVC側でツリーにするという仕様になっています。
そのためにCSVがどのような値を設定すればいいのかがわかりません。
それはVC側でどのような値が必要なのか、私自身が理解できてないからです。

本当に申し訳ございません。
何卒、ご教授お願いします。


返信引用
Geo=TK3
 Geo=TK3
(@Geo=TK3)
ゲスト
結合: 19年前
投稿: 6
 

横槍失礼します。

>それはVC側でどのような値が必要なのか、私自身が理解できてないからです。

要するにこうさんのやりたい事は以前提示してくれたサンプルの

>void CMGLDlg::OnBnClickedBtnaddcsv()
>{
>// 以下は簡易テストデータ
>// 本来はこのCSVテストデータが大量にある
> CString csData = test1; // アイテム名(文字
列)
> HTREEITEM parentID = m_CtrlTree.GetFirstVisibleItem(); // 親のハンドル
> HTREEITEM childID = m_CtrlTree.GetChildItem(parentID); // 子のハンドル
>
>// ツリーにアイテム追加
> Insert( childID, parentID, csData );
>}

で言うなら、parentID, childID の値を“(GetFirstVisibleItem や GetChildItem とい
った関数を使わずに) 直接 CSV ファイルから読み込みたい”って事ですか?


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
Topic starter  

>Geo=TK3さん
返信ありがとうございます。

解釈ありががとうございます。
まさにその通りです。
それを実現させるにはどうすればいいのかがわからないのです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

一応先に示したCSV形式のサンプル
※ファイルを読み込んだりカンマで分割するとかそういうことは
 省略してあります。

Tree
□食べ物
 |
 □野菜
 │├大根
 │└人参
 □果物
  └メロン

csv
(1,食べ物,0)
(2,野菜,1)
(3,大根,2)
(4,人参,2)
(5,果物,1)
(6,メロン,5)

ソース
void CTreeTestDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
this->m_tree.DeleteAllItems();

HTREEITEM hTreeItem;
HTREEITEM hParent;
HTREEITEM items[ 50 ]; // 適当。動的にしたいならばCArray、CMapとか。
memset( items, 0, sizeof( items ) );

items[ 0 ] = TVI_ROOT;

// (1,食べ物,0)
hParent = items[ 0 ];
hTreeItem = this->m_tree.InsertItem( _T( 食べ物 ), hParent );
items[ 1 ] = hTreeItem;

// (2,野菜,1)
hParent = items[ 1 ];
hTreeItem = this->m_tree.InsertItem( _T( 野菜 ), hParent );
items[ 2 ] = hTreeItem;

// (3,大根,2)
hParent = items[ 2 ];
hTreeItem = this->m_tree.InsertItem( _T( 大根 ), hParent );
items[ 3 ] = hTreeItem;

// (4,人参,2)
hParent = items[ 2 ];
hTreeItem = this->m_tree.InsertItem( _T( 人参 ), hParent );
items[ 4 ] = hTreeItem;

// (5,果物,1)
hParent = items[ 1 ];
hTreeItem = this->m_tree.InsertItem( _T( 果物 ), hParent );
items[ 5 ] = hTreeItem;

// (6,メロン,5)
hParent = items[ 5 ];
hTreeItem = this->m_tree.InsertItem( _T( メロン ), hParent );
items[ 6 ] = hTreeItem;
}


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました