只用datasource將dataset的beforeedit事件插隊 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
嗯 我知道這個標題很奇怪,請耐心看看吧! 一般在用delphi寫資料庫的介面,常會將工具列以及一些基本的介面寫在一個from上,然後再用這個form來繼承使用,小弟我也不例外,不過,我只在base form上面放一個datasource(以下以ds1稱呼之),這樣做有好處,要引用這個form可以用bde,ado,ibx等裡裡扣扣的來接,壞處是...嗯...很多... 舉其中一個例子來說好了,如果你是自訂工具列而不是dbnavigator,你也不希望使用者直接輸入後改變dataset的state,通常可以的做法是 1.設定ds1的autoedit為false, 2.在formcreate的時候把所有的control給enable=false,然後按下工具列再把enable=true,觀察levin之前上傳的進銷存作品就是如此的做法,可是如果你有pagecontrol那也不妥,你不能在不同的page間選擇,可是使用者權限設定還有個權限是可以瀏覽的吧,這樣不就剝奪人家的權利了,也是不妥不妥... 所以還是要設定ds1的autoedit屬性才是... 之所以會有這篇,實因小弟碰到障礙,然後想辦法去處理的,因為小弟有個案子是把他寫成使用者在dbedit用滑鼠點兩下就可以關聯帶出視窗選擇後返回,程式是這樣寫的:
dt1.edit; dt1customerid.value:=getcustomerid(sender);也就是說我已經在程式碼裡面自動進入編輯模式了,那該怎麼辦,我又不想改現有的程式,還有以懶人寫作法的宗旨來說,可以在baseform搞定就不要每個頁面做... 因此,我在baseform放一個scope為form的變數bcanedit,當按下工具列的"編輯"與"新增"按鈕,將之為true,回到瀏覽模式則為false,這麼一來只要在每個繼承他的form的ds1的dataset的beforeedit事件去判斷bcanedit是否為true,就可以規範使用者一定要透過工具列才可以編輯,那麼,這又違背了懶人設計法,所以 1.在baseform宣告一個事件變數,scope範圍為form, public v:tdatasetnotifyevent ...2.在formcreate寫 v:=ds1.dataset.beforeedit; ds1.dataset.beforeedit:=self.beforeedit;這裡讓ds1.dataset的beforeedit轉向到自訂的beforeedit事件,並用v去接原有的 3. 自訂的beforeedit如下 if bcanedit=false then begin showmessage ('請由工具列按鈕編輯'); abort; end else begin if assigned(v) then begin v(ds1.dataset); end; end;你永遠不知道ds1在後代的form中連結的dataset是否會有beforeedit的程式碼會加入,所以呢,在baseform這裡就必須為後代著想好, 懶人設計法之只在baseform放datasource,成功!!! p.s.儘管是懶人設計法,不過,寫baseform還真是他x的不好玩,要想很多... |
superlevin
高階會員 發表:181 回覆:313 積分:180 註冊:2003-01-12 發送簡訊給我 |
引言: 觀察levin之前上傳的進銷存作品就是如此的做法,可是如果你有pagecontrol那也不妥,你不能在不同的page間選擇,可是使用者權限設定還有個權限是可以瀏覽的吧,這樣不就剝奪人家的權利了,也是不妥不妥...哈~我還被拿來當活生生的例子吶!不過,又有想法了~二個月後大家拭目以待唄!先賣個關子~ 程式不是寫來玩的 而是要創造價值
------
林壽山 網站: http://superlevin.ifengyuan.tw mail: superlevin@gmail.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |