請問"pdf.ocx" 這個元件的問題 |
尚未結案
|
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
請問各位大大
我利用這個ActiveX Control來開啟pdf檔
當我第一次按下開啟鈕時 可以正常開啟pdf檔
第二次按下開啟紐 選取欲開啟的pdf檔後
經過幾秒(大概5秒~10秒) 就會出現如下的錯誤 程式如下
void __fastcall TForm1::Button1Click(TObject *Sender) { if ( Form1->OpenDialog1->Execute()) Form1->Pdf1->src = Form1->OpenDialog1->FileName; }請教各位 哪裡出錯了呢?? 在請教各位 我有看到 Pdf1->LoadFile() 這個方法 請問這個方法怎麼開啟檔案呢?? 聽說CppWebBrowser也可以開啟 要如何用呢?? 謝謝 期待各位的回覆 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
odyaho 您好: 直接將 Form1->OpenDialog1->FileName 代入 LoadFile() 內應該就可以了,例如:
Pdf1->LoadFile(Form1->OpenDialog1->FileName) ;下列這一篇及其內連結的另兩篇也可以參考一下: http://delphi.ktop.com.tw/topic.php?topic_id=28022 在 Adobe 的討論區有一些討論您或許也該看一下: (以下網址含有 @ 符號,唉~試了好久都無法讓它們正常的顯示於瀏覽器上,也不知道反覆處理數次後的網址是否還完整?請複製網址後自行輸入貼到瀏覽器的網址欄去試試看吧,若不行的話,就到 www.adobeforums.com 去瀏覽一下吧) 這一篇講到不該使用 src 去載入檔案 http://www.adobeforums.com/cgi-bin/webx?13@305.CtHLeKDxla1.8@.3bba012d/0 這一篇講到不該使用 pdf.ocx 來開發程式 http://www.adobeforums.com/cgi-bin/webx?50@305.CtHLeKDxla1.2@.3bb64b33發表人 - RedSnow 於 2005/05/16 03:41:05 |
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
|
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
odyaho 您好: 剛才去網路上搜尋了一下,找到了一些有關轉換 wchar_t 與 AnsiString 的參考資料,您試試看下列的方式,看是否可行?
AnsiString temp = Form1->OpenDialog1->FileName; int len = temp.WideCharBufSize(); wchar_t *pdfFile = (wchar_t*)malloc(len 10); temp.WideChar(pdfFile, len); Pdf1->LoadFile(pdfFile); |
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
RedSnow您好
我將程式碼改為如下
void __fastcall TForm1::Button1Click(TObject *Sender) { if(Form1->OpenDialog1->Execute()) { AnsiString temp = Form1->OpenDialog1->FileName; int len = temp.WideCharBufSize(); wchar_t *pdfFile1 = (wchar_t*)malloc(len + 20); temp.WideChar(pdfFile1, len); Pdf1->LoadFile(pdfFile1); } }. 當我按下button後 選取某個 pdf檔案後 會出現下圖之錯誤 ???? 困擾好幾天了 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
odyaho 您好: 我的意思是 "可能版本的差異也會有問題的",那是一種 "可能性" 而已,我並無法確認是否為版本差異帶來的問題。 我看這樣好了,我的環境是 Windows 2000 BCB4,請您將您正在使用的 pdf.ocx 以及測試時無法正常讀取的 .pdf 檔案 (挑一個小一點的) 都上傳到 "會員求助程式檔案上傳區",然後將下載位置貼上來,我試著在我這邊將您的測試環境建立起來,看看能否找出問題來? 發表人 - RedSnow 於 2005/05/17 12:09:16
|
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
odyaho 您好: 我完成測試了,我無法直接 Imports 您上傳的 pdf.ocx 檔案,因此我到 Adobe 站台下載了 7.0 版的 Acrobat Reader (這一版是使用 AcroPDF.dll 而非 pdf.ocx),我匯入 TAcroPDF 元件後,先使用原先的讀檔敘述來測試,結果竟然是有時成功、有時失敗....,我用 Debug 追蹤後發現,原敘述中的 pdfFile 變數內容在檔名結束的後方有時會變得較長 (NULL 字元未緊跟在檔名之後),因此我重新修改字串轉換的設定敘述後,就完全 OK 了。 您先以現有環境試試看下列修改後的敘述,如果不行的話,或許您也需要更新一下版本....。
AnsiString temp = "c:\\tmp\\test.pdf"; wchar_t *pdfFile = new wchar_t[temp.Length() 1]; temp.WideChar(pdfFile, temp.Length() 1); AcroPDF1->LoadFile(pdfFile); AcroPDF1->gotoFirstPage(); delete pdfFile;啊~忘了說明一下,上述範例碼中的 AcroPDF1 名稱請改回您現在的 Pdf1,temp 請由您原先的 Form1->OpenDialog1->FileName 給值。 發表人 - RedSnow 於 2005/05/17 16:54:03 |
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
RedSnow您好
非常感謝您 我這邊可以run了...
還是需要安裝Acrobat 7.0..... 我有些問題想請教您..
AnsiString temp = "c:\\tmp\\test.pdf"; wchar_t *pdfFile = new wchar_t[temp.Length() 1]; wchar_t代表何種定義?? why temp.Length() 加 1 temp.WideChar(pdfFile, temp.Length() 1); temp.WideChar(,)代表什麼意思? AcroPDF1->LoadFile(pdfFile); AcroPDF1->gotoFirstPage(); delete pdfFile;您提供的程式關鍵是不是 AnsiString To wchar_t呢?? 學到了不少東西....剛溫喔 |
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
odyaho 您好:
引言:我有些問題想請教您.. AnsiString temp = "c:\\tmp\\test.pdf"; wchar_t *pdfFile = new wchar_t[temp.Length() 1]; wchar_t代表何種定義?? why temp.Length() 加 1 temp.WideChar(pdfFile, temp.Length() 1); temp.WideChar(,)代表什麼意思? AcroPDF1->LoadFile(pdfFile); AcroPDF1->gotoFirstPage(); delete pdfFile; 您提供的程式關鍵是不是 AnsiString To wchar_t呢??1. wchar_t 是 unsigned short (16-bit) 的資料類型,英文是 Wide Characters,中文名稱好像就是直譯為 "寬字元"。 2. temp 是 AnsiString 的類型,由 Help 中可以查到該類型有提供 WideChar() 函式,這個函式的用途是轉換 AnsiString 的資料為 wchar_t 資料陣列。 3. 會將 tmp.Length() 1 的原因,是因為當我追蹤錯誤時,發現 NULL 字元沒有加在緊接著檔案名稱的後方處,但是前述的 WideChar() 函式我是第一次使用,並不清楚它的運作規則,又急著解決問題,所以為了確保 NULL 能正確加在檔名之後,因此我將長度加 1,讓 AnsiString 資料結尾的 NULL 一併複製給 wchar_t 的資料,如果我先將 wchar_t 陣列全部填為 0 的話,就無需在轉換時將長度多加 1 了。 4. 因為我沒有辦法直接使用您的 pdf.ocx 來做測試,因此我無法確認到底是否為版本問題?但是就我測試的結果,先是由您提供的錯誤訊息得知 LoadFile() 必須使用 wchar_t 類型的資料當參數,然後我才去查相關資料,雖然中間仍產生過錯誤,但是最終還是以 wchar_t 類型的資料傳給 LoadFile() 去載入檔案來解決了問題,因此您說的沒錯,那個轉換動作應該是關鍵。 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
odyaho
初階會員 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |