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

物件型態轉換問題

尚未結案
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-29 14:15:59 IP:211.23.xxx.xxx 未訂閱
請問,一般我們使用傳遞物件參數時都是用以下的方式 void process( TObjec *Sender) { } 在依據需要用轉換的方式,例如說: ((TForm*)Sender)->Caption = "xxxxx"; 這時,TForm1的Caption就可修改, ((TLabel*)Sender)->Caption = "yyyy"; 這時,TTLabel的Caption就可修改, 每一個都要各自加上轉型的設定, 如果說,想建立一個萬用的,也就是說(TForm*),(TLabel*)類似變數型態的, 任何有Caption的都可以進去做修改,有無這種方法? 發表人 - taishyang 於 2004/07/29 14:21:51
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-29 21:50:55 IP:202.104.xxx.xxx 未訂閱
jason_cyl329 就我所能知道的是沒辦法,所以一般我都是以下面方式
執行:
#include 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  PPropInfo PropInfo;
  PTypeInfo ptrTypeInfo;
  AnsiString S;
  for (int i=0;i<Form1->ComponentCount ;i  ) {
    PropInfo = GetPropInfo((TTypeInfo *)Form1->Components[i]->ClassInfo(), "Caption"); // 是否存在Caption
    if (PropInfo ) { // 存在
      ptrTypeInfo=(PTypeInfo ) Form1->Components[i]->ClassInfo();
      S=(AnsiString)ptrTypeInfo->Name; // 傳回元件類型名稱
      if (S=="TLabel") // TLabel類
        ((TLabel*)Form1->Components[i])->Caption = "yyyy";
      if (S=="TButton") // TButton類
        ((TButton*)Form1->Components[i])->Caption = "xxxx";
    }
  }
}
我也想知道是否有更好的方式!
Andy Chang
------
Andy Chang
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-31 09:34:37 IP:218.170.xxx.xxx 未訂閱
我記得沒錯的話有一種方法可以得知該物件是否有”Caption"這一個屬性的方法! 但詳細的作法我忘了。如果你有Builder C 深度歷險這一本書的話,可以在裡面講解vcl這一章找找!
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-04 18:36:08 IP:211.23.xxx.xxx 未訂閱
感謝andychang & liangnet的回應, 可是只能給一個人,因為andychang回答的較多,雖然不是我要的答案, 還是謝謝你門 !
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-05 04:07:56 IP:211.76.xxx.xxx 未訂閱
jason_cyl329你好:     具有Caption的最基本型態為TControl。所以只要都轉型成TControl*即可。不過難處在TControl的Caption是不能access的,只好用比較底層的方法(Perform函式),但效果還是一樣的。參考下面的Code。     
 
for(int ia = 0; ia < Form1->ComponentCount;  ia)
    {
    TControl *ControlToChange = dynamic_cast(Form1->Components[ia]);
    if(ControlToChange)
        {
        ControlToChange->Perform(WM_SETTEXT, 0, (int)"All Captions are changed");
        ControlToChange->Perform(CM_TEXTCHANGED, 0, 0);
        }
    }
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

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