請教如何複製一個屬性完全相同的元件呢? |
尚未結案
|
SKYSTAR
中階會員 發表:76 回覆:198 積分:64 註冊:2002-06-10 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
SKYSTAR
中階會員 發表:76 回覆:198 積分:64 註冊:2002-06-10 發送簡訊給我 |
不好意思....我再說明清楚一下我想要的功能....!! 假設在Form1中有一個Table1,且加入了永久性欄位,也在很多事件中設定了一些
程序,如新增後...存檔後...等等....
然後在Form2中並沒有Table的元件....此時我想透過某事件,如OnCreate時,由
該事件程序中,以程式來產生一個和Form1的Table1一模一樣的Table,當然啦,這
個產生的Table是位在Form2中的,只是我該如何可以很快的,或是說該如何很簡
便的去產生它呢?
這裡所指的很快或是很簡便的產生, 是指將Form1中的Table1的所有屬性及事件
設定,包含永久性欄位...等等...原封不動的設定給這一個新增的Table....!! 再說明一下前提....是由程式來產生一個新Table...而不是在設計模式中去產
生的,....自然...用整個Form的元件寶庫的方式...並不是我想要的!! 不知道這樣子...是否能更了解了呢? Thanks!!
|
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
轉自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 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
|
SKYSTAR
中階會員 發表:76 回覆:198 積分:64 註冊:2002-06-10 發送簡訊給我 |
|
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
引言: 謝謝各位大大們的幫忙測試...!! 只是到目前為止,尚沒有一個最完整且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 發送簡訊給我 |
引言:引言: 謝謝各位大大們的幫忙測試...!! 只是到目前為止,尚沒有一個最完整且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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言:引言: To: Rain大大.... 不好意思.... 剛才再試了一下您所給的程序.....果然是可以達到我所要的功能了.... 可是...最重要的一點....卻沒法子完成.... 那就是如果我所代入的參數,如果是 > >>< face="Verdana, Arial, Helvetica"> 這就奇怪了、剛剛在這邊用ADO元件試了一下、沒有出現問題、資料也可以保存、TTable也試了一下、沒有出錯資訊、複製TableName之類的屬性也沒有問題、因為我這邊的BDE老早以前就壞掉了、沒用、就沒去管它、所以沒辦法測試一下資料可不可以更新、按理說也應該可以、需要注意的一點是在複製以前如果Table.Active := True則Table.Close; 另外不知道你那邊具體的出錯資訊是什麼、在哪邊出錯呢? 發表人 - Rain 於 2004/01/07 11:59:43To: Rain大大..... 哈...太感謝啦!! 我已經成功的經由您所給的程序,達到我想要的功能了....!! 至於前一篇說到 > ) 不管怎樣....這一篇的分數....一定是要給 > |
Rain
資深會員 發表:31 回覆:236 積分:268 註冊:2003-02-17 發送簡訊給我 |
引言: 另外,這一支程序是否不須經由任何修改,就可以達到所有元件的完全複製呢? (指:可視及不可視元件...簡單說應該是指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 發送簡訊給我 |
引言:引言: 另外,這一支程序是否不須經由任何修改,就可以達到所有元件的完全複製呢? (指:可視及不可視元件...簡單說應該是指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 發送簡訊給我 |
引言: 那就是....要如何改這一個程序,而達到連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 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |