Bu unit program Database filtre 2 işleminde kullanılır.
Kod: Tümünü seç
unit ads_DlgDBFilter;
{Copyright(c)2000 Advanced Delphi Systems
Richard Maley
Advanced Delphi Systems
12613 Maidens Bower Drive
Potomac, MD 20854 USA
phone 301-840-1554
maley@advdelphisys.com
The code herein can be used or modified by anyone. Please retain references
to Richard Maley at Advanced Delphi Systems. If you make improvements to the
code please send your improvements to maley@advdelphisys.com so that the
entire Delphi community can benefit. All comments are welcome.
}
(*
Description: ads_DlgDBFilter.pas.pas
This unit contains
*)
interface
Uses DB;
{!~DlgDBFilter_ads
Presents a Dataset Filter dialog
}
Function DlgDBFilter_ads(DataSet: TDataSet): Boolean;
implementation
Uses
ads_Exception,
SysUtils,
WinTypes,
WinProcs,
Messages,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
Buttons,
ExtCtrls
;
Var
UnitName : String;
ProcName : String;
procedure ButtonReSizer(
ButtonBase : TPanel;
ButtonSlider : TPanel;
ButtonWidth : Integer;
ButtonSpacer : Integer;
ButtonsReSize : Boolean;
ButtonsAlignment: TAlignment;
Beveled : Boolean);
Var
MinFormWidth : Integer;
NButtons : Integer;
i : Integer;
NSpacers : Integer;
SpacerWidth : Integer;
SpacersWidth : Integer;
W : Integer;
LeftPos : Integer;
Begin
NButtons := ButtonSlider.ControlCount;
If ButtonSpacer > 0 Then
Begin
SpacerWidth := ButtonSpacer;
NSpacers := NButtons +1;
SpacersWidth := ButtonSpacer * NSpacers;
End
Else
Begin
SpacerWidth := 0;
SpacersWidth:= 0;
End;
MinFormWidth :=
SpacersWidth +
(NButtons * ButtonWidth) +
(ButtonBase.BorderWidth * 2) +
(ButtonBase.BevelWidth * 4) +
25;
Try
If ButtonBase.Parent is TForm Then
Begin
If ButtonBase.Parent.Width < MinFormWidth Then
Begin
ButtonBase.Parent.Width := MinFormWidth;
End;
End
Else
Begin
Try
If ButtonBase.Parent.Parent is TForm Then
Begin
If ButtonBase.Parent.Parent.Width < MinFormWidth Then
Begin
ButtonBase.Parent.Parent.Width := MinFormWidth;
End;
End
Else
Begin
Try
If ButtonBase.Parent.Parent.Parent is TForm Then
Begin
If ButtonBase.Parent.Parent.Parent.Width < MinFormWidth Then
Begin
ButtonBase.Parent.Parent.Parent.Width := MinFormWidth;
End;
End
Else
Begin
Try
If ButtonBase.Parent.Parent.Parent.Parent is TForm Then
Begin
If ButtonBase.Parent.Parent.Parent.Parent.Width < MinFormWidth Then
Begin
ButtonBase.Parent.Parent.Parent.Parent.Width := MinFormWidth;
End;
End
Else
Begin
{Not going to set a minimum form width}
End;
Except
End;
End;
Except
End;
End;
Except
End;
End;
Except
End;
If Beveled Then
Begin
ButtonBase.Height :=
(ButtonBase.BorderWidth * 2) +
(ButtonBase.BevelWidth * 4) +
2 {for borderStyle} +
25 {for standard button height} +
3;
End
else
Begin
ButtonBase.Height :=
(ButtonBase.BorderWidth * 2) +
25 {for standard button height} +
4;
End;
If ButtonsReSize Then
Begin
Buttonslider.Align := alClient;
W := (Buttonslider.Width - SpacersWidth) div NButtons;
LeftPos := SpacerWidth;
For i := 0 To NButtons - 1 Do
Begin
ButtonSlider.Controls[i].Align := alNone;
ButtonSlider.Controls[i].Top := 0;
ButtonSlider.Controls[i].Height := 25;
ButtonSlider.Controls[i].Width := W;
ButtonSlider.Controls[i].Left := LeftPos;
LeftPos := LeftPos + W + SpacerWidth;
End;
End
Else
Begin
ButtonSlider.Align := alNone;
If Beveled Then
Begin
ButtonSlider.Top :=
ButtonBase.BorderWidth +
(ButtonBase.BevelWidth * 2)+
1 + {For BorderStyle}
0; {For Margin}
End
Else
Begin
ButtonSlider.Top :=
ButtonBase.BorderWidth +
1; {For Margin}
End;
ButtonSlider.Height := 25;
ButtonSlider.Width :=
SpacersWidth +
(NButtons * ButtonWidth);
If (Not Beveled) Then
Begin
{Align totally left with not leftmost spacer}
If ButtonsAlignment = taLeftJustify Then
Begin
LeftPos := 0;
End
Else
Begin
If ButtonsAlignment = taRightJustify Then
Begin
{Align totally Right with not rightmost spacer}
LeftPos := 2 * SpacerWidth;
End
Else
Begin
LeftPos := SpacerWidth;
End;
End;
End
Else
Begin
LeftPos := SpacerWidth;
End;
For i := 0 To NButtons - 1 Do
Begin
ButtonSlider.Controls[i].Align := alNone;
ButtonSlider.Controls[i].Top := 0;
ButtonSlider.Controls[i].Height := 25;
ButtonSlider.Controls[i].Width := ButtonWidth;
ButtonSlider.Controls[i].Left := LeftPos;
LeftPos := LeftPos + ButtonWidth+ SpacerWidth;
End;
If ButtonsAlignment = taLeftJustify Then ButtonSlider.Align := alLeft;
If ButtonsAlignment = taRightJustify Then ButtonSlider.Align := alRight;
If ButtonsAlignment = taCenter Then
Begin
ButtonSlider.Align := alNone;
ButtonSlider.Left :=
(ButtonBase.Width -
ButtonSlider.Width) div 2;
End;
End;
ButtonBase.Refresh;
End;
procedure SetChildWidths(Panel : TPanel);
Var
i : Integer;
Width : Integer;
Begin
Width :=
(Panel.Width -
(Panel.BorderWidth * 2) -
(Panel.BevelWidth * 4)) div Panel.ControlCount;
For i := 0 To Panel.ControlCount - 1 Do
Begin
Panel.Controls[i].Width := Width;
End;
End;
procedure CenterChildren_H(Panel : TPanel);
Var
i : Integer;
Begin
For i := 0 To Panel.ControlCount - 1 Do
Begin
Panel.Controls[i].Left :=
(Panel.Width - Panel.Controls[i].Width) div 2;
End;
End;
Function GetCenterFormLeft(FormWidth : Integer): Integer;
Begin
If Screen.Width < FormWidth Then
Begin
Result := Screen.Width-26;
End
Else
Begin
Result := (Screen.Width - FormWidth) div 2;
End;
End;
Function GetCenterFormTop(FormHeight : Integer): Integer;
Begin
If Screen.Height < FormHeight Then
Begin
Result := Screen.Height-26;
End
Else
Begin
Result := (Screen.Height - FormHeight) div 2;
End;
End;
type
{custom type - enumerated type representing the operator to use in the filter}
TFilterOperator = (foEqual,foNotEqual,foGreaterThan,foLessThan,foGreaterEqualThan,foLessEqualThan);
type
TDBTableFilterDlg_ads = Class(TScrollingWinControl)
Public
Constructor Create(AOwner: TComponent); Override;
Destructor Destroy; Override;
Public
pnl_base: TPanel;
PanelButtons: TPanel;
PanelFilterTop: TPanel;
PanelFilter: TPanel;
FiltersOld: TMemo;
FiltersNew: TMemo;
PanelAddFilter: TPanel;
Field_Name_Base: TPanel;
L_FieldName: TPanel;
Filter_Base: TPanel;
Panel7: TPanel;
GroupBox1: TGroupBox;
Panel1: TPanel;
EditFilter: TEdit;
Panel2: TPanel;
Panel3: TPanel;
Case_cb: TCheckBox;
Exact_cb: TCheckBox;
Append_Base: TPanel;
Append_Label: TPanel;
Append_cb: TComboBox;
PanelTopMiddle: TPanel;
Panel4: TPanel;
Panel5: TPanel;
ComboBoxOperator: TComboBox;
PanelButtonSlider: TPanel;
ButtonOK: TBitBtn;
ButtonCancel: TBitBtn;
lb_FieldName: TListBox;
GroupBox2: TGroupBox;
PanelActions: TPanel;
ButtonAdd: TBitBtn;
ButtonClear: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure EditFilterChange(Sender: TObject);
procedure ComboBoxOperatorChange(Sender: TObject);
procedure lb_FieldNameChange(Sender: TObject);
procedure ButtonAddClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ButtonCancelClick(Sender: TObject);
procedure Exact_cbClick(Sender: TObject);
procedure Case_cbClick(Sender: TObject);
procedure Append_cbChange(Sender: TObject);
procedure ButtonOKClick(Sender: TObject);
procedure lb_FieldNameClick(Sender: TObject);
private
{ Private declarations }
FDataSet:{$IFDEF WIN32} TDataSet {$ELSE} TTable {$ENDIF};
FField: string; {stores fieldname}
FFilter : string; {stores filter}
{$IFDEF WIN32}
FFilterOperator : string; {stores filter-operator}
{$ELSE}
fFilterOperator : TFilterOperator;
{$ENDIF}
FFilters : String;
FAppend : String;
FCaseInsensitive : Boolean;
FExactMatch : Boolean;
FFiltered : Boolean;
FWildCard : Boolean;
FColorOfComboBoxs : TColor;
FColorOfFilterEdit : TColor;
FColorOfMemo : TColor;
FTitle : String; {stores the Dialog Title}
FBeveled : Boolean; {Selected panels have beveling if true}
FButtonsReSize : Boolean; {Buttons resize if true}
FButtonsAlignment : TAlignment; {taLeftJustify, taCenter, taRightJustify}
FButtonWidth : Integer; {Sets Button Widths}
FButtonSpacer : Integer; {Sets Button Spacer Width}
FApplyChanges : Boolean; {True if changes should be made. = mrOk}
FModal : Boolean; {True if Form is being shown modal}
FIsComponent : Boolean; {True if Form is part of a component,
False if Form is a standalone form,
Default is False}
FReSizeNow : Boolean; {Causes the form to resize when the
property is set}
FMinFormWidth : Integer; {Sets a Minimum FormWidth}
FMinFormHeight : Integer; {Sets a Minimum FormHeight}
FDialogComponentName : String;
{$IFNDEF WIN32}
FTable : TTable;
{$ENDIF}
procedure SetReSizeNow(Value : Boolean);
procedure SetMinFormWidth(Value : Integer);
procedure SetMinFormHeight(Value : Integer);
procedure SetBeveled(Value : Boolean);
Procedure SetColorOfMemo(Value : TColor);
Procedure SetColorOfFilterEdit(Value : TColor);
Procedure SetColorOfComboBoxs(Value : TColor);
public
{ Public declarations }
procedure ReSizeAll;
procedure SetBevel;
property IsComponent : Boolean
Read FIsComponent
Write FIsComponent;
property ReSizeNow : Boolean
Read FReSizeNow
Write SetReSizeNow;
Procedure FilterButtonsEnabled;
Function TypeFieldFromDataSet(DataSet: TDataSet; FieldName: String): String;
Procedure MakeBeveled(B : Boolean);
Procedure SetComboBoxColor(C : TColor);
{$IFNDEF WIN32}
procedure SetFilter; {set filter on table}
procedure RemoveFilter; {remove filter from table}
property Table : TTable
Read FTable
Write FTable;
{$ENDIF}
published
{ Published declarations }
property DataSet:
{$IFDEF WIN32} TDataSet {$ELSE} TTable {$ENDIF}
read FDataSet
write FDataSet;
property Field: string read FField write FField;
property Filter: string read FFilter write FFilter;
{$IFDEF WIN32}
property FilterOperator: string read FFilterOperator write FFilterOperator;
{$ELSE}
property FilterOperator: TFilterOperator read FFilterOperator write FFilterOperator;
{$ENDIF}
property Filters: String read FFilters write FFilters;
property Append: String read FAppend write FAppend;
property CaseInsensitive : Boolean
Read FCaseInsensitive
Write FCaseInsensitive;
property ExactMatch : Boolean
Read FExactMatch
Write FExactMatch;
property Filtered : Boolean
Read FFiltered
Write FFiltered;
property WildCard : Boolean
Read FWildCard
Write FWildCard;
property ColorOfComboBoxs : TColor
Read FColorOfComboBoxs
Write SetColorOfComboBoxs;
property ColorOfFilterEdit : TColor
Read FColorOfFilterEdit
Write SetColorOfFilterEdit;
property ColorOfMemo : TColor
Read FColorOfMemo
Write SetColorOfMemo;
property Title : String {stores the Dialog Title}
read FTitle
write FTitle;
property Beveled : Boolean {Selected panels have beveling if true}
Read FBeveled
Write SetBeveled;
property ButtonsReSize : Boolean {Buttons resize if true}
Read FButtonsReSize
Write FButtonsReSize;
property ButtonsAlignment : TAlignment {taLeftJustify, taCenter, taRightJustify}
Read FButtonsAlignment
Write FButtonsAlignment;
property ButtonWidth : Integer {Sets Button Widths}
Read FButtonWidth
Write FButtonWidth;
property ButtonSpacer : Integer {Sets Button Spacer Width}
Read FButtonSpacer
Write FButtonSpacer;
property ApplyChanges: Boolean {True if changes should be made. = mrOk}
Read FApplyChanges
Write FApplyChanges;
property Modal : Boolean {True if Form is being shown modal}
Read FModal
Write FModal;
property MinFormWidth : Integer {Sets the form's Minimum Width}
Read FMinFormWidth
Write SetMinFormWidth;
property MinFormHeight : Integer {Sets the form's Minimum Height}
Read FMinFormHeight
Write SetMinFormHeight;
property DialogComponentName : String {Used in messages to display the }
Read FDialogComponentName {dialog component name}
Write FDialogComponentName;
end;
Procedure TDBTableFilterDlg_ads.ResizeAll;
Begin
If Width < MinFormWidth Then Width := MinFormWidth;
If Height < MinFormHeight Then Height := MinFormHeight;
ButtonReSizer(
PanelButtons, {ButtonBase}
PanelButtonSlider, {ButtonSlider}
ButtonWidth, {ButtonWidth}
ButtonSpacer, {ButtonSpacer}
ButtonsReSize, {ButtonsReSize}
ButtonsAlignment, {ButtonsAlignment}
Beveled); {Beveled}
SetChildWidths(PanelAddFilter);
CenterChildren_H(PanelActions);
End;
procedure TDBTableFilterDlg_ads.FormResize(Sender: TObject);
begin
ResizeAll;
end;
Procedure TDBTableFilterDlg_ads.FilterButtonsEnabled;
Begin
If (lb_FieldName.ItemIndex = -1) Or
(ComboBoxOperator.Text = '') Or
(EditFilter.Text = '') Or
(DataSet = nil)
Then
Begin
{$IFDEF WIN32}
ButtonAdd.Enabled := False;
ButtonAdd.Default := False;
{$ENDIF}
ButtonOK.Enabled := False;
ButtonOK.Default := True;
End
Else
Begin
{$IFDEF WIN32}
ButtonAdd.Enabled := True;
ButtonAdd.Default := True;
{$ENDIF}
ButtonOK.Enabled := True;
ButtonOK.Default := False;
End;
{$IFDEF WIN32}
ButtonOK.Enabled := Not (FiltersNew.Lines[0] = '');
Append_cb.Enabled := Not (FiltersNew.Lines[0] = '');
{$ELSE}
Append_cb.Enabled := False;
{$ENDIF}
End;
procedure TDBTableFilterDlg_ads.EditFilterChange(Sender: TObject);
begin
FilterButtonsEnabled;
Filter := EditFilter.Text;
{
If EditFilter.Text = '' Then
Begin
Filter := '';
End
Else
Begin
Filter := EditFilter.Text;
End;
}
end;
procedure TDBTableFilterDlg_ads.ComboBoxOperatorChange(Sender: TObject);
begin
FilterButtonsEnabled;
{$IFDEF WIN32}
FilterOperator := ComboBoxOperator.Text;
{$ELSE}
FilterOperator := TFilterOperator(ComboBoxOperator.ItemIndex);
{$ENDIF}
end;
procedure TDBTableFilterDlg_ads.lb_FieldNameChange(Sender: TObject);
begin
FilterButtonsEnabled;
Field := lb_FieldName.Items[lb_FieldName.ItemIndex];
end;
procedure TDBTableFilterDlg_ads.ButtonAddClick(Sender: TObject);
Var
TempFilter : String;
WildAfter : String;
QuoteString: String;
FieldType : String;
begin
{$IFDEF WIN32}
FieldType := '';
Field := lb_FieldName.Items[lb_FieldName.ItemIndex];
FilterOperator := ComboBoxOperator.Text;
Filter := EditFilter.Text;
Append := Append_cb.Text;
FieldType := UpperCase(TypeFieldFromDataSet(DataSet,Field));
If (FieldType = 'STRING') Or
(FieldType = 'DATE') Or
(FieldType = 'DATETIME') Or
(FieldType = 'TIME') Or
(FieldType = 'MEMO') Then
Begin
QuoteString := '''';
If WildCard Then
Begin
WildAfter := '*';
Exact_cb.Checked := False;
ExactMatch := False;
CaseInsensitive := True;
Case_cb.Checked := Not CaseInsensitive;
End
Else
Begin
WildAfter := '';
End;
End
Else
Begin
QuoteString := '';
WildAfter := '';
End;
TempFilter := '(['+Field +
'] '+FilterOperator+
' ('+
QuoteString+
Filter+
WildAfter+
QuoteString+
'))';
If FiltersNew.Lines[0] = '' Then
Begin
FiltersNew.Lines[0] := TempFilter;
End
Else
Begin
FiltersNew.Lines.Add(' '+Append+' ');
FiltersNew.Lines.Add(TempFilter);
End;
Filter := '';
EditFilter.Text:= '';
FilterButtonsEnabled;
{$ENDIF}
end;
procedure TDBTableFilterDlg_ads.ButtonClearClick(Sender: TObject);
begin
{$IFDEF WIN32}
FiltersNew.Lines.Clear;
{$ELSE}
RemoveFilter;
{$ENDIF}
end;
procedure TDBTableFilterDlg_ads.FormCreate(Sender: TObject);
begin
ColorOfMemo := clWindow;
ColorOfFilterEdit := clWindow;
ColorOfComboBoxs := clWindow;
{$IFDEF WIN32}
Height := 422;
{$ELSE}
Height := 422 - PanelFilterHeight;
{$ENDIF}
Width := 495;
EditFilter.Text := '';
ButtonAdd.Enabled := False;
ButtonClear.Enabled := True;
ComboBoxOperator.Align := alTop;
EditFilter.Align := alTop;
FiltersNew.Align := alClient;
Append_cb.Align := alTop;
WildCard := True;
Title := 'Table Filter Dialog';{stores the Dialog Title}
Beveled := False; {Selected panels have beveling if true}
ButtonsReSize := False; {Buttons resize if true}
ButtonsAlignment := taCenter; {taLeftJustify, taCenter, taRightJustify}
ButtonWidth := 75; {Sets Button Widths}
ButtonSpacer := 10; {Sets Button Spacer Width}
ApplyChanges := False; {True if changes should be made. = mrOk}
Modal := True; {True if Form is being shown modal}
IsComponent := False; {True if Form is part of a component,
False if Form is a standalone form,
Default is False}
FMinFormWidth := 435; {Sets a Minimum FormWidth}
{$IFDEF WIN32}
FMinFormHeight := 422; {Sets a Minimum FormHeight}
{$ELSE}
FMinFormHeight := 422 - {Sets a Minimum FormHeight}
PanelFilterHeight;
{$ENDIF}
FDialogComponentName := 'TDBTableFilterDialog_ads';
{Set bevel prior to resizing}
SetBevel;
{ReSize at the end of the create}
{$IFNDEF WIN32}
GroupBox1.Caption := '';
GroupBox2.Caption := '';
ButtonAdd.Visible := False;
PanelFilter.Visible := False;
Append_cb.Visible := False;
Case_cb.Visible := False;
Exact_cb.Visible := False;
PanelAddFilter.Align := alClient;
ButtonClear.ModalResult := mrOK;
{$ENDIF}
ReSizeAll;
end;
procedure TDBTableFilterDlg_ads.ButtonCancelClick(Sender: TObject);
begin
ApplyChanges := False;
end;
procedure TDBTableFilterDlg_ads.FormActivate(Sender: TObject);
Var i : Integer;
begin
If IsComponent Then
Begin
{}
End
Else
Begin
Caption := Title; {stores the Dialog Title}
SetBevel;
Left := GetCenterFormLeft(Width);
Top := GetCenterFormTop(Height);
End;
WildCard := True;
If Not (DataSet = nil) Then
Begin
lb_FieldName.Items.Clear;
For i := 0 to (DataSet.FieldCount -1) Do
Begin
lb_FieldName.Items.Add(DataSet.Fields[i].FieldName);
End;
lb_FieldName.ItemIndex := 0;
{$IFDEF WIN32}
FiltersOld.Lines.Clear;
If DataSet.Filter = '' Then
Begin
FiltersOld.Lines.Add('');
End
Else
Begin
FiltersOld.Lines.Add(DataSet.Filter);
End;
FiltersNew.Lines.Clear;
If DataSet.Filter = '' Then
Begin
FiltersNew.Lines.Add('');
End
Else
Begin
FiltersNew.Lines.Add(DataSet.Filter);
End;
Filtered := True;
If DataSet.FilterOptions = [foCaseInsensitive] Then
Begin
CaseInsensitive := True;
ExactMatch := False;
WildCard := True;
End;
If DataSet.FilterOptions = [foNoPartialCompare] Then
Begin
CaseInsensitive := False;
ExactMatch := True;
WildCard := False;
End;
If DataSet.FilterOptions = [foCaseInsensitive,foNoPartialCompare] Then
Begin
CaseInsensitive := True;
ExactMatch := True;
WildCard := False;
End;
If DataSet.FilterOptions = [] Then
Begin
CaseInsensitive := False;
ExactMatch := False;
WildCard := True;
End;
Case_cb.Checked := Not CaseInsensitive;
Exact_cb.Checked := ExactMatch;
{$ENDIF}
End;
{$IFNDEF WIN32}
Table := DataSet;
{$ENDIF}
ComboBoxOperator.ItemIndex := 0;
EditFilter.Text := '';
FilterButtonsEnabled;
end;
procedure TDBTableFilterDlg_ads.Exact_cbClick(Sender: TObject);
begin
ExactMatch := Exact_cb.Checked;
If ExactMatch Then
Begin
WildCard := False;
End
Else
Begin
WildCard := True;
End;
end;
procedure TDBTableFilterDlg_ads.Case_cbClick(Sender: TObject);
begin
CaseInsensitive := Not Case_cb.Checked;
If Not CaseInsensitive Then
Begin
WildCard := False;
End
Else
Begin
WildCard := True;
End;
end;
procedure TDBTableFilterDlg_ads.Append_cbChange(Sender: TObject);
begin
FilterButtonsEnabled;
Append := Append_cb.Text;
end;
procedure TDBTableFilterDlg_ads.ButtonOKClick(Sender: TObject);
Var
i : Integer;
begin
{$IFDEF WIN32}
//ModalResult := mrOK;
If Not (EditFilter.Text = '') Then
Begin
If MessageDlg('Data in the Value field has'+
' not been added to the filters! Continue?',
mtInformation, [mbYes, mbNo], 0) = mrNo Then
Begin
//ModalResult := mrNone;
Exit;
End;
End;
DataSet.Active := False;
If CaseInsensitive Then
Begin
If ExactMatch Then
Begin
DataSet.FilterOptions := [foCaseInsensitive,foNoPartialCompare];
End
Else
Begin
DataSet.FilterOptions := [foCaseInsensitive];
End;
End
Else
Begin
If ExactMatch Then
Begin
DataSet.FilterOptions := [foNoPartialCompare];
End
Else
Begin
DataSet.FilterOptions := [];
End;
End;
DataSet.Filtered := Filtered;
DataSet.Filter := '';
For i := 0 To FiltersNew.Lines.Count -1 Do
Begin
DataSet.Filter := DataSet.Filter + FiltersNew.Lines[i];
End;
Try
DataSet.Active := True;
Except
DataSet.Active := False;
DataSet.Filter := '';
For i := 0 To FiltersOld.Lines.Count -1 Do
Begin
DataSet.Filter := DataSet.Filter + FiltersOld.Lines[i];
End;
Try
DataSet.Active := True;
Except
DataSet.Filter := '';
DataSet.Filtered := False;
End;
End;
{$ELSE}
Field := lb_FieldName.Items[lb_FieldName.ItemIndex];
FilterOperator := TFilterOperator(ComboBoxOperator.ItemIndex);
Filter := EditFilter.Text;
SetFilter;
{$ENDIF}
ApplyChanges := True;
end;
{Returns the database field type as a string. If there
is an error a null string is returned.}
Function TDBTableFilterDlg_ads.TypeFieldFromDataSet(DataSet: TDataSet; FieldName: String): String;
Var
FieldIndex : Integer;
FieldType : TFieldType;
Begin
Try
DataSet.Active := True;
FieldIndex :=
DataSet.FieldDefs.IndexOf(FieldName);
FieldType :=
DataSet.FieldDefs[FieldIndex].DataType;
{TFieldType Possible values are
ftUnknown, ftString, ftSmallint,
ftInteger, ftWord, ftBoolean,
ftFloat, ftCurrency, ftBCD, ftDate,
ftTime, ftDateTime, ftBytes, ftVarBytes,
ftBlob, ftMemo or ftGraphic}
If FieldType=ftUnknown Then Result := 'Unknown';
If FieldType=ftString Then Result := 'String';
If FieldType=ftSmallInt Then Result := 'SmallInt';
If FieldType=ftInteger Then Result := 'Integer';
If FieldType=ftWord Then Result := 'Word';
If FieldType=ftBoolean Then Result := 'Boolean';
If FieldType=ftFloat Then Result := 'Float';
If FieldType=ftCurrency Then Result := 'Currency';
If FieldType=ftBCD Then Result := 'BCD';
If FieldType=ftDate Then Result := 'Date';
If FieldType=ftTime Then Result := 'Time';
If FieldType=ftDateTime Then Result := 'DateTime';
If FieldType=ftBytes Then Result := 'Bytes';
If FieldType=ftVarBytes Then Result := 'VarBytes';
If FieldType=ftBlob Then Result := 'Blob';
If FieldType=ftMemo Then Result := 'Memo';
If FieldType=ftGraphic Then Result := 'Graphic';
Except
End;
End;
Procedure TDBTableFilterDlg_ads.MakeBeveled(B : Boolean);
Var
i : Integer;
Begin
If Not B Then
Begin
For I := 0 to ComponentCount -1 Do
Begin
If Components[I] is TPanel Then
Begin
TPanel(Components[I]).BevelOuter := bvNone;
TPanel(Components[I]).BevelInner := bvNone;
End;
End;
End
Else
Begin
For I := 0 to PanelFilterTop.ComponentCount -1 Do
Begin
If PanelFilterTop.Components[I] is TPanel Then
Begin
TPanel(Components[I]).BevelOuter := bvRaised;
TPanel(Components[I]).BevelInner := bvLowered;
End;
End;
End;
End;
Procedure TDBTableFilterDlg_ads.SetComboBoxColor(C : TColor);
Var
I : Integer;
Begin
For I := 0 to ComponentCount -1 Do
Begin
If Components[I] is TComboBox Then
Begin
TComboBox(Components[I]).Color := C;
TComboBox(Components[I]).ParentColor := False;
End;
End;
End;
procedure TDBTableFilterDlg_ads.lb_FieldNameClick(Sender: TObject);
Var
FieldType : String;
begin
FieldType := '';
FilterButtonsEnabled;
Field := lb_FieldName.Items[lb_FieldName.ItemIndex];
If Not (Field = '') Then
Begin
FieldType := UpperCase(TypeFieldFromDataSet(DataSet,Field));
If (FieldType = 'STRING') Or
(FieldType = 'MEMO') Then
Begin
WildCard := True;
ComboBoxOperator.Items.Clear;
ComboBoxOperator.Items.Clear;
ComboBoxOperator.Items.Add('=');
ComboBoxOperator.ItemIndex := 0;
ComboBoxOperator.Text := '=';
End
Else
Begin
WildCard := False;
ComboBoxOperator.Items.Clear;
ComboBoxOperator.Items.Add('=');
ComboBoxOperator.Items.Add('<>');
ComboBoxOperator.Items.Add('>');
ComboBoxOperator.Items.Add('<');
ComboBoxOperator.Items.Add('>=');
ComboBoxOperator.Items.Add('<=');
ComboBoxOperator.ItemIndex := 0;
ComboBoxOperator.Text := '=';
End;
End
Else
Begin
WildCard := False;
ComboBoxOperator.Items.Clear;
ComboBoxOperator.Items.Add('=');
ComboBoxOperator.Items.Add('<>');
ComboBoxOperator.Items.Add('>');
ComboBoxOperator.Items.Add('<');
ComboBoxOperator.Items.Add('>=');
ComboBoxOperator.Items.Add('<=');
End;
end;
Procedure TDBTableFilterDlg_ads.SetColorOfMemo(Value : TColor);
Begin
FColorOfMemo := Value;
FiltersNew.Color := Value;
End;
Procedure TDBTableFilterDlg_ads.SetColorOfFilterEdit(Value : TColor);
Begin
FColorOfFilterEdit := Value;
EditFilter.Color := Value;
End;
Procedure TDBTableFilterDlg_ads.SetColorOfComboBoxs(Value : TColor);
Begin
FColorOfComboBoxs := Value;
SetComboBoxColor(Value);
End;
procedure TDBTableFilterDlg_ads.SetBeveled(Value : Boolean);
Begin
FBeveled := Value;
SetBevel;
End;
procedure TDBTableFilterDlg_ads.SetReSizeNow(Value : Boolean);
Begin
ReSizeAll;
FReSizeNow := Value;
End;
procedure TDBTableFilterDlg_ads.SetMinFormWidth(Value : Integer);
Begin
If FMinFormWidth <> Value Then FMinFormWidth := Value;
End;
procedure TDBTableFilterDlg_ads.SetMinFormHeight(Value : Integer);
Begin
If FMinFormHeight <> Value Then FMinFormHeight := Value;
End;
procedure TDBTableFilterDlg_ads.SetBevel;
Begin
MakeBeveled(Beveled);
End;
{$IFNDEF WIN32}
{***BDE Routines***************************************************************}
{set filter on table}
procedure TDBTableFilterDlg_ads.SetFilter;
{custom type - stores filter expression and components}
type
TmyFilter = record
Expr: CANExpr;
Nodes: array[0..2] of CANNode;
literals: array[0..276] of char;
end;
{******************************************************}
var
Table : TTable;
myFilter: TmyFilter; {instance of custom type}
fldName,
fldFilter: pChar; {fieldname and filter char's}
dbResult: DBiResult; {result from BDE}
hFilter: hDBiFilter; {handle to filter}
si: integer; {stores filter for smallint field type}
li, liT: longint; {stores filter for longint field type}
ex: extended; {stores filter for date,time,float and currency fields}
dt: TDateTime; {used in date\time fields}
dl: double; {used for timeStamp fields}
yr, mh, dy,
hr, mn, sc, ms: word; {used for date\time fields}
{******************************************************}
begin
{exit if fields not set}
if Table = nil then exit; if Field = '' then exit; if Filter = '' then exit;
{find field type}
case FTable.FieldByName(FField).DataType of
ftString:
myFilter.nodes[2].canConst.iType := fldZSTRING;
ftCurrency:
myFilter.nodes[2].canConst.iType := fldstMONEY;
ftDate:
myFilter.nodes[2].canConst.iType := fldDATE;
ftTime:
myFilter.nodes[2].canConst.iType := fldTIME;
ftFloat:
myFilter.nodes[2].canConst.iType := fldFLOAT;
ftInteger:
myFilter.nodes[2].canConst.iType := fldINT32;
ftSmallInt:
myFilter.nodes[2].canConst.iType := fldINT16;
ftDateTime:
myFilter.nodes[2].canConst.iType := fldTIMESTAMP;
ftBoolean:
myFilter.nodes[2].canConst.iType := fldBool;
end;
{******************************************************}
fldName := StrAlloc(DBiMAXNAMELEN+1); {allocate space for field name}
try
{allocate resources and copy}
StrPCopy(fldName,FField);
StrCopy(myFilter.Literals,fldName);
{*****************************************************}
{switch to account for field type - setting filter}
case FTable.FieldByName(FField).DataType of
{string}
ftString:
begin
fldFilter := StrAlloc(sizeOf(FFilter)+1);
try
{the literals must contain the fieldname (terminated by a null) followed
by the filter expression (terminated by a null)}
StrPCopy(fldFilter,FFilter);
StrCat(myFilter.Literals,'Z'); {catenate temp char value}
StrCat(myFilter.Literals,fldFilter); {add filter to literals}
myFilter.Literals[StrLen(fldName)] := #0; {replace temp with null}
StrCat(myFilter.Literals,#0); {add null to end of filter}
finally
StrDispose(fldFilter);
end;
end;
{long int}
ftInteger:
begin
try
li := StrToInt(FFilter);
move(li,myFilter.Literals[StrLen(fldName)+1],sizeOf(li));
except
on EConvertError do
begin
messageDlg('Please enter an integer value',mtError,[mbOK],0); exit;
end;
end;
end;
{small int}
ftSmallInt:
begin
try
si := StrToInt(FFilter);
move(si,myFilter.Literals[StrLen(fldName)+1],sizeOf(si));
except
on EConvertError do
begin
messageDlg('Please enter an integer value',mtError,[mbOK],0); exit;
end;
end;
end;
{float}
ftFloat:
begin
try
dl := StrToFloat(FFilter);
move(dl,myFilter.Literals[StrLen(fldName)+1],sizeOf(dl));
except
on EConvertError do
begin
messageDlg('Please enter a valid value',mtError,[mbOK],0); exit;
end;
end;
end;
{date}
ftDate:
begin
try
dt := StrToDate(FFilter);
DecodeDate(dt,yr,mh,dy);
dbResult := DBiDateEncode(mh,dy,integer(yr),li);
if dbResult = DBIERR_NONE then
move(li,myFilter.Literals[StrLen(fldName)+1],sizeOf(li))
else
begin
messageDlg('Could not encode date.',mtError,[mbOK],0); exit;
end;
except
on EConvertError do
begin
messageDlg('Please enter a date value',mtError,[mbOK],0); exit;
end;
end;
end;
{logical}
ftBoolean:
begin
fldFilter := StrAlloc(sizeOf(FFilter)+1);
try
{the literals must contain the fieldname (terminated by a null) followed
by the filter expression (terminated by a null)}
StrPCopy(fldFilter,FFilter);
StrCat(myFilter.Literals,'Z'); {catenate temp char value}
StrCat(myFilter.Literals,fldFilter); {add filter to literals}
myFilter.Literals[StrLen(fldName)] := #0; {replace temp with null}
StrCat(myFilter.Literals,#0); {add null to end of filter}
finally
StrDispose(fldFilter);
end;
end;
{time}
ftTime:
begin
messageDlg('Can not place filters on time fields',mtError,[mbOK],0);
exit;
{dt := StrToTime(FFilter);
DecodeTime(dt,hr,mn,sc,ms);
dbResult := DBiTimeEncode(hr,mn,ms,li);
if dbResult = DBiERR_NONE then
move(li,myFilter.Literals[StrLen(fldName)+1],sizeOf(li))
else
begin
messageDlg('Could not encode time.',mtError,[mbOK],0);
exit;
end;}
end;
ftDateTime:
begin
messageDlg('Can not place filters on TimeStamp fields',mtError,[mbOK],0);
exit;
{dt := StrToDateTime(FFilter);
li := trunc(dt);
DecodeTime(dt,hr,mn,sc,ms);
dbResult := DBiTimeEncode(hr,mn,ms,liT);
dbResult := DBiTimeStampEncode(li,liT,dl);
move(dl,myFilter.Literals[StrLen(fldName)+1],sizeOf(dl));}
end;
{money}
ftCurrency:
begin
messageDlg('Can not place filters on currency fields.',mtError,[mbOK],0);
exit;
{dl := StrToFloat(FFilter);
move(dl,myFilter.Literals[StrLen(fldName)+1],sizeOf(dl));}
end;
end;
{*****************************************************}
{set the CANExpr field of the filter expression}
myFilter.Expr.iVer := 1;
myFilter.Expr.iTotalSize := sizeOf(myFilter);
myFilter.Expr.iNodes := 3;
myFilter.Expr.iNodeStart := sizeOf(CANExpr);
myFilter.Expr.iLiteralStart := sizeOf(CANExpr) + 3 * sizeOf(CANNode);
{set the Nodes field of the filter expression}
{first part of array}
myFilter.nodes[0].canBinary.NodeClass := nodeBinary;
{switch on filter operator}
case FFilterOperator of
foEqual: myFilter.nodes[0].canBinary.canOP := canEQ;
foNotEqual: myFilter.nodes[0].canBinary.canOP := canNE;
foGreaterThan: myFilter.nodes[0].canBinary.canOP := canGT;
foLessThan: myFilter.nodes[0].canBinary.canOP := canLT;
foGreaterEqualThan: myFilter.nodes[0].canBinary.canOP := canGE;
foLessEqualThan: myFilter.nodes[0].canBinary.canOP := canLE;
end;
myFilter.nodes[0].canBinary.iOperand1 := sizeOf(CANNode);
myFilter.nodes[0].canBinary.iOperand2 := 2 * sizeOf(CANNode);
{second part of array}
myFilter.nodes[1].canField.nodeClass := nodeField;
myFilter.nodes[1].canField.canOP := canField2;
myFilter.nodes[1].canField.iFieldNum := 0;
myFilter.nodes[1].canField.iNameOffset := 0;
{third part of array}
myFilter.nodes[2].canConst.nodeClass := nodeConst;
myFilter.nodes[2].canConst.canOP := canCONST2;
myFilter.nodes[2].canConst.iSize := 3;
myFilter.nodes[2].canConst.iOffset := StrLen(fldName) + 1;
{run filter}
dbResult := DBiAddFilter(FTable.handle,1,1,False,addr(myFilter),nil,hFilter);
if dbResult = DBIERR_NONE then
begin
dbResult := DBiActivateFilter(FTable.handle,hFilter);
if dbResult = DBIERR_NONE then
FTable.first
else
messageDlg('Could not activate filter',mtError,[mbOK],0);
end
else
messageDlg('Could not set filter',mtError,[mbOK],0);
finally
StrDispose(fldName); {free resources allocated to fieldname}
end;
end;
{remove filter}
procedure TDBTableFilterDlg_ads.RemoveFilter;
var
dbResult: DBiResult; {result from BDE}
hFilter: hDBiFilter; {handle to filter}
begin
{exit if fields not set}
if Table = nil then exit;
dbResult := DBiDeactivateFilter(FTable.handle,nil); {if filter handle is null, then all table filters are deactivated}
if dbResult = DBIERR_NONE then
begin
dbResult := DBiDropFilter(FTable.handle,nil); {if filter handle is null, then all table filters are dropped}
if dbResult = DBIERR_NONE then
begin
FTable.First;
end
else
messageDlg('Could not dispose of filter',mtError,[mbOK],0);
end
else
messageDlg('Could not deactivate filter',mtError,[mbOK],0);
end;
{$ENDIF}
Constructor TDBTableFilterDlg_ads.Create(AOwner: TComponent);
Begin
ProcName := 'TDBTableFilterDlg_ads.Create'; Try
inherited;
Self.Parent := TWincontrol(AOwner);
pnl_base := TPanel.Create(AOwner);
With pnl_base Do
Begin
Parent := Self;
Left := 0;
Top := 0;
Width := 476;
Height := 395;
Align := alClient;
BevelOuter := bvNone;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
PanelButtons := TPanel.Create(AOwner);
With PanelButtons Do
Begin
Parent := pnl_base;
Left := 0;
Top := 346;
Width := 476;
Height := 49;
Align := alBottom;
BevelInner := bvNone;
BorderWidth := 10;
Caption := ' ';
Ctl3D := False;
ParentColor := True;
ParentCtl3D := False;
TabOrder := 1;
End;
PanelButtonSlider := TPanel.Create(AOwner);
With PanelButtonSlider Do
Begin
Parent := PanelButtons;
Left := 12;
Top := 12;
Width := 453;
Height := 25;
BevelOuter := bvNone;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
ButtonOK := TBitBtn.Create(AOwner);
With ButtonOK Do
Begin
Parent := PanelButtonSlider;
Left := 233;
Top := 0;
Width := 108;
Height := 25;
Hint := 'Execute the filter changes.';
Caption := 'Apply';
TabOrder := 0;
OnClick := ButtonOKClick;
Kind := bkOK;
End;
ButtonCancel := TBitBtn.Create(AOwner);
With ButtonCancel Do
Begin
Parent := PanelButtonSlider;
Left := 345;
Top := 0;
Width := 108;
Height := 25;
Hint := 'Close this dialog and make no changes.';
TabOrder := 1;
OnClick := ButtonCancelClick;
Kind := bkCancel;
End;
PanelFilterTop := TPanel.Create(AOwner);
With PanelFilterTop Do
Begin
Parent := pnl_base;
Left := 0;
Top := 0;
Width := 476;
Height := 346;
Align := alClient;
BevelOuter := bvNone;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
PanelFilter := TPanel.Create(AOwner);
With PanelFilter Do
Begin
Parent := PanelFilterTop;
Left := 0;
Top := 205;
Width := 476;
Height := 141;
Align := alClient;
BevelInner := bvNone;
BorderWidth := 10;
Caption := ' ';
ParentColor := True;
TabOrder := 1;
End;
FiltersOld := TMemo.Create(AOwner);
With FiltersOld Do
Begin
Parent := PanelFilter;
Left := 12;
Top := 12;
Width := 452;
Height := 117;
TabStop := False;
Align := alClient;
ScrollBars := ssVertical;
TabOrder := 0;
Visible := False;
Lines.Clear;
With Lines Do
Begin
Try Add('FiltersOld'); Except End;
End;
End;
FiltersNew := TMemo.Create(AOwner);
With FiltersNew Do
Begin
Parent := PanelFilter;
Left := 12;
Top := 12;
Width := 452;
Height := 117;
Hint := 'You can edit the filters.';
Align := alClient;
ScrollBars := ssVertical;
TabOrder := 1;
End;
PanelAddFilter := TPanel.Create(AOwner);
With PanelAddFilter Do
Begin
Parent := PanelFilterTop;
Left := 0;
Top := 0;
Width := 476;
Height := 205;
Align := alTop;
BevelInner := bvNone;
BorderWidth := 10;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
Field_Name_Base := TPanel.Create(AOwner);
With Field_Name_Base Do
Begin
Parent := PanelAddFilter;
Left := 12;
Top := 12;
Width := 144;
Height := 181;
Align := alLeft;
BevelOuter := bvNone;
BorderWidth := 5;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
L_FieldName := TPanel.Create(AOwner);
With L_FieldName Do
Begin
Parent := Field_Name_Base;
Left := 5;
Top := 5;
Width := 134;
Height := 18;
Align := alTop;
Alignment := taLeftJustify;
BevelOuter := bvNone;
Caption := 'Field Name';
ParentColor := True;
TabOrder := 0;
End;
lb_FieldName := TListBox.Create(AOwner);
With lb_FieldName Do
Begin
Parent := Field_Name_Base;
Left := 5;
Top := 23;
Width := 134;
Height := 153;
Hint := 'Select a field.';
Align := alClient;
ItemHeight := 16;
TabOrder := 1;
OnClick := lb_FieldNameClick;
End;
Filter_Base := TPanel.Create(AOwner);
With Filter_Base Do
Begin
Parent := PanelAddFilter;
Left := 300;
Top := 12;
Width := 164;
Height := 181;
Align := alRight;
BevelOuter := bvNone;
BorderWidth := 5;
Caption := ' ';
ParentColor := True;
TabOrder := 1;
End;
Panel7 := TPanel.Create(AOwner);
With Panel7 Do
Begin
Parent := Filter_Base;
Left := 5;
Top := 5;
Width := 154;
Height := 18;
Align := alTop;
Alignment := taLeftJustify;
BevelOuter := bvNone;
Caption := 'Value';
ParentColor := True;
TabOrder := 0;
End;
GroupBox1 := TGroupBox.Create(AOwner);
With GroupBox1 Do
Begin
Parent := Filter_Base;
Left := 5;
Top := 53;
Width := 154;
Height := 123;
Align := alClient;
Caption := 'Options';
TabOrder := 1;
End;
Panel2 := TPanel.Create(AOwner);
With Panel2 Do
Begin
Parent := GroupBox1;
Left := 2;
Top := 18;
Width := 15;
Height := 103;
Align := alLeft;
BevelOuter := bvNone;
Caption := ' ';
ParentColor := True;
TabOrder := 0;
End;
Panel3 := TPanel.Create(AOwner);
With Panel3 Do
Begin
Parent := GroupBox1;
Left := 17;
Top := 18;
Width := 135;
Height := 103;
Align := alClient;
BevelOuter := bvNone;
Caption := ' ';
ParentColor := True;
TabOrder := 1;
End;
Case_cb := TCheckBox.Create(AOwner);
With Case_cb Do
Begin
Parent := Panel3;
Left := 10;
Top := 48;
Width := 111;
Height := 25;
Hint := 'Check if the filter is case sensitive.';
Caption := 'Case';
Ctl3D := True;
ParentCtl3D := False;
TabOrder := 0;
OnClick := Case_cbClick;
End;