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

請問"pdf.ocx" 這個元件的問題

尚未結案
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-16 00:43:45 IP:219.86.xxx.xxx 未訂閱
請問各位大大 我利用這個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-16 01:56:49 IP:219.137.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-16 20:19:22 IP:219.81.xxx.xxx 未訂閱
RedSnow您好... 這方法我已試過了  會出現下列錯誤     這要怎麼修改呢??
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-16 20:34:27 IP:219.81.xxx.xxx 未訂閱
再補充一下 Pdf1->LoadFile的用法如下圖     請問這要如何宣告呢???
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-16 22:05:55 IP:219.137.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-16 23:21:14 IP:219.86.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-17 00:10:26 IP:219.137.xxx.xxx 未訂閱
odyaho 您好: 我手邊沒有與您相同的環境,無法立即做相關測試,您可否先確認一下您使用的 pdf.ocx 與被讀取那個 .pdf 檔案各別是什麼版本?可能版本的差異也會有問題的 (舊版 .ocx 讀新版 .pdf)。 如果可能的話,我再重新安裝 Adobe Reader,然後匯入 pdf.ocx 來測試一下好了。
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-17 07:41:33 IP:219.86.xxx.xxx 未訂閱
RedSnow您好 OS: Win 2k , BCB 6.0 ActiveX元件 : Acrobat Control for ActiveX(Version 1.3) 我是安裝Acrobat 6.0的 您的意思是不是 如果安裝Acrobat 7.0就ok了呢??
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-17 12:05:28 IP:219.137.xxx.xxx 未訂閱
odyaho 您好:    我的意思是 "可能版本的差異也會有問題的",那是一種 "可能性" 而已,我並無法確認是否為版本差異帶來的問題。 我看這樣好了,我的環境是 Windows 2000 BCB4,請您將您正在使用的 pdf.ocx 以及測試時無法正常讀取的 .pdf 檔案 (挑一個小一點的) 都上傳到 "會員求助程式檔案上傳區",然後將下載位置貼上來,我試著在我這邊將您的測試環境建立起來,看看能否找出問題來? 發表人 - RedSnow 於 2005/05/17 12:09:16
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-17 14:00:23 IP:202.181.xxx.xxx 未訂閱
RedSnow您好 我已將檔案上傳 網址如下 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=71178 裡頭包含pdf.ocx , test.pdf 麻煩您測試一下 謝謝
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-17 14:39:16 IP:219.137.xxx.xxx 未訂閱
收到,不過完成測試可能需要花一點時間喔....。
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-17 16:46:00 IP:219.137.xxx.xxx 未訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-17 22:13:33 IP:219.81.xxx.xxx 未訂閱
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-05-17 23:49:32 IP:219.81.xxx.xxx 未訂閱
ResSnow您好 再請教您一些問題 我在開始run程式時 pdf元件會出現透明的背景  如圖所示 不曉得再您那邊測試時會這樣嗎???
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-05-18 00:23:23 IP:219.137.xxx.xxx 未訂閱
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-05-18 00:45:40 IP:219.137.xxx.xxx 未訂閱
我測試的時候也有發生和您一樣的現象,原先我還以為是我這邊使用 BCB4 才會有的呢?看來若非是 Bug 那就可能是要載入檔案後再顯示才是正確步驟,我剛才試著先將其 Visible 屬性設為 false,等載入指定檔案後再設為 true,載入速度好像也變得快了些,同時我再啟動 Abode Reader 做比對,結果它在不帶參數的狀態下啟動時也是呈不顯示狀態,因此我覺得您也應該這麼做會比較好。
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-05-18 08:46:36 IP:202.181.xxx.xxx 未訂閱
RedSnow您好    我也將visible更改了 多謝您的建議還有您的講解    Thanks....  < >< >
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-05-18 15:27:24 IP:218.19.xxx.xxx 未訂閱
odyaho 您好: 知道您順利的解決了問題,這讓我也感到很開心,討論這個題目的過程中,我也學到新東西,大家相互加油吧,祝您順心~
系統時間:2024-06-16 4:27:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!