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

請問有沒有C和Delphi雙修的前輩,可以幫幫忙?

答題得分者是:G01
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-10 11:33:14 IP:211.23.xxx.xxx 未訂閱
以下是一位前輩寫給小弟的範例程式,是用C所寫,但小弟對C不瞭解,所以在轉譯上有一個地方,無法在DELPHI中順利使用,如下所示... //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "ACTIVESKINLib_OCX" #pragma resource "*.dfm" TForm1 *Form1; typedef TComInterface ISkinObjectPtr; typedef TComInterface ISkinStaticPtr; typedef TComInterface ISkinVisualPtr; typedef TComInterface ISkinImagesPtr; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { Skin1->ApplySkinByName((long)Panel1->Handle,L"Form"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { static int a=0; ::ISkinObjectPtr visScreen2; ::ISkinVisualPtr visScreen1; ::ISkinImagesPtr imagePtr; Skin1->GetSkinnedWindow((long)Panel1->Handle)->FindObject( L"Yam",(ISkinObject **)&visScreen2); visScreen2->QueryInterface( IID_ISkinVisual,(void**)&visScreen1); imagePtr = Skin1->GetImages(); CComPtr skin_image; ← 這一行及下一行如何在DELPHI中表現呢? skin_image.CoCreateInstance(CLSID_SkinImage, NULL, CLSCTX_INPROC_SERVER); a ; if(a==1) skin_image->LoadFile(L"sina.bmp"); else if(a==2) skin_image->LoadFile(L"pchome.bmp"); else if(a==3) skin_image->LoadFile(L"Yahoo.bmp"); else { skin_image->LoadFile(L"Yam.bmp"); a= 0; } imagePtr->DeleteImage(1); imagePtr->AddImage(L"Yam",skin_image); visScreen1->Refresh(); } //---------------------------------------------------------------------------
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-09-10 11:47:28 IP:61.219.xxx.xxx 未訂閱
CComPtr skin_image; 這不過是變數宣告, C 可於任何位置宣告, Delphi則一定要在var區, 移到前面去宣告 skin_image:CComptr; 看不到CComptr之定義, 若無問題, 下一行就照用吧 skin_image.CoCreateInstance(CLSID_SkinImage, NULL, CLSCTX_INPROC_SERVER);
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-09-10 11:57:32 IP:211.23.xxx.xxx 未訂閱
引言: CComPtr skin_image; 這不過是變數宣告, C 可於任何位置宣告, Delphi則一定要在var區, 移到前面去宣告 skin_image:CComptr; 看不到CComptr之定義, 若無問題, 下一行就照用吧 skin_image.CoCreateInstance(CLSID_SkinImage, NULL, CLSCTX_INPROC_SERVER);
謝謝版主的回覆,小弟試過不行,會出現 Undeclared identifier:'CComptr' Missing operator or semicolon Undeclared identifier: 'CLSID_SkinImage' Undeclared identifier: 'NULL' 小弟粗淺的瞭解好像這二行是要建立一個com元件,不知道對不對? 小弟問過那位前輩,CComprt是什麼型態,以下是那位前輩的回答: >CComPtr是所謂的精明指標(Smart Pointer),具有自動解構的特性,在建構元及解構元 >之中自動呼叫AddRef及Release來做參考計數的管理,因為我對Delphi不熟..,只能提 >供你一點方向.. 請版主指點小弟,謝謝! 發表人 - tonyplus 於 2002/09/10 11:59:05
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-09-10 12:11:07 IP:61.219.xxx.xxx 未訂閱
謝謝版主的回覆,小弟試過不行,會出現 Undeclared identifier:'CComptr' 那是當然, 你必須找到CComptr之定義, 在Delphi做相對之Define Missing operator or semicolon只不過是打漏了; 小弟問過那位前輩,CComprt是什麼型態,以下是那位前輩的回答: >CComPtr是所謂的精明指標(Smart Pointer),具有自動解構的特性,在建構元及解構元 用猜的沒用, 必須找到定義, 在Delphi也Implement相對之Constructor
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-09-10 12:20:49 IP:211.23.xxx.xxx 未訂閱
引言: 謝謝版主的回覆,小弟試過不行,會出現 Undeclared identifier:'CComptr' 那是當然, 你必須找到CComptr之定義, 在Delphi做相對之Define Missing operator or semicolon只不過是打漏了; 小弟問過那位前輩,CComprt是什麼型態,以下是那位前輩的回答: >CComPtr是所謂的精明指標(Smart Pointer),具有自動解構的特性,在建構元及解構元 用猜的沒用, 必須找到定義, 在Delphi也Implement相對之Constructor
版主,相對的Constructor以上述的code如何定義,小弟真的不懂,請版主多多指教...
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-09-10 15:06:05 IP:61.219.xxx.xxx 未訂閱
你從任意程式中抽一部分, 沒頭沒尾, 是無法改的 CComptr是定義在何處? 如何定義? 都沒有. 如何能使用.
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-09-11 03:57:10 IP:203.204.xxx.xxx 未訂閱
引言:
引言: 謝謝版主的回覆,小弟試過不行,會出現 Undeclared identifier:'CComptr' 那是當然, 你必須找到CComptr之定義, 在Delphi做相對之Define Missing operator or semicolon只不過是打漏了; 小弟問過那位前輩,CComprt是什麼型態,以下是那位前輩的回答: >CComPtr是所謂的精明指標(Smart Pointer),具有自動解構的特性,在建構元及解構元 用猜的沒用, 必須找到定義, 在Delphi也Implement相對之Constructor
版主,相對的Constructor以上述的code如何定義,小弟真的不懂,請版主多多指教... < face="Verdana, Arial, Helvetica"> 寄給我你的完整Code 可以翻給你 PS 要你的 Code 很多...那就只翻個範例給你參考(畢竟我不是翻譯機) 如果你介意你的 Code 的隱私性,那就愛莫能助了,畢竟瞎子摸像,像也不像....
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-09-11 10:22:29 IP:211.23.xxx.xxx 未訂閱
引言: 你從任意程式中抽一部分, 沒頭沒尾, 是無法改的 CComptr是定義在何處? 如何定義? 都沒有. 如何能使用.
首先,先感謝版主及syntax前輩的回應,事實上小弟貼出來的 >,其實會有這樣的問題,是小弟在深度論壇裡的發問,如果前輩們不覺得煩的話,可以到 >,希望前輩們幫助還藏這藏那的,前輩們為小弟解惑,原本就沒有那個義務,對前輩們的指點,小弟永感大德!< >
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-09-11 11:19:24 IP:61.219.xxx.xxx 未訂閱
所以嘛, 必須先安裝一個ocx元件, 你的問題是在如何使用此元件, 未提到此元件不是大家在瞎子摸象? 你應該在Delphi中用Import TypeLib,安裝此元件, Delphi會產生一xxx_TLB.pas之檔, 你要uses的是此unit而不是C 的宣告檔. 在xxx_TLB中會分別有interface 及Wrapper class,直接使用該class即可.
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-09-12 20:59:34 IP:61.219.xxx.xxx 未訂閱
可否乾脆說出您原本的需求,說不定還比較快! 您是不是要將Form改為有底圖的視窗,或是做出不規則形狀的視窗? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-09-13 02:38:37 IP:203.204.xxx.xxx 未訂閱
嗯 仔細讀了一下程式 很努力的想弄懂 不過發現 因為程式碼中用了***非建議的語法*** (手邊幾本程式的書都建議不要用的語法) 這樣的程式碼...ㄟ 出錯的可能性蠻高的(不同編譯器可能有不同的結果) 而要轉換 也不方便......... 因為 ACTIVESKINLib_OCX 的設計結構不明 這樣就無法在Delphi也Implement相對之Constructor出來,簡單的說,就是不知道對方的格式,就無法翻譯 所以 你還是如領航天使說的 "直接說你的意圖吧 !" 這樣比較快 !
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-09-13 10:26:18 IP:211.23.xxx.xxx 未訂閱
引言: 可否乾脆說出您原本的需求,說不定還比較快! 您是不是要將Form改為有底圖的視窗,或是做出不規則形狀的視窗? ~~~Delphi K.Top討論區站長~~~
其實會有這樣的需求,只是因為要使用ActiveSkin這個第三協力廠商所開發的 元件功能,如果各位前輩有用過這一套元件,可能比較能了解小弟想要做到的 功能,小弟的案子是開發一個選購產品的程式,因為客戶的要求,要外觀美美 的而且要隨產品主題變換外觀,所以小弟就將activeskin加入,因為它可以做 到選單彈出,不規則button變色及觸發並且可隨時更換已經做好的skin (像winamp,Media Player) ,小弟知道如果只是為了做到有底圖的視窗,或是 做出不規則形狀的視窗,就簡單解決多了! 在activeskin裡沒有handle的元件,一律會被skin蓋掉,所以在選單裡產品的 圖就不能使用image,所以小弟現在使用可改變底圖的button來取代image,這 樣是可以解決這個問題,只不過這個button不會隨著可彈出的選單移動,因為 它不是skin裡的東西。 其實activeskin是可以做到這樣的功能,只是小弟不知如何使用,所以上網請 教使用過的前輩,後來發現好像activeskin搭配bcb或是vc的使用者比較多, 所以前輩們回應小弟問題也是大多使用c的範例,就是這樣才氣人,明明就有 答案了,可是卻因為看不懂,而無法使用,也才會有這次發表的主題。 唉~怪只能怪activeskin的說明文件太少,程式所附的範例程式,太過基礎, 不過,謝謝各位前輩的指點,起碼小弟知道自己的功力太遜,要好好加強
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-09-16 09:00:00 IP:210.61.xxx.xxx 未訂閱
引言:
引言: 可否乾脆說出您原本的需求,說不定還比較快! 您是不是要將Form改為有底圖的視窗,或是做出不規則形狀的視窗? ~~~Delphi K.Top討論區站長~~~
其實會有這樣的需求,只是因為要使用ActiveSkin這個第三協力廠商所開發的 元件功能,如果各位前輩有用過這一套元件,可能比較能了解小弟想要做到的 功能,小弟的案子是開發一個選購產品的程式,因為客戶的要求,要外觀美美 的而且要隨產品主題變換外觀,所以小弟就將activeskin加入,因為它可以做 到選單彈出,不規則button變色及觸發並且可隨時更換已經做好的skin (像winamp,Media Player) ,小弟知道如果只是為了做到有底圖的視窗,或是 做出不規則形狀的視窗,就簡單解決多了! 在activeskin裡沒有handle的元件,一律會被skin蓋掉,所以在選單裡產品的 圖就不能使用image,所以小弟現在使用可改變底圖的button來取代image,這 樣是可以解決這個問題,只不過這個button不會隨著可彈出的選單移動,因為 它不是skin裡的東西。 其實activeskin是可以做到這樣的功能,只是小弟不知如何使用,所以上網請 教使用過的前輩,後來發現好像activeskin搭配bcb或是vc的使用者比較多, 所以前輩們回應小弟問題也是大多使用c的範例,就是這樣才氣人,明明就有 答案了,可是卻因為看不懂,而無法使用,也才會有這次發表的主題。 唉~怪只能怪activeskin的說明文件太少,程式所附的範例程式,太過基礎, 不過,謝謝各位前輩的指點,起碼小弟知道自己的功力太遜,要好好加強! //-------------------------------------------------------------- >< face="Verdana, Arial, Helvetica">
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-09-16 09:15:49 IP:210.61.xxx.xxx 未訂閱
Sorry !! 我忘了還有另一種方法 利用delphi的Component-->Import Activex Control 然後再選擇 'Create Unit' 按鈕,就可以得到所有包含於*.OCX 的介面及機碼值 的Delphi單元!!
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-09-16 10:30:53 IP:211.23.xxx.xxx 未訂閱
引言: Sorry !! 我忘了還有另一種方法 利用delphi的Component-->Import Activex Control 然後再選擇 'Create Unit' 按鈕,就可以得到所有包含於*.OCX 的介面及機碼值 的Delphi單元!!
謝謝G01前輩的指點,小弟馬上試一試!
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-09-16 11:01:33 IP:211.23.xxx.xxx 未訂閱
引言: Sorry !! 我忘了還有另一種方法 利用delphi的Component-->Import Activex Control 然後再選擇 'Create Unit' 按鈕,就可以得到所有包含於*.OCX 的介面及機碼值 的Delphi單元!!
G01前輩: 小弟找了一下,發現在ocx檔的unit裡SkinImage的資料是: // *********************************************************************// // Interface: ISkinImage // Flags: (0) // GUID: {1F8BB9F7-EBA0-4AC5-8980-FB4E872BA057} // *********************************************************************// ISkinImage = interface(IUnknown) ['{1F8BB9F7-EBA0-4AC5-8980-FB4E872BA057}'] function Create(sx: SYSINT; sy: SYSINT): HResult; stdcall; function Empty: HResult; stdcall; function LoadFile(const FileName: WideString): HResult; stdcall; function SaveFile(const FileName: WideString): HResult; stdcall; .......... 但是在登錄檔裡的機碼名稱卻是: SkinImage Object HKEY_CLASSES_ROOT\CLSID\{A5704C37-40DA-49EF-904B-97E5F5F9B1C5} 如果用ocx裡機碼的資料去做搜尋會找不到資料,這是為什麼呢? 難道從小弟的機器匯入OCX檔後,Skinimage的機碼會改變? 那如果指定機碼,到別人的機器上,不就找不到這個機碼了嗎? 還是小弟有什麼遺漏的!請指教!
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2002-09-16 11:16:51 IP:210.61.xxx.xxx 未訂閱
引言:
引言: Sorry !! 我忘了還有另一種方法 利用delphi的Component-->Import Activex Control 然後再選擇 'Create Unit' 按鈕,就可以得到所有包含於*.OCX 的介面及機碼值 的Delphi單元!!
G01前輩: 小弟找了一下,發現在ocx檔的unit裡SkinImage的資料是: // *********************************************************************// // Interface: ISkinImage // Flags: (0) // GUID: {1F8BB9F7-EBA0-4AC5-8980-FB4E872BA057} // *********************************************************************// ISkinImage = interface(IUnknown) ['{1F8BB9F7-EBA0-4AC5-8980-FB4E872BA057}'] function Create(sx: SYSINT; sy: SYSINT): HResult; stdcall; function Empty: HResult; stdcall; function LoadFile(const FileName: WideString): HResult; stdcall; function SaveFile(const FileName: WideString): HResult; stdcall; .......... 但是在登錄檔裡的機碼名稱卻是: SkinImage Object HKEY_CLASSES_ROOT\CLSID\{A5704C37-40DA-49EF-904B-97E5F5F9B1C5} 如果用ocx裡機碼的資料去做搜尋會找不到資料,這是為什麼呢? 難道從小弟的機器匯入OCX檔後,Skinimage的機碼會改變? 那如果指定機碼,到別人的機器上,不就找不到這個機碼了嗎? 還是小弟有什麼遺漏的!請指教! 應該是要使用OCX產生的機碼值才對!!(可能要試試看!!)
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#18 引用回覆 回覆 發表時間:2002-09-16 11:37:11 IP:210.61.xxx.xxx 未訂閱
Oh !! Sorry 看的太快了 , 我想應該要如此說 Register 中的機碼是該Com物件最正確的機碼(該物件的原始機碼值) 而使用Import active Control而產生的InterFace機碼值則是 Delphi產生的(Delphi 會針對*.ocx的Com物件再進行一次包裝)所以自然 兩者的機碼值會有所不同;但是該使用哪一個呢? 用法 1.不使用Delphi產生的*_TLB.Pas檔案時,直接使用register之內的機碼值 2.剛好和用法1.相反,但是記得將產生的*_TLB.pas Use進來!!
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#19 引用回覆 回覆 發表時間:2002-09-16 12:04:02 IP:211.23.xxx.xxx 未訂閱
引言: Oh !! Sorry 看的太快了 , 我想應該要如此說 Register 中的機碼是該Com物件最正確的機碼(該物件的原始機碼值) 而使用Import active Control而產生的InterFace機碼值則是 Delphi產生的(Delphi 會針對*.ocx的Com物件再進行一次包裝)所以自然 兩者的機碼值會有所不同;但是該使用哪一個呢? 用法 1.不使用Delphi產生的*_TLB.Pas檔案時,直接使用register之內的機碼值 2.剛好和用法1.相反,但是記得將產生的*_TLB.pas Use進來!!
謝謝G01前輩的指點,但小弟還是弄不太清楚!首先,小弟看過>>
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#20 引用回覆 回覆 發表時間:2002-09-16 14:12:46 IP:210.61.xxx.xxx 未訂閱
引言: 1.小弟也確實找過登錄檔裡的Word.Basic,是出現在機碼的資料欄位裡,那麼就 這個case,小弟是不是也可以用資料欄位裡'SkinImage Object'來CreateOleObject 呢? 其實,只要在Import Activex Control時按下'install' 按鈕,對應於*.Ocx的元件TSkin及TSkinLabel元件就會被建立(ActiveX 那一頁) 直接拉下來放就可以使用了,根本不用些一堆程式碼!! 這樣的做法 可以不用去管那些關於Com 物件的繁瑣規則(你一開始附上的BCB程式碼,從取得 Com 物件的介面到建立Instance 都是自行建立) 而使用CreateOleObject其實是要看該Com物件是否支援Ole的規格,像是Word.Basic物件其實就是支援Ole的COM元件!! 而ActiveSkin4.Ocx 我試著使用 CreateOleObject 時com物件可以被建立 可是呼叫相關函式時,是一定要Uses activeskinLib_TLB.pas檔案 一但使用了這個檔案,就不用擔心轉型問題(其實還是透過Delphi作vcl Component及 Com Object之間的Mapping),而且以這種做法我發現Skin沒有作用 !! 所以,最後的結論應該是 在Component --> Import Activex Control時按下'install' 按鈕,將對應於*.Ocx的元件TSkin及TSkinLabel元件建立在ActiveX 那一頁 直接拉下來放就可以使用了!!
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#21 引用回覆 回覆 發表時間:2002-09-16 16:11:05 IP:211.23.xxx.xxx 未訂閱
引言: 1.小弟也確實找過登錄檔裡的Word.Basic,是出現在機碼的資料欄位裡,那麼就 這個case,小弟是不是也可以用資料欄位裡'SkinImage Object'來CreateOleObject 呢? 其實,只要在Import Activex Control時按下'install' 按鈕,對應於*.Ocx的元件TSkin及TSkinLabel元件就會被建立(ActiveX 那一頁) 直接拉下來放就可以使用了,根本不用些一堆程式碼!! 這樣的做法 可以不用去管那些關於Com 物件的繁瑣規則(你一開始附上的BCB程式碼,從取得 Com 物件的介面到建立Instance 都是自行建立) 而使用CreateOleObject其實是要看該Com物件是否支援Ole的規格,像是Word.Basic物件其實就是支援Ole的COM元件!! 而ActiveSkin4.Ocx 我試著使用 CreateOleObject 時com物件可以被建立 可是呼叫相關函式時,是一定要Uses activeskinLib_TLB.pas檔案 一但使用了這個檔案,就不用擔心轉型問題(其實還是透過Delphi作vcl Component及 Com Object之間的Mapping),而且以這種做法我發現Skin沒有作用 !! 所以,最後的結論應該是 在Component --> Import Activex Control時按下'install' 按鈕,將對應於*.Ocx的元件TSkin及TSkinLabel元件建立在ActiveX 那一頁 直接拉下來放就可以使用了!!
不知道G01前輩,是本身就有在使用ACTIVESKIN還是因為要回答小弟的問題, 而去找ACTIVESKIN來測試,如果是後者,小弟十分的感謝! 好吧!小弟要進入正題了!在您使用 >
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#22 引用回覆 回覆 發表時間:2002-09-16 16:48:56 IP:210.61.xxx.xxx 未訂閱
對應修改方式如下 var visScreen1:ISkinVisual; visScreen2:ISkinObject; SkinImage:ISkinImage; ImagePtr :ISkinImages; //不Create 由Skin1.GetImages取得物件 其中//SkinImage的建立方法 SkinImage := CoSkinImage.Create; 釋放方法 SkinImage := nil; 其餘的程式碼對翻如下 : self.Skin1.GetSkinnedWindowForm1.Handle).FindObject'yam',visScreen2); ImagePtr := self.Skin1.GetImages; SkinImage.LoadFile('yam'); ImagePtr.DeleteImage(1); ImagePtr.AddImage('Yam',SkinImage); visScreen1.refresh; PS: ISkinVisual 介面我下在的active skin並沒有找到(可能是版本不合吧?) 你可以到Delphi的Import目錄中開啟activeSkinLIB_TLB.pas找看看!!
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#23 引用回覆 回覆 發表時間:2002-09-16 17:07:51 IP:210.61.xxx.xxx 未訂閱
最後整理如下 procedure TForm1.Button1Click(Sender:TObject) var a:integer; visScreen2:ISkinObject; visScreen1:ISkinVisual; imagePtr :ISkinImages; skin_image:ISkinImage; begin a := 0; Self.Skin1.GetSkinnedWindow(Panel1.Handle) .FindObject('Yam',visScreen2); visScreen2.QueryInterface(IID_ISkinVisual,visScreen1); //Note. 這一行Code ,其實我並不了解 ISkinViaual與ISkinObject的關係 //但是從字面上看來...SkinObject應該是包含了SkinVisual的介面 //所以就直接將Code翻過來... imagePtr = Skin1->GetImages(); skin_image.CoSkinImage.Create; a ; if(a=1)then skin_image.LoadFile('sina.bmp') else if(a=2)then skin_image.LoadFile('pchome.bmp') else if(a=3)then skin_image.LoadFile('Yahoo.bmp'); else begin skin_image.LoadFile('Yam.bmp'); a := 0; end;//else...end!! //---------------------------------------------------- imagePtr.DeleteImage(1); imagePtr.AddImage('Yam',skin_image); visScreen1.Refresh; end;
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#24 引用回覆 回覆 發表時間:2002-09-16 17:11:26 IP:210.61.xxx.xxx 未訂閱
Sorry !! 修正語法錯誤後----->>最後整理如下 procedure TForm1.Button1Click(Sender:TObject) var a:integer; visScreen2:ISkinObject; visScreen1:ISkinVisual; imagePtr :ISkinImages; skin_image:ISkinImage; begin a := 0; Self.Skin1.GetSkinnedWindow(Panel1.Handle) .FindObject('Yam',visScreen2); visScreen2.QueryInterface(IID_ISkinVisual,visScreen1); //Note. 這一行Code ,其實我並不了解 ISkinViaual與ISkinObject的關係 //但是從字面上看來...SkinObject應該是包含了SkinVisual的介面 //所以就直接將Code翻過來... imagePtr = Skin1.GetImages(); skin_image.CoSkinImage.Create; Inc(a); if(a=1)then skin_image.LoadFile('sina.bmp') else if(a=2)then skin_image.LoadFile('pchome.bmp') else if(a=3)then skin_image.LoadFile('Yahoo.bmp'); else begin skin_image.LoadFile('Yam.bmp'); a := 0; end;//else...end!! //---------------------------------------------------- imagePtr.DeleteImage(1); imagePtr.AddImage('Yam',skin_image); visScreen1.Refresh; end;
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#25 引用回覆 回覆 發表時間:2002-09-16 17:13:46 IP:210.61.xxx.xxx 未訂閱
不甘心!!再修正一次 procedure TForm1.Button1Click(Sender:TObject) var a:integer; visScreen2:ISkinObject; visScreen1:ISkinVisual; imagePtr :ISkinImages; skin_image:ISkinImage; begin a := 0; Self.Skin1.GetSkinnedWindow(Panel1.Handle) .FindObject('Yam',visScreen2); visScreen2.QueryInterface(IID_ISkinVisual,visScreen1); //Note. 這一行Code ,其實我並不了解 ISkinViaual與ISkinObject的關係 //但是從字面上看來...SkinObject應該是包含了SkinVisual的介面 //所以就直接將Code翻過來... imagePtr := Skin1.GetImages; skin_image.CoSkinImage.Create; Inc(a); if(a=1)then skin_image.LoadFile('sina.bmp') else if(a=2)then skin_image.LoadFile('pchome.bmp') else if(a=3)then skin_image.LoadFile('Yahoo.bmp'); else begin skin_image.LoadFile('Yam.bmp'); a := 0; end;//else...end!! //---------------------------------------------------- imagePtr.DeleteImage(1); imagePtr.AddImage('Yam',skin_image); visScreen1.Refresh; end;
tonyplus
初階會員


發表:22
回覆:97
積分:28
註冊:2002-04-13

發送簡訊給我
#26 引用回覆 回覆 發表時間:2002-09-16 17:49:03 IP:211.23.xxx.xxx 未訂閱
引言: 不甘心!!再修正一次 procedure TForm1.Button1Click(Sender:TObject) var a:integer; visScreen2:ISkinObject; visScreen1:ISkinVisual; imagePtr :ISkinImages; skin_image:ISkinImage; begin a := 0; Self.Skin1.GetSkinnedWindow(Panel1.Handle) .FindObject('Yam',visScreen2); visScreen2.QueryInterface(IID_ISkinVisual,visScreen1); //Note. 這一行Code ,其實我並不了解 ISkinViaual與ISkinObject的關係 //但是從字面上看來...SkinObject應該是包含了SkinVisual的介面 //所以就直接將Code翻過來... imagePtr := Skin1.GetImages; skin_image.CoSkinImage.Create; Inc(a); if(a=1)then skin_image.LoadFile('sina.bmp') else if(a=2)then skin_image.LoadFile('pchome.bmp') else if(a=3)then skin_image.LoadFile('Yahoo.bmp'); else begin skin_image.LoadFile('Yam.bmp'); a := 0; end;//else...end!! //---------------------------------------------------- imagePtr.DeleteImage(1); imagePtr.AddImage('Yam',skin_image); visScreen1.Refresh; end;
嘻...佩服前輩不屈不撓的精神,不過小弟有一個小小的疑問? >.* >... 在此謝謝樓上各位前輩的指點,小弟已經得到想要的答案了! 這個主題也終於可以結案了! >!
G01
高階會員


發表:249
回覆:379
積分:215
註冊:2002-05-21

發送簡訊給我
#27 引用回覆 回覆 發表時間:2002-09-17 08:16:12 IP:210.61.xxx.xxx 未訂閱
非常感謝你的提醒!!
系統時間:2024-04-19 18:35:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!