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

Menu使用問題

尚未結案
GDMichael
一般會員


發表:27
回覆:36
積分:12
註冊:2004-10-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-26 16:37:31 IP:203.185.xxx.xxx 未訂閱
如果有張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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-26 17:49:12 IP:61.222.xxx.xxx 未訂閱
如果有100個menu共用同一個menuitem_click的event
GDMichael
一般會員


發表:27
回覆:36
積分:12
註冊:2004-10-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-27 09:21:26 IP:203.185.xxx.xxx 未訂閱
但是這個共用event豈不是要寫一大堆if?因為menu item並沒有記著對應的registerclass name?
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-27 10:16:58 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-27 11:25:25 IP:203.185.xxx.xxx 未訂閱
對不起版主..我不太明白什麼是metaclass?怎樣可以使用? 剛才你的example已經用了嗎?
GDMichael
一般會員


發表:27
回覆:36
積分:12
註冊:2004-10-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-27 12:20:33 IP:203.185.xxx.xxx 未訂閱
或者我應該這樣說...如果我用一個method去handle全部的menu item 去create childform,那麼我在code裏面必須知道是那一個名稱(即regiseterclass那個),然而menuitem郤沒有儲存這個名稱,所以要用一個大array去儲著..這實在不方便...所以想問有什麼方法可以解決...
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-27 13:20:25 IP:203.67.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-27 13:35:56 IP:61.218.xxx.xxx 未訂閱
給你的例子裡就是你使用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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-27 14:26:37 IP:203.185.xxx.xxx 未訂閱
To: change.jian 你說在child form的initialization區段寫入去stringlist,但這是否要在將project的option的childform都auto-create了先嗎?因為不是available的form,會讓程式一開始就load了很多到memory...那好像不是太好...
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-27 16:27:13 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-27 16:49:52 IP:203.185.xxx.xxx 未訂閱
請問是這樣: Initialization RegisterClass(TMainCustomerForm); StringList.Add('TMainCustomerForm'); End. 在MainCustomerForm到uses一個global unit,並使用其StringList,這樣,我對嗎?
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-27 17:15:03 IP:61.218.xxx.xxx 未訂閱
這樣(加個begin-end)
Initialization
Begin
  RegisterClass(TMainCustomerForm);
  StringList.Add('TMainCustomerForm'); //那個StringList是你的變數名稱吧?!
end
End.
引言: 請問是這樣: Initialization RegisterClass(TMainCustomerForm); StringList.Add('TMainCustomerForm'); End. 在MainCustomerForm到uses一個global unit,並使用其StringList,這樣,我對嗎?
系統時間:2024-06-15 23:26:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!