Ex) 기존 DataSet Filter 사용 시
var
DataSet : TDataSet;
begin
with DataSet do begin try DisableControls; Filtered := False; Filter := 'Test = ''T'''; Filtered := True; if RecordCount = 0 then begin ShowMessage('선택한 데이터가 없습니다.'); Exit; end; Filtered := False; Filter := 'Test = ''F'''; Filtered := True; if RecordCount = 0 then begin ShowMessage('선택한 데이터가 없습니다.'); Exit; end;
finally Filtered := False; Filter := ''; EnableControls; end; end;
end;
코드 적용 후(인터페이스의 특성을 활용하여 try..finally 및 코드 반복을 줄임)
var
AutoFilter : IAutoFilter;
begin
//생성 시 필터 적용, 현재 메소드가 끝나면 자동으로 필터 해제
AutoFilter := TAutoFilter.Create(DataSet, 'Test = ''T''');
if AutoFilter.RecordCount = 0 then begin ShowMessage('선택한 데이터가 없습니다.'); Exit; end;
AutoFilter.Filter('Test = ''F''');
if AutoFilter.RecordCount = 0 then begin ShowMessage('선택한 데이터가 없습니다.'); Exit; end;end;
AutoFilter 만들기
IAutoFilter = interface procedure Filter(AFilter: string = ''; OnOff: Boolean = True); function RecordCount: Integer; end; TAutoFilter = class(TInterfacedObject, IAutoFilter) private FDataSet: TDataSet; public procedure Filter(AFilter: string = ''; OnOff : Boolean = True); function RecordCount: Integer;
constructor Create(ADataSet: TDataSet; AFilter: string = ''); destructor Destroy; override; end;
{ TAutoFilter } constructor TAutoFilter.Create(ADataSet: TDataSet; AFilter: string); begin
//Create 할 때 데이터셋을 받아옵니다. FDataSet := ADataSet; FDataSet.DisableControls; Filter(AFilter); end; destructor TAutoFilter.Destroy; begin
//파괴될 때 자동으로 필터를 해제시킵니다.
Filter('', False); FDataSet.EnableControls; inherited; end; procedure TAutoFilter.Filter(AFilter: string; OnOff: Boolean); begin FDataSet.Filtered := False;
FDataSet.Filter := AFilter; FDataSet.Filtered := OnOff; end; function TAutoFilter.RecordCount: Integer; begin Result := FDataSet.RecordCount; end;