全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2057
推到 Plurk!
推到 Facebook!

要如何在程式中擷取這樣的錯誤訊息(問題中有圖示)?

答題得分者是:ken0127
sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-09-26 17:04:21 IP:61.61.xxx.xxx 訂閱


如上圖,其實這是我同一個project的問題,因為我要用到多合一讀卡機
所以我想利用這個錯誤訊息,然後判斷user現在是用到的哪一種記憶卡
只是我不是很清楚這個錯誤訊息要怎麼抓?

還是前輩們有更好得方法,還請各位前輩給些指點
感謝~~~~


sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-09-27 15:25:25 IP:59.105.xxx.xxx 訂閱
圖片就是我目前從讀卡機的SD卡插槽讀取出來的影像
並把他秀在image元件



我是用下面的程式碼寫出來的:

[code cpp]
#include //for chdir()
#include //for SelectDirectory()
#include
#include
#include

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Memo1->Clear();
Img_Count=0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::DirFiles(AnsiString RootDir, bool chkSubDir, bool incPath)
{
//TODO: Add your source code here
chdir(RootDir.c_str()); // 切換到指定目錄去
TSearchRec Sr; // 設Sr為存放檔案資訊的結構變數
AnsiString FileName; // 設定檔案名稱之用的暫存變數

TImage *Img;
int done = FindFirst("*.*", faDirectory | faAnyFile, Sr);
while (done == 0)
{
if (!(Sr.Attr & faDirectory)) // 如果是檔案
{
if (incPath) // 如果檔名要包含路徑資料在內
{
char curdir[MAXPATH 1];
GetCurrentDirectory(MAXPATH, curdir); // 取得現行目錄名稱
FileName = AnsiString(curdir) "\\" Sr.Name; // 設定含路徑的檔名
}
else
FileName = Sr.Name; // 設定不含路徑的檔名

Img_Count ;
Img = (TImage*)Form1->FindComponent("Image" AnsiString(Img_Count));
if((ExtractFileExt(FileName) == ".jpg") || (ExtractFileExt(FileName) == ".JPG") )
{
TJPEGImage *jp = new TJPEGImage;
jp->LoadFromFile(FileName);
Img->Picture->Bitmap->Assign(jp);
delete jp;
}
else
Img->Picture->Bitmap->LoadFromFile(FileName);

Application->ProcessMessages();
Memo1->Lines->Add(FileName); // 此處設置您自己要處理的動作
}
else if(chkSubDir) // 如果要檢查次目錄內的檔案
{
if (Sr.Name != "." && Sr.Name != "..") // 如果不是相對目錄代碼的話
{
DirFiles(Sr.Name.c_str(), true, incPath); // 如果是目錄的話就遞迴處理
chdir(String("..").c_str()); // 切換回前一層目錄
}
}
done = FindNext(Sr); // 找目錄中的下一個檔案
}

FindClose(Sr);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
LPTSTR lpBuffer;
DWORD dwDeviceCnt;
DWORD SecPerCls,BytesPerSec,NumOfFreeCls,TotalNumOfCls;
double DiskSpace;
dwDeviceCnt = GetLogicalDriveStrings(0, lpBuffer); //讀到字串的大小

if(dwDeviceCnt)
{
char *buf = new char[dwDeviceCnt];
GetLogicalDriveStrings(dwDeviceCnt, buf);
for(DWORD idx=0; idx<(dwDeviceCnt-1); idx)
{
if(buf[idx]==0)
buf[idx] =' ';
}

AnsiString sDevice=buf;
while(!sDevice.IsEmpty())
{
sDevice.Delete(1,sDevice.Pos(" "));
vStrDevice.push_back(sDevice.SubString(1,sDevice.Pos(" ")-1));
}

int flag=0;
TEdit *Edt;
AnsiString Dir;
for(int idx=0; idx {
switch(GetDriveType(vStrDevice[idx].c_str()))
{
case DRIVE_REMOVABLE:
flag ;
Edt = (TEdit*)Form1->FindComponent("Edit" AnsiString(flag));
Dir = vStrDevice[idx]; //這個就是可移除的裝置,例如:usb的磁碟機,軟碟機等
Edt->Text = Dir;
bool CheckSubDirectory = true; // 取得檔案名稱時是否要檢查次目錄內的檔案?
bool NameIncludePath = true; // 取得檔案名稱時是否要包含路徑名稱?
if(Dir=="D:\\")
DirFiles(Dir, CheckSubDirectory, NameIncludePath);

break;
}
}

delete buf;
}

}

[/code]


不過我現在的問題是:
如果我去讀取沒有插卡的卡槽時,
就會出現下面這個狀況:



因為我現在是用GetDriveType去取得所有REMOVEABLE TYPE的磁碟,
也不能確定使用者是用CF卡或是SD卡等等,
所以我必須每個REMOVEABLE TYPE的磁碟都去拜訪,
然後把裡面的影像秀出來,
但是就會出現像上圖這樣錯誤,
不知道前輩們有沒有解決的辦法?

拜託了~~~~




sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-09-29 16:37:18 IP:61.61.xxx.xxx 訂閱

這個問題不知道是不是無解呢?
還是說有另外一種方式,
就是說當我們隨身碟插上去時,
Windows不是會跳出一個對話框,
問你是要打開資料夾還是檔案等等,
是不是有這種API可以擷取這個訊息,
這樣子就可以知道使用者是插入那個插槽...

不知道是不是有人可以跟我討論一下,
難道都沒有人有類似的經驗嗎?
我也一直都把我實作的過程以及心得分享給大家
我拿去Win32 API那邊問也被刪掉了
我知道這是屬於週邊設計的範圍
可是這也應該是需要利用Win32 API去解決的問題
所以才想說去那邊問問看...

真的拜託各位前輩幫幫忙!
sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-10-03 02:10:11 IP:221.169.xxx.xxx 訂閱
試了好久,好像有解了,
似乎可以用GetDiskFreeSpace來避掉這個問題,
因為沒有插卡的卡槽,其空間當然是0

所以可以用GetDiskFreeSpace來判斷
不過之前記得好像也有試過,也是會出現一樣的問題,
可是今天重新試了一次,似乎是可行,

明天再來試試看!
雖然沒有人跟我討論或是解答
但是還是感謝各位前輩,以及這裡豐富的資源~



sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-10-04 21:28:35 IP:221.169.xxx.xxx 訂閱
Ok, function, GetDiskFreeSpace, can't work.
So I had ever used "try catch" to catch error message, but I don't know why I can't get any message.
even if catch(...), no error message can be got.

So, I had used the function, SetErrorMode, it finally solved my trouble.

Ok, let's cancel this issue.
ken0127
一般會員


發表:3
回覆:9
積分:7
註冊:2009-09-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-01-13 15:26:45 IP:211.74.xxx.xxx 訂閱
小弟其實也不知道要如何顯示像樓主所需要的訊息框
不過今天拜讀過樓主的程式碼,找了一下站上資料後
在下面加入那段程式碼
可擋掉讀入未插卡之磁區
至於訊息框…另一個方法就是在else的地方加上跳出一個form …土法煉鋼一下.....

ps:您的image顯示方法好神呀~~~只是好像有圖片數目的限制厚= =
[code cpp]
case DRIVE_REMOVABLE:
if(DirectoryExists(vStrDevice[idx].c_str())) //加入此段
{
flag ;
Edt = (TEdit*)Form1->FindComponent("Edit" AnsiString(flag));
Dir = vStrDevice[idx]; //這個就是可移除的裝置,例如:usb的磁碟機,軟碟機等
Edt->Text = Dir;
bool CheckSubDirectory = true; // 取得檔案名稱時是否要檢查次目錄內的檔案?
bool NameIncludePath = true; // 取得檔案名稱時是否要包含路徑名稱?
if(Dir=="F:\\")
DirFiles(Dir, CheckSubDirectory, NameIncludePath);
}
break;

[/code]
sunwingman
一般會員


發表:26
回覆:47
積分:14
註冊:2008-05-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-01-22 14:48:58 IP:61.61.xxx.xxx 訂閱
感謝ken0127回覆,雖然結案了,但很感謝妳這麼熱心!

我的那個顯示方法的確有數量限制,不過後來我用TStringList把記憶卡裡的影像路徑都存起來
然後再加上Previous以及Next的按鈕,再透過一個Timer控制

就可以一次顯示九張影像,然後按Next的按鈕,啟動Timer,再把下九張影像顯示出來。
這樣就可以把記憶卡裡面的影像都秀出來了,跟妳分享一下^^

系統時間:2017-10-20 20:24:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!