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

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

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

固定ページ 2 / 2

PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CSVファイルの中に直接HTREEITEMと入れとくなんて事は無理でしょう。
そもそもHTREEITEMはツリーコントロールにアイテムを登録しないと
返ってこない値です。CSVの中だけで完結させようと言う考えは止めた方がいいでしょう。
というか、不可能ですし。
Blueさんが書かれているように内部的にツリーの関係がわかるような記述方法を
しておいて、それを元に解釈しながらツリー構造を構築するしかありません。
なので考え方を変えましょう。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CSVファイルの中に直接HTREEITEMを入れとくなんて事は無理でしょう。
そもそもHTREEITEMはツリーコントロールにアイテムを登録しないと
返ってこない値です。CSVの中だけで完結させようと言う考えは止めた方がいいでしょう。
というか、不可能ですし。
Blueさんが書かれているように内部的にツリーの関係がわかるような記述方法を
しておいて、それを元に解釈しながらツリー構造を構築するしかありません。
なので考え方を変えましょう。


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

/*
* なんかできたー。
*/

void CXXXDlg::BuildTRree()
{

std::string csv =
1,アイテム文字列A,0 \n
2,アイテム文字列B,1 \n
3,アイテム文字列C,2 \n
4,アイテム文字列D,2 \n
5,アイテム文字列E,3 \n;

std::istringstream stream(csv);
std::string line;
std::vector<item> table;
item tmp;
tmp.id = 0;
tmp.handle = tree.GetRootItem();
table.push_back(tmp);
while ( std::getline(stream, line) ) {
char* p = &line[0];
tmp.id = std::atoi(std::strtok(&line[0],,));
tmp.data = std::strtok(0,,);
tmp.parent = std::atoi(std::strtok(0,, ));
tmp.handle = (HTREEITEM)-1;
table.push_back(tmp);
}

bool complete = false;
while ( !complete ) {
complete = true;
for ( int i = 0; i < table.size(); ++i ) {
if ( table[i].handle == (HTREEITEM)-1 ) {
for ( int j = 0; j < table.size(); ++j ) {
if ( table[j].id == table[i].parent && table[j].handle != (HTREEITEM)-
1 ) {
complete = false;
table[i].handle = tree.InsertItem(table[i].data.c_str(), table
[j].handle);
break;
}
}
}
}
}
}


返信引用
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
 

> parentID、childIDの値はCSVに書く場合、固定値でどのようにべきなのでしょうか?
> もしや固定値で書くべきではないのでしょうか?
なにか規則性を持たせれば、出来るかもしれませんが、
解析して、ツリーから探して、追加するとなると、少々面倒のような気もします。
# 私なら後述の手を使います。
例えば)0-0-2 0番目(A)の下の0番目(B)の下の2番目(F)の下に追加(H)
□A、0
∟□B、0-0
| ∟□D、0-0-0
| | ∟□G,0-0-0-0
| ∟□E、0-0-1
| ∟□F、0-0-2
| ∟■H,0-0-2-0
∟□C、0-1

>> CSVテーブル内容
>> ・(1,アイテム文字列A,0)← これは ID が 0 つまり ルート の子
>> ・(2,アイテム文字列B,1)← これは ID が 1 つまり アイテム文字列A の子
> これは親と子をIDで指定するという事ですよね。
> IDに対応したハンドルとかはどうやって設定するのでしょうか?
([自ID],アイテム文字列,[親ID]) として、エラーチェック抜きにすると、
1.CSV 1レコード読み込む
  1.1.[親ID]が0であればルートの下に追加
  1.2.[親ID]が0以外であれば、結び付けられたIDの下に追加
      (ハンドルが配列か何かにあるので、追加できますよね)
2.ツリーに追加すると、そのアイテムのハンドルが得られるので、
  そのハンドルと[自ID]を、配列か何かで結び付けます。
3.CSVの終わりまで1~2の繰り返し

> で言うなら、parentID, childID の値を“(GetFirstVisibleItem や
> GetChildItem といった関数を使わずに) 直接 CSV ファイルから読み込みたい”
> って事ですか?
HTREEITEMの値って、常に同じ値でしょうか?
再度アプリを立ち上げたら、同じ値でしょうか?
別PCでも、同じ値を指しますか?
ということを考えると、CSVファイルからHTREEITEMを読み込むという設計は、
どうなのでしょう?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

すいません、最初に入れた分は間違って入れてしまっているので
無視して次の分を見てください。
投稿ミスをして申し訳ないです。


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

もう少し、気の利いたのに改良。

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

HTREEITEM hTreeItem;
HTREEITEM hParent;
HTREEITEM items[ 50 ];
memset( items, 0, sizeof( items ) );

struct CSVInfo
{
unsigned int ID;
TCHAR Name[ 50 ];
unsigned int Parent;
};

CSVInfo info[] = {
{ 1, _T( 食べ物 ), 0 },
{ 2, _T( 野菜 ) , 1 },
{ 3, _T( 大根 ) , 2 },
{ 4, _T( 人参 ) , 2 },
{ 5, _T( 果物 ) , 1 },
{ 6, _T( メロン ), 5 }
};
CSVInfo temp;

items[ 0 ] = TVI_ROOT;

for ( int i = 0; i < sizeof( info ) / sizeof( info[ 0 ] ); i++ )
{
temp = info[ i ];
hParent = items[ temp.Parent ];
hTreeItem = this->m_tree.InsertItem( temp.Name, hParent );
items[ temp.ID ] = hTreeItem;
}
}


返信引用
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
 

>> parentID、childIDの値はCSVに書く場合、固定値でどのようにべきなのでしょうか?
>> もしや固定値で書くべきではないのでしょうか?
>なにか規則性を持たせれば、出来るかもしれませんが、
>解析して、ツリーから探して、追加するとなると、少々面倒のような気もします。
># 私なら後述の手を使います。
>例えば)0-0-2 0番目(A)の下の0番目(B)の下の2番目(F)の下に追加(H)
>□A、0
>∟□B、0-0
>| ∟□D、0-0-0
>| | ∟□G,0-0-0-0
>| ∟□E、0-0-1
>| ∟□F、0-0-2
>| ∟■H,0-0-2-0
>∟□C、0-1
ごめんなさい、ちょっと勘違いしてました。
上記は無しで;;


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

>Blueさん
返信ありがとうございます。
私が実現じたかったことはまさにこれです。
上記のように考えればよかったんですね。

> CSVInfo info[] = {
> { 1, _T( 食べ物 ), 0 },
> { 2, _T( 野菜 ) , 1 },
> { 3, _T( 大根 ) , 2 },
> { 4, _T( 人参 ) , 2 },
> { 5, _T( 果物 ) , 1 },
> { 6, _T( メロン ), 5 }
> };
CSVのデータ取得する際、このように書けることをしりませんでした。
テストをする際に、大変参考になりました。
SCVの参照にここを参考にしてました。
http://rararahp.cool.ne.jp/vc/class/csvfile.htm
本当にりがとうございます。

>PATIOさん
返信ありがとうございます。
>CSVファイルの中に直接HTREEITEMと入れとくなんて事は無理でしょう。
>そもそもHTREEITEMはツリーコントロールにアイテムを登録しないと
>返ってこない値です。CSVの中だけで完結させようと言う考えは止めた方がいいでしょう。
>というか、不可能ですし。
不可能だとは知りませんでした。
何でもどうにかすればできると思ってました。お恥ずかしい限りです。
私もBlueさんのものを参照し、理解ができました。
今後ともよろしくお願いします。

>επιστημηさん
返信ありがとうございます。
このようなソースの考え方もあるんですね。
上記のサンプルは自分がまだ使ったことのない書き方がしるされており、
解読するのに時間がかかってしまいました。
昨日同様、今後ともよろしくお願いします。
ありがとうございました。

>三草さん
返信ありがとうございます。
私もどうようの考え方をしてまし。
(x、y)を指定することにより、
なんとかアイテムの作成場所を指定できないかと。
例えば弟を指定する時はxを+1、子を指定するときはyを+1とかです。
でもアイテムが必ず重複してしまうんですよね。
それに悩んだのもあってここに書き込みしたんです。
ありがとうございました。
今後ともご教授お願いします。


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

以上で問題は解決できました。
今後ともよろしくお願いします。
皆様、本当にありがとうございました。

敬具


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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