ctreectrl樹型控制項的確是乙個很複雜的控制項 特別是在vc++6.0中 它基本上完全靠我們手動寫**來完成它的主要功能.無論新手老手 我相信 要重新寫個對ctreectrl的操作 一定要看以前自己寫的**才能完成 因為它的操作並不是完全能記住的.
其中 對控制項中所有節點的操作 是最主要的.遍歷每個節點 取得資訊 這是非常重要的 我有在.net中使用過樹控制項操作很是方便.這裡我將我使用樹控制項的方法寫下來 它雖然不完美 但很完整 完成了從新增到刪除 到儲存到讀取的全部操作過程.它將儲存的結果存於程式目錄下的x.ini檔案中 你可以開啟它來檢視儲存的資訊.這裡不但儲存了重新構造樹結構的資訊也儲存了附加資訊 可以自由修改.最重要的是 這個示例 能夠支援樹結構的任何操作 包括換順序 增加 刪除 這些操作不會影響任何節點的id順序.節點id 也許或許需要重點說一下 它儲存了你構造的樹結構的節點順序 這並不指序號順序如果你另乙個程式讀取了這個結構 引用了序號為2的節點 然後你在程式中 在這個節點之前新增乙個節點的話 這個節點的序號就變成3了等到另乙個程式再讀取的話 就變成引用3了.但在這個示例中 並不是根據序號儲存的 而是另乙個id編號 你可以隨意操作它的順序 位置實際的id並不會改變.
原始碼中已經有非常詳細的注釋 這裡 我主要說下方法.
新增與刪除都是非常簡單的 唯一要說的是 新增的方法 我使用了取最小空值的方法 也就是 迴圈所有節點 取出沒有值的序號 新增的節點就使用那個序號也就是說 如果你之前有4個節點 你刪除了2號節點 你再新增的時候 id就為2 而不是5.儲存的方法與讀取相關聯 所以怎麼儲存決定了如何讀取.儲存的時候我使用了遞迴遍歷所有節點 每個節點需要儲存結構資訊 以便以後讀取重新構造樹結構 否則 你儲存為了檔案如何能還原以前樹的結構?
這裡還儲存了節點名稱 節點序號 節點id(重要).
儲存從這裡開始
uint filesum=0;//列表總數
int layer=1;//層次
querytreenode(m_tree,m_tree.getrootitem(),filesum,layer);
最後還要儲存總數
遞迴儲存m_tree所有節點的操作
void querytreenode(ctreectrl& m_tree,htreeitem htreeitem,uint& filesum,int& layer)
這是我所試驗出最優的儲存結構方法 速度與資訊的全面性也算是較高的.
最存好了結構就像下面這樣的 相信能看懂
[node1]
name=節點序號:1|節點編號id:1
index=1
id=1
layer=1
[node2]
name=節點序號:2|節點編號id:2
index=2
id=2
layer=2
[node3]
name=節點序號:6|節點編號id:6
index=3
id=6
layer=3
[node4]
name=節點序號:7|節點編號id:7
index=4
id=7
layer=4
[node5]
name=節點序號:3|節點編號id:3
index=5
id=3
layer=2
[node6]
name=節點序號:5|節點編號id:5
index=6
id=5
layer=3
[node7]
name=節點序號:8|節點編號id:8
index=7
id=8
layer=3
[node8]
name=節點序號:4|節點編號id:4
index=8
id=4
layer=2
[node9]
name=最後乙個9編號
index=9
id=9
layer=2
[info]
filesum=9
然後就是讀取了
char buff[255];
cstring _layer,strnode,_str;
int currlayer=0;//當前層
int _id=0;
htreeitem m_htreeitem=tvi_root;
//如果在下層
if (_layer>currlayer)
else if (_layer==currlayer)
else if (_layer
m_htreeitem =m_tree.getparentitem(m_htreeitem);
m_htreeitem=m_tree.insertitem(strnode,0,1,m_htreeitem,tvi_last);
m_tree.setitemdata(m_htreeitem,_id);//設定附加資料也就是編號
}儲存遞迴的思路應該是這樣的 傳遞節點物件 如果為空 則表示沒有節點 直接返回 如果有
1.則判斷它接下來是否有子節點 如果有的話 再呼叫遞迴查詢下面的子節點
2.然後子節點又判斷有沒有子子節點 如果有 則重複上面的步驟 如果沒有
3.則執行下面的判斷是否有兄節點 如果有 則遞迴 重複1步驟.
4.如果沒有 則返回剛剛的呼叫 則再執行下面的3步驟判斷兄節點
5.如果沒有 返回上次呼叫
讀取主要是依靠layer來實現的 先讀取節點總數 然後進入迴圈 迴圈所有節點
1.從檔案中讀取第i個記錄 然後判斷這個記錄的層是否大於當前的層(第一層總是0)所以一定大於 更新當前節點物件為新增物件
2.如果等於的話 則在當前節點物件的父節點物件上新增節點 這樣 就是與當前節點為同一級了 再更新當前節點物件為新增物件
3.如果大於的話 則需要尋找到與之對應的層節點物件上 這裡使用迴圈判斷 然後再重複2步驟.
4.完成一次判斷 就返回再從1開始執行
最後還是要說下 下面這些資訊 是我認為必要儲存的 這才是乙個能完成基本功能的結構
name--名稱
index--序號(可以沒有)
id--資料索引支援
layer--讀取結構資訊
-
Python Json儲存與讀取
python 中的檔案資料儲存和讀取可以說是非常方便了,這裡記錄一下 json 資料的儲存和讀取,需要用到的模組就是 json,該模組能夠將簡單的 python 資料結構轉儲到檔案中,並在程式再次執行時載入該檔案中的資料,還可以使用 json 在 python 程式之間分享資料,更重要的是,json...
檔案讀取與儲存
pandas的api支援眾多的檔案格式,如csv sql xls json hdf5。讀取檔案,並且指定只獲取 open close 指標 data pd.read csv data stock day.csv usecols open close hdf5hdf5檔案的讀取和儲存需要指定乙個鍵,值...
csv檔案儲存與讀取
csv是指逗號分隔值檔案格式,是以純文字形式來儲存 資料。1.儲存為csv格式 把要儲存的 中資料,按每一行存成一條記錄,然後將記錄新增到乙個list裡面,寫入檔案的時候將每個記錄轉換成一串逗號分隔的字串,再用遍歷的方法把所有記錄取出來 我是這樣寫的 也可以都存在乙個記錄裡,用換行符來換行,一次寫入...