본문 바로가기

Delphi/끄적이기

DataSet Filter

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;


반응형