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

請教如何複製一個屬性完全相同的元件呢?

尚未結案
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-06 14:09:21 IP:210.66.xxx.xxx 未訂閱
各位大大好....    請教一個問題.... 如果今天在 >
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-06 14:18:58 IP:202.39.xxx.xxx 未訂閱
Project -> Add to Repository 應該是您要的功能    --- Everything I say is a lie. --<-<-<@
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-06 14:19:09 IP:147.8.xxx.xxx 未訂閱
Oh... misunderstand the question...
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-06 16:13:01 IP:210.66.xxx.xxx 未訂閱
不好意思....我再說明清楚一下我想要的功能....!! 假設在Form1中有一個Table1,且加入了永久性欄位,也在很多事件中設定了一些 程序,如新增後...存檔後...等等.... 然後在Form2中並沒有Table的元件....此時我想透過某事件,如OnCreate時,由 該事件程序中,以程式來產生一個和Form1的Table1一模一樣的Table,當然啦,這 個產生的Table是位在Form2中的,只是我該如何可以很快的,或是說該如何很簡 便的去產生它呢? 這裡所指的很快或是很簡便的產生, 是指將Form1中的Table1的所有屬性及事件 設定,包含永久性欄位...等等...原封不動的設定給這一個新增的Table....!! 再說明一下前提....是由程式來產生一個新Table...而不是在設計模式中去產 生的,....自然...用整個Form的元件寶庫的方式...並不是我想要的!! 不知道這樣子...是否能更了解了呢? Thanks!!
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-06 16:52:02 IP:220.160.xxx.xxx 未訂閱
轉自Delphi超級猛料:http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33426    1、    var MS: TMemoryStream;        MS.WriteComponent(Component1);     MS.Position := 0;     MS.ReadComponent(Component2);    //上面的好象只能複製屬性    2、    uses typInfo;    
function CloneProperty2(SourceComp, TargetComp: TObject): Boolean;
var
  i: Integer;
  Properties : PPropList;
begin
  Result := True;
  try
    for i := 0 to GetPropList(SourceComp, Properties) - 1 do
    begin
      if LowerCase(Properties[i].Name) = 'name' then continue;
      if not IsPublishedProp(SourceComp, Properties[I].Name) then Continue;
      if not IsPublishedProp(TargetComp, Properties[I].Name) then Continue;
      if PropType(SourceComp, Properties[I].Name) <> PropType(TargetComp, Properties[I].Name) then
        Continue;
      case PropType(SourceComp, Properties[i].Name) of
      tkClass:
        SetObjectProp(TargetComp, Properties[i],
        GetObjectProp(SourceComp, Properties[i]));
      tkMethod:
        SetMethodProp(TargetComp, Properties[I], GetMethodProp(SourceComp,
          Properties[I]));
      else
        SetPropValue(TargetComp, Properties[i].Name, GetPropValue(SourceComp,
        Properties[i].Name));
      end;
    end;
  except
    Result := False;
  end;
end;
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-06 17:10:15 IP:210.65.xxx.xxx 未訂閱
Hi:    首先在 Form1 中定義一個全域變數 Table2 : TTable; 於 form1 中 Table2 := Table1.Create(Form2);    試試看,不知可不可行苦 -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
ccchen
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-07 08:20:23 IP:218.163.xxx.xxx 未訂閱
引言: Hi: 首先在 Form1 中定義一個全域變數 Table2 : TTable; 於 form1 中 Table2 := Table1.Create(Form2); Table1是一個object instance,不是Class 如何用來Create
應是 Table2:=TTable.create(form2); 之後 Table2.assign(Table1);
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-07 08:40:22 IP:210.65.xxx.xxx 未訂閱
Hi:    感謝 ccchen 大大的指教 我試過 <>> 的指令,沒有問題,只是未測試其內容是否正確無誤,我會撥個時間作一次完整的測試 <>> 會造成 <>> 的錯誤訊息,應如何克服? -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 --------------------------------
------
Fishman
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-07 10:24:29 IP:203.73.xxx.xxx 未訂閱
謝謝各位大大們的幫忙測試...!!    只是到目前為止,尚沒有一個最完整且OK的答案出現....    大家加油囉!!    相信今天提出的問題...如果有一個解決方案,相信也應當可以帶給很多朋友一 個比較方便性的!!     補充一點.... 請問
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-07 10:45:01 IP:220.160.xxx.xxx 未訂閱
引言: 謝謝各位大大們的幫忙測試...!! 只是到目前為止,尚沒有一個最完整且OK的答案出現.... 大家加油囉!! 相信今天提出的問題...如果有一個解決方案,相信也應當可以帶給很多朋友一 個比較方便性的!! 補充一點.... 請問>< face="Verdana, Arial, Helvetica"> 1、昨天貼的那個CloneProperty2過程雖然麻煩了一點、但已經實現了物件的屬性、事件和屬性值的複製、我想這已經夠用了吧 2、Assign The Assign method copies all properties from a Series component to another. Only the common properties shared by both source and destination Series are copied. TPersistent.Assign是個虛方法、裏邊沒有實現什麼、除了處理異常、看看它的代碼就知道了、 因此只有重載了這個方法的物件才可以使用它、例如TStrings、而不論是TButton還是TTable、都沒有這個方法的具體實現、所以是這條路是行不通的
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-07 11:18:24 IP:203.73.xxx.xxx 未訂閱
引言:
引言: 謝謝各位大大們的幫忙測試...!! 只是到目前為止,尚沒有一個最完整且OK的答案出現.... 大家加油囉!! 相信今天提出的問題...如果有一個解決方案,相信也應當可以帶給很多朋友一 個比較方便性的!! 補充一點.... 請問>< face="Verdana, Arial, Helvetica"> 1、昨天貼的那個CloneProperty2過程雖然麻煩了一點、但已經實現了物件的屬性、事件和屬性值的複製、我想這已經夠用了吧 2、Assign The Assign method copies all properties from a Series component to another. Only the common properties shared by both source and destination Series are copied. TPersistent.Assign是個虛方法、裏邊沒有實現什麼、除了處理異常、看看它的代碼就知道了、 因此只有重載了這個方法的物件才可以使用它、例如TStrings、而不論是TButton還是TTable、都沒有這個方法的具體實現、所以是這條路是行不通的
To: Rain大大.... 不好意思.... 剛才再試了一下您所給的程序.....果然是可以達到我所要的功能了.... 可是...最重要的一點....卻沒法子完成.... 那就是如果我所代入的參數,如果是 >
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-01-07 11:58:31 IP:220.160.xxx.xxx 未訂閱
引言: To: Rain大大.... 不好意思.... 剛才再試了一下您所給的程序.....果然是可以達到我所要的功能了.... 可是...最重要的一點....卻沒法子完成.... 那就是如果我所代入的參數,如果是 > >< face="Verdana, Arial, Helvetica"> 這就奇怪了、剛剛在這邊用ADO元件試了一下、沒有出現問題、資料也可以保存、TTable也試了一下、沒有出錯資訊、複製TableName之類的屬性也沒有問題、因為我這邊的BDE老早以前就壞掉了、沒用、就沒去管它、所以沒辦法測試一下資料可不可以更新、按理說也應該可以、需要注意的一點是在複製以前如果Table.Active := True則Table.Close; 另外不知道你那邊具體的出錯資訊是什麼、在哪邊出錯呢? 發表人 - Rain 於 2004/01/07 11:59:43
ccchen
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-01-07 13:33:10 IP:218.163.xxx.xxx 未訂閱
引言: Hi: 感謝 ccchen 大大的指教 我試過 <>> 的指令,沒有問題,只是未測試其內容是否正確無誤,我會撥個時間作一次完整的測試 <>> 會造成 <>> 的錯誤訊息,應如何克服? -------------------------------- 小弟才疏學淺,若有謬誤請不吝指教 -------------------------------- < face="Verdana, Arial, Helvetica"> 是我錯了 1. Create是一個class method. Class method可以用Class來呼叫, 也可以用object instance 呼叫, 但結果是一樣的, 即TTable.create和Table1.create是完全一樣的 2. TTable未Implement Assign所以不可用, 只好用GetPropList一個個做了. 3. 若是TClientDataSet倒是可用CloneCursor
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-01-07 16:38:38 IP:203.73.xxx.xxx 未訂閱
引言:
引言: To: Rain大大.... 不好意思.... 剛才再試了一下您所給的程序.....果然是可以達到我所要的功能了.... 可是...最重要的一點....卻沒法子完成.... 那就是如果我所代入的參數,如果是 > >< face="Verdana, Arial, Helvetica"> 這就奇怪了、剛剛在這邊用ADO元件試了一下、沒有出現問題、資料也可以保存、TTable也試了一下、沒有出錯資訊、複製TableName之類的屬性也沒有問題、因為我這邊的BDE老早以前就壞掉了、沒用、就沒去管它、所以沒辦法測試一下資料可不可以更新、按理說也應該可以、需要注意的一點是在複製以前如果Table.Active := True則Table.Close; 另外不知道你那邊具體的出錯資訊是什麼、在哪邊出錯呢? 發表人 - Rain 於 2004/01/07 11:59:43
To: Rain大大..... 哈...太感謝啦!! 我已經成功的經由您所給的程序,達到我想要的功能了....!! 至於前一篇說到 > ) 不管怎樣....這一篇的分數....一定是要給 >
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-01-07 17:14:12 IP:220.160.xxx.xxx 未訂閱
引言: 另外,這一支程序是否不須經由任何修改,就可以達到所有元件的完全複製呢? (指:可視及不可視元件...簡單說應該是指Delphi內附的所有元件及自行開發的 元件及任何的外來元件....等等!!)
都可以、應該適用於所有元件
引言: 只是...萬一我所要複製的來源,已被某個開啟的視窗所用,然後此時想在另一個 視窗中用此複製的方式來產生一個相同的Dataset時,卻必須先將該來源給Close ,可是這樣子一來,那一個有使用其來源Dataset的視窗,其中的資料不就給Close 而不能操作了...不知道這一部份,...是否有其它方式可以解決? (這裡所指的來源Dataset,應該是放在DM中,然後視窗是採用MDI....) (這裡的新問題,不敢奢求能夠有解決方案,不過...如果能夠有的話...那就最好 了...嘻!! ) < face="Verdana, Arial, Helvetica"> 這個不難、不複製Active屬性的屬性值True就好、在那個過程中加上一句即可(紅色部分) if LowerCase(Properties[i].Name) = 'name' then continue; if LowerCase(Properties[i].Name) = 'active' then continue;
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-01-07 22:14:36 IP:203.73.xxx.xxx 未訂閱
引言:
引言: 另外,這一支程序是否不須經由任何修改,就可以達到所有元件的完全複製呢? (指:可視及不可視元件...簡單說應該是指Delphi內附的所有元件及自行開發的 元件及任何的外來元件....等等!!)
都可以、應該適用於所有元件
引言: 只是...萬一我所要複製的來源,已被某個開啟的視窗所用,然後此時想在另一個 視窗中用此複製的方式來產生一個相同的Dataset時,卻必須先將該來源給Close ,可是這樣子一來,那一個有使用其來源Dataset的視窗,其中的資料不就給Close 而不能操作了...不知道這一部份,...是否有其它方式可以解決? (這裡所指的來源Dataset,應該是放在DM中,然後視窗是採用MDI....) (這裡的新問題,不敢奢求能夠有解決方案,不過...如果能夠有的話...那就最好 了...嘻!! ) < face="Verdana, Arial, Helvetica"> 這個不難、不複製Active屬性的屬性值True就好、在那個過程中加上一句即可(紅色部分) if LowerCase(Properties[i].Name) = 'name' then continue; if LowerCase(Properties[i].Name) = 'active' then continue;
Rain大大..... 您真是太厲害了...!! 配服!! (已經完全OK了!!) 在此希望有看到此篇文章的朋友,尤其是比較屬於入門級的....希望能帶給您 們一些幫助....同時也替大家感謝大大們的熱心!! 今天這篇問題的主要訴求如下: (我所想要的,或許也是某些人想要的) ( > 最後....寫到這裡忽然想到一個問題.... ( 想再次麻煩一下 >
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-01-08 13:55:10 IP:220.160.xxx.xxx 未訂閱
引言: 那就是....要如何改這一個程序,而達到連DataSet中的永久性欄位也能複製呢? 因為我將來源Dataset中的永久性欄位設好後,卻發現新產生的Dataset並沒有 來源中所設定的永久性欄位....(我是藉由DBGrid來查看測試的...如中文抬頭 ,欄位數量...等等)
typInfo單元只提供對published的屬性的訪問、用上面的過程沒辦法實現DataSet.Fields這類屬性的複製、應該比較難吧、沒有什麼頭緒、 這邊你可以先動態建立欄位來滿足局部的要求、
var
  I: Integer;
begin
  CloneProperty2(Table1, Table2);
  with Table2 do
  begin
    DisableControls;
    try
      Open;
      Close;
      for I := 0 to Table1.Fields.Count - 1 do
        FieldDefList[I].CreateField(Owner).DisplayLabel := Table1.Fields[I].DisplayLabel;
      Open;
    finally
      EnableControls;
    end;
  end;
end;
發表人 - Rain 於 2004/01/08 13:59:33
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-01-08 14:50:34 IP:203.73.xxx.xxx 未訂閱
看樣子....好像也只能先這樣子囉!!    不過我還是抱著一線生機...期待那天Rain大大能找出較快的處理方式.... 畢竟這樣子才算是最完整的吧!!  < > 還是先謝謝您囉!! 順便祝大家.......新年快樂! < >
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-01-12 18:13:13 IP:218.18.xxx.xxx 未訂閱
你可以试试把你要重复使用的东西都放进Frame里。然后把Frame放到不同的FORM里,可以单独控制的。
系統時間:2024-11-23 15:44:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!