線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3050
推到 Plurk!
推到 Facebook!

TShellTreeView與TShellListView如何排序?

尚未結案
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-06 14:43:19 IP:140.113.xxx.xxx 未訂閱
我用的是 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-24 23:41:45 IP:221.169.xxx.xxx 未訂閱
我在BCB6找不到 TShellTreeView 元件... 只好假設他是繼承 TCustomTreeView 的~  他的
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-25 11:10:23 IP:221.169.xxx.xxx 未訂閱
剛剛找到 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-26 22:49:03 IP:140.113.xxx.xxx 未訂閱
引言: 另外有關於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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-26 22:49:41 IP:140.113.xxx.xxx 未訂閱
引言: 另外有關於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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-27 07:16:16 IP:221.169.xxx.xxx 未訂閱
我也是覺得他寫錯了,不過這並不影響程式的使用 可以把你修改後的 *SortFunc 貼上來嗎? 另外,你修改完後,有重新安裝 package 嗎?要記得重新安裝喔
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-27 22:46:25 IP:140.113.xxx.xxx 未訂閱
引言: 我也是覺得他寫錯了,不過這並不影響程式的使用 可以把你修改後的 *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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-29 00:04:13 IP:221.169.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-29 03:27:55 IP:140.113.xxx.xxx 未訂閱
引言: ShellListView 有個屬性 Sorted 要設定成 true ShellListView 才會排序
只是它的排序似乎還是有些怪怪的, 好像不能依類型再依名稱排序, 所以會看到資料夾跟檔案排在一起。 真可惜。
引言: 至於 ShellComboBox ,ComboSortFunc 要求在ParentFolder存在的情況下才會排序,所以你檢查看看比較底層的目錄排序是否有改變好了
比較底層? 是指磁碟機嗎? 沒有哩~~
引言: ShellListView 只要顯示 .txt 檔的範例
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;
}
太感謝了~這對我很有幫助 ^^ -- 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-29 11:04:35 IP:221.169.xxx.xxx 未訂閱
我嘗試了一下,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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-29 13:25:26 IP:140.113.xxx.xxx 未訂閱
引言:
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可以比照辦理
一直麻煩你真是不好意思,很感謝你願意不厭其煩的回答呢~ 不過,小弟又有問題了 ^^" 依照你修改過的code來跑,排序看起來正常多了, 可是它似乎不能把系統的東西放在前頭哩~ (就像是Tree一樣,它會把系統資料夾排在前面) 另外,小弟不才,猜不透要如何對ComboSortFunc比照辦理 >"< -- 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-29 15:36:41 IP:221.169.xxx.xxx 未訂閱
原本的設計是用 RelativeID 來排序的 所以系統目錄會排在前面,非系統目錄會亂排一通 改成用名字排序之後(就是我改出來的code) 所有的目錄會一起排... 因為查不到 RelativeID 的資料 所以我不知道怎麼把這兩個辦法整合在一起,你自己看著辦好了 ^^" 至於 ComboSortFunc 他現在也是使用 RelativeID 來排序的 你可以參照 ListSortFunc 我修改成用檔名來排序的方式來進行修改 但還是會面臨相同的問題 就是系統目錄跟非系統目錄還是會混在一起
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-29 17:29:23 IP:140.113.xxx.xxx 未訂閱
引言: 原本的設計是用 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
系統時間:2024-11-25 16:54:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!