Design 問題.. |
尚未結案
|
BorlandUser
中階會員 發表:148 回覆:217 積分:73 註冊:2004-02-19 發送簡訊給我 |
小弟之前寫了一個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 發送簡訊給我 |
hi,BorlandUser: 1.你的問題說了一堆,確實很難讓人懂.尤其是一個架構,僅靠幾個文字述敘.建議你直接把有問題的source code丟上來,大家幫你看也許可以快點找到答案. 2.我也是跟你一樣,以OO的方式來設計的.不過我的做法略有差別,我把GUI界面(即一個form)與對後端資料存取的動作分開來,分別設計成一個GUI的祖先物件與DB的祖先物件.然後每個form再去繼承這個GUI.並與DB的繼承物件做搭配.
由於大部分的程式都在祖先物件裡定義好了.所以當後面有新的功能要增加或者新的操作流程要增加時,幾乎都只對祖先物件做修改,相當的有彈性.而且寫程式的速度超快,一個人一天可以寫上20來隻沒有問題.
|
BorlandUser
中階會員 發表:148 回覆:217 積分:73 註冊:2004-02-19 發送簡訊給我 |
|
BorlandUser
中階會員 發表:148 回覆:217 積分:73 註冊:2004-02-19 發送簡訊給我 |
剛發現版主大大在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 發送簡訊給我 |
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 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
BorlandUser
中階會員 發表:148 回覆:217 積分:73 註冊:2004-02-19 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
你要OO之前,必需要先對你的程式做出完整的操作規劃.所謂完整的規劃,是指新增一筆資料如何操作,修改一筆資料如何操作,刪除一筆資料如何操作,查詢如何操作,如果有Reference又要如何操作,Master-Detail如何操作..定出確定的操作方式後,接者就可以確定你的程式要如何去實作,包含前端的Delphi到後端的DB.把所有的程式流程確定後,最後才是去做OO的規劃
引言: 1. >_< 2. >_< 3. source code我也未完全寫好,所以很難去上傳,而且現在還是design structure 方面..不過我會解說一下現在的情況給你聽,希望你能早日回覆及幫助,謝 |
BorlandUser
中階會員 發表:148 回覆:217 積分:73 註冊:2004-02-19 發送簡訊給我 |
現在的情況下:
小弟現在要寫一個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 發送簡訊給我 |
以下是我想到的做法:
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 發送簡訊給我 |
|
BorlandUser
中階會員 發表:148 回覆:217 積分:73 註冊:2004-02-19 發送簡訊給我 |
|
BorlandUser
中階會員 發表:148 回覆:217 積分:73 註冊:2004-02-19 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |