unit MainUnit; interface uses { Delphi } Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Actions, Vcl.ActnList, System.ImageList, Vcl.ImgList, Vcl.Menus, Vcl.StdCtrls, Data.DB, { DevExpress } dxForms, cxGraphics, dxUIAClasses, cxControls, dxLayoutControlAdapters, dxLayoutContainer, cxButtons, cxClasses, dxLayoutControl, cxStyles, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxNavigator, dxDateRanges, dxScrollbarAnnotations, cxDBData, cxGridLevel, cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, dxmdaset, dxLayoutcxEditAdapters, cxTextEdit, cxCurrencyEdit, cxContainer, cxImageList, cxMaskEdit, cxSpinEdit, cxDBEdit, dxCore, dxStatusBar, { DevExpress Skin } cxLookAndFeels, cxLookAndFeelPainters, dxSkinsCore, dxSkinWXI, dxLayoutLookAndFeels, dxSkinsForm, { Custom } DataUnit, cxRadioGroup, cxGroupBox; type TfrmMain = class(TdxForm, IDataStateNotifier) lgRoot: TdxLayoutGroup; lcMain: TdxLayoutControl; lgToolbar: TdxLayoutGroup; lgInput: TdxLayoutGroup; lgGrid: TdxLayoutGroup; btnAdd: TcxButton; liAdd: TdxLayoutItem; btnEdit: TcxButton; liEdit: TdxLayoutItem; btnDelete: TcxButton; liDelete: TdxLayoutItem; btnPost: TcxButton; liSave: TdxLayoutItem; btnCancel: TcxButton; liCancel: TdxLayoutItem; dbtvEmployee: TcxGridDBTableView; grdEmployeeLevel1: TcxGridLevel; grdEmployee: TcxGrid; liGird: TdxLayoutItem; dbtvEmployeeRecId: TcxGridDBColumn; dbtvEmployeename: TcxGridDBColumn; dbtvEmployeeage: TcxGridDBColumn; dbtvEmployeeposition: TcxGridDBColumn; dbtvEmployeesalary: TcxGridDBColumn; dbtvEmployeeaddress: TcxGridDBColumn; dbteName: TcxDBTextEdit; dxLayoutItem2: TdxLayoutItem; dbseAge: TcxDBSpinEdit; dxLayoutItem3: TdxLayoutItem; dbtePosition: TcxDBTextEdit; dxLayoutItem4: TdxLayoutItem; dbseSalary: TcxDBSpinEdit; dxLayoutItem5: TdxLayoutItem; dbteAddress: TcxDBTextEdit; dxLayoutItem6: TdxLayoutItem; dxLayoutAutoCreatedGroup1: TdxLayoutAutoCreatedGroup; acToolbar: TActionList; acAdd: TAction; acEdit: TAction; acDelete: TAction; acSave: TAction; acCancel: TAction; scTheme: TdxSkinController; dxLayoutLookAndFeelList: TdxLayoutLookAndFeelList; dxLayoutSkinLookAndFeel1: TdxLayoutSkinLookAndFeel; sbMain: TdxStatusBar; dbtvEmployeeColumn1: TcxGridDBColumn; rgWorkType: TcxRadioGroup; dxLayoutItem1: TdxLayoutItem; rbWorkType1: TcxRadioButton; rbWorkType2: TcxRadioButton; rbWorkType3: TcxRadioButton; dxLayoutAutoCreatedGroup2: TdxLayoutAutoCreatedGroup; dxLayoutAutoCreatedGroup3: TdxLayoutAutoCreatedGroup; dbrgWorkType: TcxDBRadioGroup; dxLayoutItem7: TdxLayoutItem; dxLayoutAutoCreatedGroup4: TdxLayoutAutoCreatedGroup; procedure DataSetCRUD(Sender: TObject); procedure FormCreate(Sender: TObject); procedure dbtvEmployeeCellClick(Sender: TcxCustomGridTableView; ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton; AShift: TShiftState; var AHandled: Boolean); private procedure NotifyDataSetStateChange(const AState: TDataSetState); public { Public declarations } end; TWorkType = (신입, 근속자, 퇴사자); var frmMain: TfrmMain; implementation {$R *.dfm} procedure TfrmMain.DataSetCRUD(Sender: TObject); // action에 Tag로 하나의 함수로 리펙토링 begin var Tag:= TAction(Sender).Tag; Case Tag of 1: // 추가 begin dmData.mdEmployee.Append; dbteName.SetFocus; end; 2: dmData.mdEmployee.Edit; // 수정 3: dmData.mdEmployee.Delete; // 삭제 4: dmData.mdEmployee.Post; // 저장 5: dmData.mdEmployee.Cancel; // 취소 End; end; procedure TfrmMain.dbtvEmployeeCellClick(Sender: TcxCustomGridTableView; ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton; AShift: TShiftState; var AHandled: Boolean); var RecInx, ColInx: integer; begin var Controller:= TcxGridDBTableView(Sender).DataController; RecInx:= ACellViewInfo.RecordViewInfo.Index; ColInx:= Controller.GetItemByFieldName('worktype').Index; var WorkType:= Controller.Values[RecInx, ColInx]; if WorkType = 신입 then rbWorkType1.Checked:= True else if WorkType = 근속자 then rbWorkType2.Checked:= True else if WorkType = 퇴사자 then rbWorkType3.Checked:= True; { Case문을 활용한 아래 코드 case VarAsType(WorkType, varInteger) of 0: rbWorkType1.Checked:= True; 1: rbWorkType2.Checked:= True; 2: rbWorkType3.Checked:= True; end; } end; procedure TfrmMain.FormCreate(Sender: TObject); begin // DataSet State를 DataUnit으로 분리(유닛간 결합도를 분리) 리펙토링 if Assigned(dmData) then dmData.SetNotifier(Self); end; procedure TfrmMain.NotifyDataSetStateChange(const AState: TDataSetState); begin acSave.Enabled:= Not(AState in [dsBrowse]); end; end.