Menu使用問題 |
尚未結案
|
GDMichael
一般會員 ![]() ![]() 發表:27 回覆:36 積分:12 註冊:2004-10-13 發送簡訊給我 |
如果有張MidiForm,裏面有一個TMainMenu,我想問有方法可以在MenuItem裏記著指向那一個midi form的class呢?因為每張midi form都會有registerclass,mainform(midi form)會透過registerclass的名稱去create midi form,但是如果有100個menu就要寫一個句menuitem_click的event去create midi form,這不太夠object-oriented,而且...又不太方便...之前曾經想過修改menu item,好讓我加自己的property來記著這個名稱..但要實行實在困難...所以請問有其它方法嗎?
|
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
GDMichael
一般會員 ![]() ![]() 發表:27 回覆:36 積分:12 註冊:2004-10-13 發送簡訊給我 |
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
Hi,GDMichael:
如果你的每個MDIChild的form,都有呼叫registerclass註冊的話,那麼可以應用metaClass的功能,可以共用同一隻procedure,去建立每個mdichild form.如下:
var Form:TForm; begin //讓ID變作你要執行的childform的classname.... Form := TFormClass(FindClass(ID)).Create(Application); end;補充說明: 1.FindClass可以字串的方式傳入class name,然後回傳該class.應用TFormClass.Create就可以去動態建立你的child form了. 2.在這種情況下,你不用在main form去uses你的child form所屬的pas檔. |
GDMichael
一般會員 ![]() ![]() 發表:27 回覆:36 積分:12 註冊:2004-10-13 發送簡訊給我 |
|
GDMichael
一般會員 ![]() ![]() 發表:27 回覆:36 積分:12 註冊:2004-10-13 發送簡訊給我 |
|
yachanga
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
Hi GDMichael 您好:
change.jian版大已經點出Point...
小弟就我的專案再詳加敘述.. 共用的Event 可以簡單如下
function TForm1.CreateForm(className: String): TFORM;
var
Form:TForm;
begin
//讓ID變作你要執行的childform的classname....
Form := TFormClass(FindClass(className)).Create(Application);
result:=Form;
end; 至於您提到code裏面必須知道是那一個名稱(即regiseterclass那個),
1. 您可以定義在每一個menuItem中某個參數..不過修改menuitem很累人
2. 定義在文字檔如INI檔
3. 定義在資料庫table, 我是用這個方法 當系統重新啟動時, 就把INI檔或是資料庫的menuitem load進來,
用程式塞到menuItem 某個屬性...
這樣就可以囉~
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
給你的例子裡就是你使用metaclass的做法.當然,重點是你的ID值(延續我上面貼的code)要如何產生.這就需要自己去設計這個機制了. 就我自己的作法,我的MenuItem是動態產生的.其內容是由使用者所訂定的權限控管而定,資料就存在資料庫裡.程式在確認使用者身份後,讀取該user可以執行的form 清單,然後動態產生.因為是動態產生,所以,在產生MenuItem時,其Name我設為miXXXX,該XXXX即為對應的form的className.所以,我的ID就依觸發的MenuItem的Name來產生的,然後就像上述以metaclass的方式建立form. 而依你所述,似乎是用一個array去儲存各個childform的class name.我不太懂你的目前的問題是什麼?假設你是嫌用array去儲存麻煩,因為每增加一個form就要去修改array的內容的話,那建議你可以在MainForm一開始就建立一個全域的TStringList變數,然後在每個child form的initialization區段把自己的classid存入該變數內.這樣,你的MenuItem就可以去讀取該StringList的內容來產生ID值,然後去建立form了. 如果還沒有猜中,建議你把你目前覺得要改的code貼上來,這樣別人較好幫你找到答案
引言: 或者我應該這樣說...如果我用一個method去handle全部的menu item 去create childform,那麼我在code裏面必須知道是那一個名稱(即regiseterclass那個),然而menuitem郤沒有儲存這個名稱,所以要用一個大array去儲著..這實在不方便...所以想問有什麼方法可以解決... |
GDMichael
一般會員 ![]() ![]() 發表:27 回覆:36 積分:12 註冊:2004-10-13 發送簡訊給我 |
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
initialization的執行,不會因為是否auto-create而影響執的.在project一開始時,最先執行的,就是每個pas的這個區段裡的程式.不然,你的child form的registerclass是寫在那裡的?難道不寫在initialization嗎?
引言: To: change.jian 你說在child form的initialization區段寫入去stringlist,但這是否要在將project的option的childform都auto-create了先嗎?因為不是available的form,會讓程式一開始就load了很多到memory...那好像不是太好...發表人 - change.jian 於 2004/10/27 16:33:53 |
GDMichael
一般會員 ![]() ![]() 發表:27 回覆:36 積分:12 註冊:2004-10-13 發送簡訊給我 |
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
這樣(加個begin-end)
Initialization Begin RegisterClass(TMainCustomerForm); StringList.Add('TMainCustomerForm'); //那個StringList是你的變數名稱吧?! end End. 引言: 請問是這樣: Initialization RegisterClass(TMainCustomerForm); StringList.Add('TMainCustomerForm'); End. 在MainCustomerForm到uses一個global unit,並使用其StringList,這樣,我對嗎? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |