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

請問如何讓工作目錄設定在新增的資料夾

答題得分者是:herbert2
kirei6989
一般會員


發表:16
回覆:13
積分:5
註冊:2011-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-06 16:06:18 IP:122.147.xxx.xxx 訂閱
請問各位大大:
以下是我的程式片斷,主要是要去讓DirectoryListBox在新增資料夾時,就可以讓Current設定到新資料夾,
而不是還停留在新增資料夾的上ㄧ層。
我使用了SetCurrentDir為什麼還是不行呢?是不是我誤解了SetCurrent的意思了。
//-------------------------------------------------------------
AnsiString Fname;
DirectoryListBox1->OpenCurrent();
int D_index = DirectoryListBox1->ItemIndex;
Label1->Caption = DirectoryListBox1->GetItemPath(D_index);
Fname = Label1->Caption;
String InputString = InputBox(" 新增工作目錄", "請輸入工作目錄名稱: ", "");
if (!DirectoryExists(InputString)){
if (CreateDir(InputString)){
D_index=D_index 1;
DirectoryListBox1->Update();
Fname=DirectoryListBox1->GetItemPath(D_index);
SetCurrentDir(Fname);
DirectoryListBox1->OpenCurrent();
DirectoryListBox1->DirLabel = Label1;
}
else
ShowMessage("Cannot create " InputString );
}
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-06 23:17:12 IP:202.39.xxx.xxx 訂閱
  DirectoryListBox1->DirLabel = Label1; // 宜在 FormCreate 便設定

AnsiString Fname;
DirectoryListBox1->OpenCurrent();
int D_index = DirectoryListBox1->ItemIndex;
// Label1->Caption = DirectoryListBox1->GetItemPath(D_index); // 已指定 DirLabel 便自動會 Show
// Fname = Label1->Caption;
String InputString; // AnsiString 勿於宣告時便給值, 避 BCB 之 BUG
InputString = InputBox(" 新增工作目錄", "請輸入工作目錄名稱: ", "");
// 注意: InputString 要區分開頭為 "d:\" 或無 "d:\" 之狀況
if (InputString.SubString(2,1) == ":")
Fname = InputString;
else
Fname = Label1->Caption "\\" InputString;
// if (!DirectoryExists(InputString)){
if (!DirectoryExists(Fname)){
// if (CreateDir(InputString)){
if (CreateDir(Fname)){
// D_index=D_index 1; // 您憑那份文件說新增者之 Index 必然是此值 ?
DirectoryListBox1->Update();
// DirectoryListBox1 的 ItemIndex 不會因新增 Dir 而自動變到新增的 Dir 上
// Fname=DirectoryListBox1->GetItemPath(D_index); // 您會得到反白的那筆, 這是錯誤的寫法
SetCurrentDir(Fname); // 若 Fname 是正確的, 則這句是成功執行的,
// 但因 DirectoryListBox1->ItemIndex 未變動,
// 故您的 Fname 並非是剛新增的那個
String sxStr;
sxStr = ExtractFileName(Fname); // 只能找最右邊的 Dir Name, 故借用 ExtractFileName 將 "d:\dir1\....\" 去掉
D_index = DirectoryListBox1->Items->IndexOf(sxStr);
if (D_index >= 0) {
DirectoryListBox1->ItemIndex = D_index;
DirectoryListBox1->OpenCurrent();
// DirectoryListBox1->DirLabel = Label1; // 改在 FormCreate 時就設定
}
else
ShowMessage("Cannot create " InputString );
}
}
您尚不熟稔 C Builder 的元件的 Property, 則可插入 ShowMessage() 檢查所取得之值,
便能找到您錯誤的地方了.
當然, 用 Break Point 或逐步執行, 檢查各時點各變數的值, 是更佳的 Debug 方式.

編輯記錄
herbert2 重新編輯於 2011-05-06 09:24:16, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-08 04:05:14 IP:122.126.xxx.xxx 訂閱
請教一下herbert2,你說的這bug,我沒聽過或注意過。

如果不能,那這不是小小的bug,算是一個極大的bug。我一直以來使用上都沒遇到問題。

是怎麼一回事呢?

===================引 用 herbert2 文 章===================

String InputString; // AnsiString 勿於宣告時便給值, 避 BCB 之 BUG

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-05-08 08:01:15 IP:202.39.xxx.xxx 訂閱
這是 BCB5 不穩定的問題, 別的版本或許 OK.
因約八年前曾發生莫明的問題, 經與朋有討論, 他在 Google 日文網站找到這方面的討論,
並認定這是 BCB5 的 BUG. 經改成宣告與給值分開後就 OK 了.

另 BCB5 尚有另一狀況: int = (double)int * double 會有意外的結果.
Ex. : int = (double)5 * 1.4 得 6. 但 BCB3, BCB4, BCB6 都得 7.
改成 double = (double)int * double, 再 int = double 就會正確.
iR = (double)5 * 1.4 得 6, nR = (double)5*1.4 = 6.9999..., int iR = nR 得 7.

===================引 用 aftcast 文 章===================
請教一下herbert2,你說的這bug,我沒聽過或注意過。

如果不能,那這不是小小的bug,算是一個極大的bug。我一直以來使用上都沒遇到問題。

是怎麼一回事呢?
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-05-08 14:17:41 IP:122.126.xxx.xxx 訂閱
謝謝,瞭解了!  ^^

你們繼續這個原題目吧,我把問題離題了!


===================引 用 herbert2 文 章===================
這是 BCB5 不穩定的問題, 別的版本或許 OK.
因約八年前曾發生莫明的問題, 經與朋有討論, 他在 Google 日文網站找到這方面的討論,
並認定這是 BCB5 的 BUG. 經改成宣告與給值分開後就 OK 了.

另 BCB5 尚有另一狀況: int = (double)int * double 會有意外的結果.
Ex. : int = (double)5 * 1.4 得 6. 但 BCB3, BCB4, BCB6 都得 7.
改成 double = (double)int * double, 再 int = double 就會正確.
iR = (double)5 * 1.4 得 6, nR = (double)5*1.4 = 6.9999..., int iR = nR 得 7.


------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
kirei6989
一般會員


發表:16
回覆:13
積分:5
註冊:2011-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-05-09 08:48:17 IP:122.147.xxx.xxx 訂閱
感謝herbert2的講解,讓我獲益良多,
我會多多使用您建議的Debug方式,
真的很感謝。
系統時間:2017-10-21 18:17:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!