全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1093
推到 Plurk!
推到 Facebook!

Design 問題..

尚未結案
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-07 12:06:19 IP:203.185.xxx.xxx 未訂閱
小弟之前寫了一個application,而家要寫一個新system,所以想將之前寫的application重新design. 之前的application,每張form都會有的CheckValidation, DoSave, DoRetrieveRecord, DoDelete, .....由於舊有的design係當係db到咱牧榛ata之後就放進editbox,checkbox等等...如果要save data就要從那些control到組合成一個sql statment的指令去儲存資料... 現在想使用新的方法是用一個大型的array/structure/object去記錄那張form的control會對應的attribute,情況如下... Struct : ControlName : String; ControlType : String; DBFieldName : String; ControlColor : String; DefaultValue : String; 我想用一個array of structure去記錄該form會用到的control.... 現在我想的是...我曾經試過pass一張form,如customerform到一個commonfunction,要所對應的是用tform去接,如ConvertColor(form: TForm, Array of Structure) 這樣如果要轉換form的control的color就只要寫一個function,和在每張form的array of structure中定義了其control的color便可...好像相當方便..但是我不知道為什麼當我用tform來接,郤不能將customerform的control的component找到...因為tform不會有這樣的control...那我應該怎麼辦? 再者,我也想問這種design好嗎?有沒有人有類似的經驗,想將delphi的application再進行oo化呢? 因為其實也討論過,就是連validation也common化,不過如果簡的validation,如check是否數字/字母,這些也很易做到,但如果involve到可能唔知要check番那個數值不能大於某個數值..那應該怎麼辦... 好像很難明...如果不明白,請出聲... 希望各位多多指教 ^^
change.jian
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-07 13:20:43 IP:61.218.xxx.xxx 未訂閱
hi,BorlandUser: 1.你的問題說了一堆,確實很難讓人懂.尤其是一個架構,僅靠幾個文字述敘.建議你直接把有問題的source code丟上來,大家幫你看也許可以快點找到答案. 2.我也是跟你一樣,以OO的方式來設計的.不過我的做法略有差別,我把GUI界面(即一個form)與對後端資料存取的動作分開來,分別設計成一個GUI的祖先物件與DB的祖先物件.然後每個form再去繼承這個GUI.並與DB的繼承物件做搭配. 由於大部分的程式都在祖先物件裡定義好了.所以當後面有新的功能要增加或者新的操作流程要增加時,幾乎都只對祖先物件做修改,相當的有彈性.而且寫程式的速度超快,一個人一天可以寫上20來隻沒有問題.
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-07 14:14:38 IP:203.185.xxx.xxx 未訂閱
1. 這個問題大慨可以不理... 2. 我對你的design很有興趣...因為公司正正想要design一個好的結構,無奈自己功力有限...請問你能否上傳你的source code作參考呢?當然,你可以把不能給別人知道的code刪掉...如果也不能,能否以圖示或一些sample來解說呢?正如你所說,結構不是那麼容易用文字就表達出來... 懇請你的幫忙... ^^
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-07 15:39:02 IP:203.185.xxx.xxx 未訂閱
剛發現版主大大在18/8/2004那天發表了一個OO的實例. example還未下,因為公司沒有軟件可以開rar,要回家才能開,不過看過你的文章,實在寫得太好了... 我現在的情況就是這樣,寫一個商業系統,但每張form郤離不開就是add,change,delete,retrieve等功能,至少每張form所對應的table或field是不同而已...實在寫到有點煩..因為要改的時候..實在費時,而且開發時間也很長... 老實說,如果版主能分亨一下,你如何用oo去完成你的系統,我相信會有助各programmer對oo的認識,而且也會令大家獲益不少...希望版主大大能幫下大家...因為我現在接了新project,真的不想再用舊的方法去做...這樣實在太悶..也太煩...請大大幫忙 ^^
change.jian
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-07 17:20:32 IP:61.218.xxx.xxx 未訂閱
1.很抱歉,source code無法放上來.目前公司能夠領先其他公司的,就是靠這一塊而已.   或者,我們可以討論的方式,另外開一個文章來討論    2.其實那篇文章只是我的工作心得而已,並沒有什麼值錢的技術在裡面.後續,我會利用空閒的時間,   繼續把這方面的心得整理出來與大家分享(畢竟已答應天使大人了) class="code"> unit UI_CR_ITEM; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, UI_EditAncester, DB, DBClient, Provider, Menus, ImgList, Grids, Wwdbigrd, Wwdbgrid, ComCtrls, ToolWin, ExtCtrls, StdCtrls, Mask, DBCtrls, Buttons, ObjCR_ITEM; type TfrmCR_ITEM = class(TfrmEditAncester) xLabel_CR_ITEM_NO: TLabel; xEdit_CR_ITEM_NO: TDBEdit; xLabel_CR_ITEM_DESC_CHE: TLabel; xEdit_CR_ITEM_DESC_CHE: TDBEdit; xLabel_CR_ITEM_DESC_ENG: TLabel; xEdit_CR_ITEM_DESC_ENG: TDBEdit; xLabel_KEYIN_SYS_ID: TLabel; xEdit_KEYIN_SYS_ID: TDBEdit; xLabel_KEYIN_DT: TLabel; xEdit_KEYIN_DT: TDBEdit; procedure FormCreate(Sender: TObject); procedure ToolButtonOKClick(Sender: TObject); private FObj:TCR_ITEMObj; public { Public declarations } end; var frmCR_ITEM: TfrmCR_ITEM; implementation {$R *.DFM} uses MainForm,SingleTableObj,QueryData,utility; procedure TfrmCR_ITEM.FormCreate(Sender: TObject); begin FObj:=TCR_ITEMObj.Create(Self); FUIObj:=TstObj(FObj); inherited; end; procedure TfrmCR_ITEM.ToolButtonOKClick(Sender: TObject); begin ClientDataSet1.FieldByName('KEYIN_SYS_ID').AsString:=CurrentUser.UserSysId; ClientDataSet1.FieldByName('KEYIN_DT').AsString:='12345'; //這個參數後端SP會定 inherited; end; initialization begin RegisterClasses([TfrmCR_ITEM]); GlobalssFormList.Add('報關計數項目(CR_ITEM)=CR_ITEM'); end; end.
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-08 09:31:55 IP:203.185.xxx.xxx 未訂閱
code 就是這麼簡單..但也不太看得懂...怎麼辦..公司又要求我做到oo,但我也未有這種能力.. 請問你可否用圖型來作表示你的form的inherited情況及method的分配呢? 有圖看了,明白了,那就不用看code也可以自己develop...
change.jian
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-08 10:45:32 IP:61.218.xxx.xxx 未訂閱
1.看不太懂是正常的,這個只是告訴你為何可以把程式"量產"而已. 2.如何OO我沒有辦法用圖示表示出來.至於我的系統架構,其實就之前說的,只是分成兩大部分去做物件,然後分別繼承下來. 3.如果可以的話,你可以把你的一個source code放上來,我可以幫你看那些部分可以用OO的方式包裝起來...
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-08 11:03:45 IP:203.185.xxx.xxx 未訂閱
1. >_< 2. >_< 3. source code我也未完全寫好,所以很難去上傳,而且現在還是design structure 方面..不過我會解說一下現在的情況給你聽,希望你能早日回覆及幫助,謝
change.jian
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-08 11:13:21 IP:61.218.xxx.xxx 未訂閱
你要OO之前,必需要先對你的程式做出完整的操作規劃.所謂完整的規劃,是指新增一筆資料如何操作,修改一筆資料如何操作,刪除一筆資料如何操作,查詢如何操作,如果有Reference又要如何操作,Master-Detail如何操作..定出確定的操作方式後,接者就可以確定你的程式要如何去實作,包含前端的Delphi到後端的DB.把所有的程式流程確定後,最後才是去做OO的規劃
引言: 1. >_< 2. >_< 3. source code我也未完全寫好,所以很難去上傳,而且現在還是design structure 方面..不過我會解說一下現在的情況給你聽,希望你能早日回覆及幫助,謝
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-08 11:35:09 IP:203.185.xxx.xxx 未訂閱
現在的情況下: 小弟現在要寫一個ERP系統,裏面會有分為maintain,operation,report等等功能: 1. maintain可以分為customer,supplier,product等.. 2. operation可以分為quotation, purchase order, sales order, invoice等等... 而每張form都會有分為add,modify,view等mode(s)...不同user可以進行不同權限的控制.... 之前用delphi寫過類似的system,那時的design是每張form都會有自己的new, modify, save,delete等procedure, 每張form會視乎form元件和對應的db的table及field去進行儲存,條改或delete. 例如: MaintainCustomer.DoSave() Begin strSQL := 'Insert Customer (Field1, Field2, ........)' 'Values (Control1.Text, Control2.Text,....)'; End; 總之就會進行insert或update的sql statment,(我想你也會明白....) 其它form也有類似的save功能,只是有些form可能含有多過一個table,所以在save那時會較多行code而已..... 隨此之外,還有delete,或存取的功能,這些我想你也會明白...因為大部份系統也是這樣... 當然隨了這些外,還會有附加功能,如validation或control跟據不同的mode而有所不同的顏色轉換,如: ------- Color Convert ---------- If (mode = 'Add') Then Control1.Color := clBlack; Else Control1.Color := clWhite; ----------- Validation -------------- If (Control1.Text = '') Then ShowMessage(''); 雖然每張form的元件不同,有時條件上也會有不同,但做的事也是類同.... 還有一點,我是mysql為db,而且我們的做法是不會直接連著db,即control是不會和db有連繫,所以我們會用sql statement去select我們想要的field,然後用fieldbyname('').value去pass到對應的control, save也會是這樣,總之就是雖要存取data時才和db連上而已....這和單機visual basic用一些dbgrid, dbedit會有所不同的.... 剛才的是我之前的project做法..而現在想用的新方法是用一個structure或arrya,如下: type struct StructFormControl Name : String; Type : String; Color : String; ReferTable : String; ReferField : String; DefaulValue : String; 之後每一張form,如customer form會有一個array of structure, 如: cusCtrl : Array[1...10] of StructFormControl 接著便把customer form的control assign入去,如 'Customer_Code', 'Edit', 'Black', 'Customer', 'Code', '' 之後就是寫一系的common function,如convert color,只要把對應的form的array pass進那個convert color的function,透過form.count去loop,就可以把該form的control的color轉換掉 這種design看似不錯,但郤沒有什麼oo成份,而且不是真的那麼有效率,因為我們還想把save也寫成一個共用function,如剛才convert function一樣,只要我們pass了那個對應array,就會自己組合那個sql statement,這樣就可以進行retrieve,save等功能...不過真是這樣做郤不是那麼容易,因為每張form都會有不同save的條件或方法.... 這個就是我那麼急切要問你有何方法去改善的.... 如果你不能將你的idea post出來,你也可以email給我的.. m w k 1 2 1 5 @ h o t m a i l . c o m 還有,如果有什麼看不明白,請立刻出聲...我會盡力解釋 希望得到版主大大的幫忙, 感謝萬分 ^^
change.jian
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-08 13:31:52 IP:61.218.xxx.xxx 未訂閱
以下是我想到的做法: 1.關於struct,不要用array,改用record的方式去定義.然後,定義一個物件,用來管理這些record.
type
  PStructFormControl = ^TStructFormControl; 
  TStructFormControl = record
    Name : String;
    Type : String;
    Color : String;
    ReferTable : String;
    ReferField : String;
    DefaulValue : String;
  end;
  //然後建立一個物件,用TList來管理
  //(或者網站上有人從TList繼承下來也可以,不過我比較不建議),如下:
  var
  FList:TList;
  ....
  function AddControl(Name,Type....):Integer;
  var
    PSFC:PStructFormControl;
  begin
    new(PSFC);
    PSFC.Name := Name;
    PSFC.Type := Type;
    ...
    Result:=FList.Add(PSFC); 
  end;
  //類似以上的方式,把你在做common function時會需要用到的資訊全都加進來管理,
  //所以這個struct會需要那些就由你自己決定
  //然後把common function寫在祖先物件裡,藉由FList的管理,可以去讀取到這些一開始不存在的資料(因為這些資料會在你後代的form產生時才去呼叫AddControl把資訊加進去),以執行你的common function.
2.把CheckValidation,DoSave,DoRetrieveRecord(這個function是做什麼的,好奇問一下),DoDelete拆開來.就像TDataSet的post,會有BeforePost,Post,AfterPost的方式,然後把這些拆開來的function或procedure定義在祖先物件裡,記得要宣告為virtual.繼承的form如果沒有什麼特別的需求,就不用去重寫這些拆開來的方法,需要時,只要override這些procedure,去inherited,或者整個重寫,不延用祖先物件也可以. 例如,我在Append一筆資料時,會呼叫SetDataStatus方法,把後代元件的control元件全部Disabled或Enabled.當繼承的form如果在新增時,仍然想讓某個control元件為Disabled狀態(不讓user輸入),那麼後代form就可以繼承SetDataStatus這個方法,如下:
procedure TfrmSALBASE.SetDataSatus(BrowseData: Boolean);
begin
  inherited;
  xEdit_EMPCODE.Enabled:=True; //這個欄位不管新增或瀏覽不允許修改
end;
3.建議你對你的control元件要有一定的命名規則,對你定義StructFormControl及祖先物件的撰寫會有幫助的 ....以上是我想到的...呼,好累,你的分數真難賺
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-08 14:11:12 IP:203.185.xxx.xxx 未訂閱
很多謝版主大大的回應,而且也很詳細地分析了我的問題,不過我也需要一點時間去消化一下... 再者我想問inherited其實其用法為何呢? DoRetrieveRecord是用作存取檔案資料.... 正如你所說,是否要寫一個Form,如TMyForm 去 inherited TForm,在這個MyForm裏面則加上DoSave, DoDelete等元件...然後再由其它child form去inherited嗎? PS.你對我design有何意見?
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-08 14:20:10 IP:203.185.xxx.xxx 未訂閱
越是高深的問題,難度就越高,分數也越難賺,不然就沒有意思了 [:-p]
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-10-08 14:20:38 IP:203.185.xxx.xxx 未訂閱
越是高深的問題,難度就越高,分數也越難賺,不然就沒有意思了 
change.jian
版主


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-10-08 16:38:21 IP:61.218.xxx.xxx 未訂閱
1.inherited是繼承的意思,代表執行祖先物件的程式.你可以找一下關於Delphi的物件導向設計的相關資料.另外,inherited不能放在if裡面    2.TMyForm就是你的祖先畫面.然後你所有的畫面都從這個TMyForm繼承下來即可.   順帶一提,有空時可多看看VCL元件的source code,裡面有很多佈局巧妙的source code,可以幫你打通任督二脈.    3.確實是很高深的問題,討論到"連標題都發火"了 <>< face="Verdana, Arial, Helvetica">引言: 很多謝版主大大的回應,而且也很詳細地分析了我的問題,不過我也需要一點時間去消化一下... 再者我想問inherited其實其用法為何呢? DoRetrieveRecord是用作存取檔案資料.... 正如你所說,是否要寫一個Form,如TMyForm 去 inherited TForm,在這個MyForm裏面則加上DoSave, DoDelete等元件...然後再由其它child form去inherited嗎? PS.你對我design有何意見?
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-10-08 16:48:56 IP:203.185.xxx.xxx 未訂閱
1. 很多謝大大的意見和分析,讓我學會不少,真是要再三多謝你 ^^    2. 就是要大家有這種對program的"火"才能使到大家都會進步,也能夠使到這裏熱鬧起來,不然這裏沒便沒有存在的價值    
系統時間:2024-07-07 9:09:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!