Files
DataSet_Demo/source/controller/DataUnit.pas
T
pagewiz@naver.com de67a00e75 데이타셋 데모
1. Tag를 활용한 리펙토링
2. Interface를 활용한 DataSet State 분리
2024-11-19 10:52:51 +09:00

81 lines
2.0 KiB
ObjectPascal

unit DataUnit;
interface
uses
{ Delphi }
System.SysUtils, System.Classes, Data.DB, dxmdaset, System.ImageList,
Vcl.ImgList, Vcl.Controls, cxImageList, cxGraphics,
{ Constom }
Employee.Model;
type
/// <summary>MainUnit에서 DataSet State를 사용하기 위해 인터페이스로 전달</summary>
IDataStateNotifier = interface
procedure NotifyDataSetStateChange(const AState: TDataSetState);
end;
TdmData = class(TDataModule)
mdEmployee: TdxMemData;
mdEmployeename: TStringField;
mdEmployeeage: TSmallintField;
mdEmployeeposition: TStringField;
mdEmployeesalary: TIntegerField;
mdEmployeeaddress: TStringField;
dsEmployee: TDataSource;
ilSmallIcons: TcxImageList;
procedure dsEmployeeStateChange(Sender: TObject);
procedure DataModuleCreate(Sender: TObject);
private
FNotifier: IDataStateNotifier;
public
procedure SetNotifier(ANotifier: IDataStateNotifier);
/// <summary>Employee 전체 데이타 반환</summary>
/// <returns>TArray<TEmployee> TEmployee 레코드를 배열로 반환</returns>
/// <remarks>예제함수</remarks>
function GetAllEmployee: TArray<TEmployee>;
end;
var
dmData: TdmData;
implementation
{$R *.dfm}
procedure TdmData.DataModuleCreate(Sender: TObject);
begin
mdEmployee.Active:= True;
end;
procedure TdmData.dsEmployeeStateChange(Sender: TObject);
begin
// DataSet 상태가 변할때 NotifyDataSetStateChange 메소드로 전달
if Assigned(FNotifier) then
FNotifier.NotifyDataSetStateChange(dsEmployee.DataSet.State);
end;
procedure TdmData.SetNotifier(ANotifier: IDataStateNotifier);
begin
FNotifier:= ANotifier;
end;
function TdmData.GetAllEmployee: TArray<TEmployee>;
begin
var Employees: TArray<TEmployee>;
var i:= 0;
SetLength(Employees, mdEmployee.RecordCount);
mdEmployee.First;
while Not mdEmployee.EOF do
begin
Employees[i].Name:= mdEmployee.FieldByName('Name').AsString;
Inc(i);
mdEmployee.Next;
end;
result:= Employees;
end;
end.