TShellTreeView與TShellListView如何排序? |
尚未結案
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
我用的是 BCB-6,
想請問大家的是,我要如何設定TShellTreeView是升冪排序呢?
(就像檔案總管一樣)
現在它的預設是降冪哩~ 另外還想請問關於 TShellListView
我有設定 sort 為 true 了,style 是 icon,
可是它顯示的方式卻是有時升冪有時亂排 ....
要如何讓它依一定的方式排序呢 ? 最後,有什麼辦法能限制 TShellListView 只顯示出特定副檔名的檔案嗎? --
http://www.csie.nctu.edu.tw/~chtai/software.html
好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。
若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
剛剛找到 TShell* 元件了
他的排序分別使用 ListSortFunc 和 TreeSortFunc 兩個函式 分別在 shellctrls.cpp lines:3671,2601
看起來是沒有機會在外面重新指定排序的機制,只能在 shellctrls.cpp 裡面直接修改這兩個函式了 至於你要只顯示特定檔名的檔案
則請新增一個OnAddFolder 事件
假若判斷不是你要的檔案,就把 CanAdd 設定成 false 另外有關於TShellTreeView 排序的問題...
若你要更改排序的方式,則請修改 TreeSortFunc 傳回值給他加個負號,如
return -(sfFirst->ParentShellFolder()->CompareIDs(0,
sfFirst->RelativeID, sfSecond->RelativeID));
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 另外有關於TShellTreeView 排序的問題... 若你要更改排序的方式,則請修改 TreeSortFunc 傳回值給他加個負號,如 return -(sfFirst->ParentShellFolder()->CompareIDs(0, sfFirst->RelativeID, sfSecond->RelativeID));感謝justdo大哥, 我照著做之後,Tree的確排序正常了, 可是我照著去改 ListSortFunc 跟 CumboSortFunc 卻失敗了哩~ 它們還是依奇怪的順序排列。 ps: 我覺得它 ListSortFunc 有可能有打錯,所以把 if( sfFirst && sfFirst ) 改成 if( sfFirst && sfSecond ) 了 -- http://www.csie.nctu.edu.tw/~chtai/software.html 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 另外有關於TShellTreeView 排序的問題... 若你要更改排序的方式,則請修改 TreeSortFunc 傳回值給他加個負號,如 return -(sfFirst->ParentShellFolder()->CompareIDs(0, sfFirst->RelativeID, sfSecond->RelativeID));感謝justdo大哥, 我照著做之後,Tree的確排序正常了, 可是我照著去改 ListSortFunc 跟 CumboSortFunc 卻失敗了哩~ 它們還是依奇怪的順序排列。 要怎麼改才能也讓它們正確排序呢? ps: 我覺得它 ListSortFunc 有可能有打錯,所以把 if( sfFirst && sfFirst ) 改成 if( sfFirst && sfSecond ) 了 -- http://www.csie.nctu.edu.tw/~chtai/software.html 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 我也是覺得他寫錯了,不過這並不影響程式的使用 可以把你修改後的 *SortFunc 貼上來嗎? 另外,你修改完後,有重新安裝 package 嗎?要記得重新安裝喔我每次改過都有重裝,但還是不起作用,以下是code int __fastcall ListSortFunc(void *Item1, void *Item2) { TShellFolder* sfFirst = (TShellFolder*)Item1; TShellFolder* sfSecond = (TShellFolder*)Item2; int res = 0; if (sfFirst && sfSecond) { res = (int)sfFirst->IsFolder() - (int)sfSecond->IsFolder(); if (res == 0 && sfFirst->ParentShellFolder()) res = -(sfFirst->ParentShellFolder()->CompareIDs(0, sfFirst->RelativeID, sfSecond->RelativeID)); } return res; } int __fastcall ComboSortFunc(void *Item1, void *Item2) { if (CompareFolder) return -(CompareFolder->ShellFolder->CompareIDs(0, (ITEMIDLIST*)Item1, (ITEMIDLIST*)Item2)); else return 0; } int CALLBACK TreeSortFunc(LPARAM Node1, LPARAM Node2, LPARAM lParam) { if (Node1 && Node2) { TShellFolder* sfFirst = (TShellFolder*)((TTreeNode*)Node1)->Data; TShellFolder* sfSecond = (TShellFolder*)((TTreeNode*)Node2)->Data; return -(sfFirst->ParentShellFolder()->CompareIDs(0, sfFirst->RelativeID, sfSecond->RelativeID)); } else return 0; }另外關於您之前提的,在OnAddFolder事件裡頭判斷是否是自己要的檔案類型 想請問的是,要怎麼判斷然後讓ListView秀出來呢? (目前小弟是想用一個 Filter 來配合。) -- http://www.csie.nctu.edu.tw/~chtai/software.html 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
ShellListView 有個屬性 Sorted 要設定成 true
ShellListView 才會排序 至於 ShellComboBox ,ComboSortFunc 要求在ParentFolder存在的情況下才會排序,所以你檢查看看比較底層的目錄排序是否有改變好了 至於他使用的 CompareIDs 是比較什麼東西,很抱歉,我追程式追不出來
只查到是個 COM 物件,這已經超出我的能力.. XD
有請高手們出來查查囉 class="code">
void __fastcall TMainForm::ShellListView1AddFolder(TObject *Sender,
TShellFolder *AFolder, bool &CanAdd)
{
AnsiString name=AFolder->DisplayName();
if (ExtractFileExt(name).LowerCase() == AnsiString(".txt"))
CanAdd = true;
else
CanAdd = false;
}
基本上對於不知道使用方法的類別有幾個處理辦法
一是在他的宣告型態上面按滑鼠右鍵,去找他定義的地方
例如在 TShellFolder 的頭上
二是在變數的後方打 . 或 -> 會出現使用方法
例如 AFolder-> 就會列出可用的指令
找找看哪幾個指令可能是你需要的,在一個個試試看就行了 發表人 - justdo 於 2004/08/29 00:11:55 發表人 - justdo 於 2004/08/29 00:20:50
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: ShellListView 有個屬性 Sorted 要設定成 true ShellListView 才會排序只是它的排序似乎還是有些怪怪的, 好像不能依類型再依名稱排序, 所以會看到資料夾跟檔案排在一起。 真可惜。 引言: 至於 ShellComboBox ,ComboSortFunc 要求在ParentFolder存在的情況下才會排序,所以你檢查看看比較底層的目錄排序是否有改變好了比較底層? 是指磁碟機嗎? 沒有哩~~ 引言: ShellListView 只要顯示 .txt 檔的範例太感謝了~這對我很有幫助 ^^ -- http://www.csie.nctu.edu.tw/~chtai/software.html 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)void __fastcall TMainForm::ShellListView1AddFolder(TObject *Sender, TShellFolder *AFolder, bool &CanAdd) { AnsiString name=AFolder->DisplayName(); if (ExtractFileExt(name).LowerCase() == AnsiString(".txt")) CanAdd = true; else CanAdd = false; }
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
我嘗試了一下,ShellListView 排序的時候是把目錄排在後面.. 真是奇怪
你可以把 ListSortFunc改成下面的樣子
改以檔名來當排序的依據
int __fastcall ListSortFunc(void *Item1, void *Item2) { TShellFolder* sfFirst = (TShellFolder*)Item1; TShellFolder* sfSecond = (TShellFolder*)Item2; int res = 0; if (sfFirst && sfSecond) { res = -((int)sfFirst->IsFolder() - (int)sfSecond->IsFolder()); if (res == 0 && sfFirst->ParentShellFolder()) //res = sfFirst->ParentShellFolder()->CompareIDs(0, sfFirst->RelativeID, sfSecond->RelativeID); res = sfFirst->DisplayName().AnsiCompare(sfSecond->DisplayName()); } return res; }另外一件奇怪的事: 我叫出ShellControlDemo project,在預覽的畫面上看到的是正確的 可是執行後卻還是出現以前的排序畫面... 最後重新弄了一個project才正常 (圖檔不知道怎麼弄上來 @@) ComboSortFunc可以比照辦理 |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言:一直麻煩你真是不好意思,很感謝你願意不厭其煩的回答呢~ 不過,小弟又有問題了 ^^" 依照你修改過的code來跑,排序看起來正常多了, 可是它似乎不能把系統的東西放在前頭哩~ (就像是Tree一樣,它會把系統資料夾排在前面) 另外,小弟不才,猜不透要如何對ComboSortFunc比照辦理 >"< -- http://www.csie.nctu.edu.tw/~chtai/software.html 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)int __fastcall ListSortFunc(void *Item1, void *Item2) { TShellFolder* sfFirst = (TShellFolder*)Item1; TShellFolder* sfSecond = (TShellFolder*)Item2; int res = 0; if (sfFirst && sfSecond) { res = -((int)sfFirst->IsFolder() - (int)sfSecond->IsFolder()); if (res == 0 && sfFirst->ParentShellFolder()) //res = sfFirst->ParentShellFolder()->CompareIDs(0, sfFirst->RelativeID, sfSecond->RelativeID); res = sfFirst->DisplayName().AnsiCompare(sfSecond->DisplayName()); } return res; }ComboSortFunc可以比照辦理
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
原本的設計是用 RelativeID 來排序的
所以系統目錄會排在前面,非系統目錄會亂排一通 改成用名字排序之後(就是我改出來的code)
所有的目錄會一起排... 因為查不到 RelativeID 的資料
所以我不知道怎麼把這兩個辦法整合在一起,你自己看著辦好了 ^^" 至於 ComboSortFunc
他現在也是使用 RelativeID 來排序的
你可以參照 ListSortFunc 我修改成用檔名來排序的方式來進行修改
但還是會面臨相同的問題
就是系統目錄跟非系統目錄還是會混在一起
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
引言: 原本的設計是用 RelativeID 來排序的 所以系統目錄會排在前面,非系統目錄會亂排一通 改成用名字排序之後(就是我改出來的code) 所有的目錄會一起排... 因為查不到 RelativeID 的資料 所以我不知道怎麼把這兩個辦法整合在一起,你自己看著辦好了 ^^"好吧~~謝謝你 :) -- http://www.csie.nctu.edu.tw/~chtai/software.html 好用免費軟體的收集網頁,歡迎大家跟我分享或一同推廣免費軟體。 若您覺得這網頁不錯,也歡迎您將它傳出去 :)
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |