//
unit ads_DlgDBFieldFilter; {Copyright(c)2016 Advanced Delphi Systems Richard Maley Advanced Delphi Systems 12613 Maidens Bower Drive Potomac, MD 20854 USA phone 301-840-1554 dickmaley@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 dickmaley@advdelphisys.com so that the entire Delphi community can benefit. All comments are welcome. } (* Description: ads_DlgDBFieldFilter.pas.pas This unit contains *) (*UnitIndex Master Index Implementation Section Download Units
Description: ads_DlgDBFieldFilter.pas This unit contains the following routines.
DlgDBFieldFilter_ads TDBFieldFilterDlg_ads.ButtonAllClick TDBFieldFilterDlg_ads.ButtonCancelClick TDBFieldFilterDlg_ads.ButtonNoneClick TDBFieldFilterDlg_ads.ButtonOKClick TDBFieldFilterDlg_ads.ButtonReSizer TDBFieldFilterDlg_ads.FormActivate TDBFieldFilterDlg_ads.FormCreate TDBFieldFilterDlg_ads.FormResize TDBFieldFilterDlg_ads.GetCenterFormLeft TDBFieldFilterDlg_ads.GetCenterFormTop TDBFieldFilterDlg_ads.GetDataSource TDBFieldFilterDlg_ads.GetMultiSelect TDBFieldFilterDlg_ads.PanelBevel TDBFieldFilterDlg_ads.ReSizeAll TDBFieldFilterDlg_ads.SetBevel TDBFieldFilterDlg_ads.SetDataSource TDBFieldFilterDlg_ads.SetMinFormHeight TDBFieldFilterDlg_ads.SetMinFormWidth TDBFieldFilterDlg_ads.SetMultiSelect TDBFieldFilterDlg_ads.SetReSizeNow
*) interface Uses DB; {!~DlgDBFieldFilter_ads } Function DlgDBFieldFilter_ads(DataSource: TDataSource): Boolean; implementation Uses ads_Exception, SysUtils, StdCtrls, Buttons, Classes, Controls, ExtCtrls, Forms, Graphics ; Var UnitName : String; ProcName : String; type TDBFieldFilterDlg_ads = Class(TScrollingWinControl) Public Constructor Create(AOwner: TComponent); Override; Destructor Destroy; Override; Public BaseList: TPanel; ButtonAll: TBitBtn; ButtonCancel: TBitBtn; ButtonDummyAll: TBitBtn; ButtonDummyNone: TBitBtn; ButtonNone: TBitBtn; ButtonOK: TBitBtn; FieldNameList: TListBox; MsgPanel: TPanel; PanelButtons: TPanel; PanelButtonSlider: TPanel; procedure ButtonAllClick(Sender: TObject); procedure ButtonCancelClick(Sender: TObject); procedure ButtonNoneClick(Sender: TObject); procedure ButtonOKClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormResize(Sender: TObject); protected FApplyChanges : Boolean; {True if changes should be made. = mrOk} FBeveled : Boolean; {Selected panels have beveling if true} FButtonsAlignment : TAlignment; {taLeftJustify, taCenter, taRightJustify} FButtonSpacer : Integer; {Sets Button Spacer Width} FButtonsReSize : Boolean; {Buttons resize if true} FButtonWidth : Integer; {Sets Button Widths} FColorOfFieldList : TColor; FDataSource : TDataSource; FIsComponent : Boolean; {True if Form is part of a component, False if Form is a standalone form, Default is False} FMinFormHeight : Integer; {Sets a Minimum FormHeight} FMinFormWidth : Integer; {Sets a Minimum FormWidth} FModal : Boolean; {True if Form is being shown modal} FMsg : String; {stores the Dialog Message} FReSizeNow : Boolean; {Causes the form to resize when the property is set} FTitle : String; {stores the Dialog Title} Function GetCenterFormLeft(FormWidth : Integer): Integer; Function GetCenterFormTop(FormHeight : Integer): Integer; function GetDataSource: TDataSource; function GetMultiSelect: Boolean; procedure ButtonReSizer( ButtonBase : TPanel; ButtonSlider : TPanel; ButtonWidth : Integer; ButtonSpacer : Integer; ButtonsReSize : Boolean; ButtonsAlignment: TAlignment; Beveled : Boolean); Procedure PanelBevel(Beveled : Boolean; Panel: TPanel); procedure SetDataSource(Value: TDataSource); procedure SetMinFormHeight(Value : Integer); procedure SetMinFormWidth(Value : Integer); procedure SetMultiSelect(Value: Boolean); procedure SetReSizeNow(Value : Boolean); public procedure ReSizeAll; procedure SetBevel; property IsComponent : Boolean Read FIsComponent Write FIsComponent; property ReSizeNow : Boolean Read FReSizeNow Write SetReSizeNow; Published property ApplyChanges: Boolean Read FApplyChanges Write FApplyChanges;{True if changes should be made. = mrOk} property Beveled : Boolean Read FBeveled Write FBeveled;{Selected panels have beveling if true} property ButtonsAlignment : TAlignment Read FButtonsAlignment Write FButtonsAlignment;{taLeftJustify, taCenter, taRightJustify} property ButtonSpacer : Integer Read FButtonSpacer Write FButtonSpacer;{Sets Button Spacer Width} property ButtonsReSize : Boolean Read FButtonsReSize Write FButtonsReSize;{Buttons resize if true} property ButtonWidth : Integer Read FButtonWidth Write FButtonWidth;{Sets Button Widths} property ColorOfFieldList : TColor Read FColorOfFieldList Write FColorOfFieldList; property DataSource: TDataSource read GetDataSource write SetDataSource; property MinFormHeight : Integer Read FMinFormHeight Write SetMinFormHeight;{Sets the form's Minimum Height} property MinFormWidth : Integer Read FMinFormWidth Write SetMinFormWidth;{Sets the form's Minimum Width} property Modal : Boolean Read FModal Write FModal;{True if Form is being shown modal} property Msg : String read FMsg write FMsg; property MultiSelect: Boolean read GetMultiSelect write SetMultiSelect default True; property Title : String read FTitle write FTitle;{stores the Dialog Title} end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.FormCreate(Sender: TObject); Begin FieldNameList.Items.Clear; MultiSelect := True; Msg := 'Select your fields'; {stores the Dialog Message} ColorOfFieldList := clWindow; Title := 'Field Selection Dialog';{stores the Dialog Title} FBeveled := False; {Selected panels have beveling if true} FButtonsReSize := False; {Buttons resize if true} FButtonsAlignment := taRightJustify; {taLeftJustify, taCenter, taRightJustify} FButtonWidth := 75; {Sets Button Widths} FButtonSpacer := 0; {Sets Button Spacer Width} FApplyChanges := False; {True if changes should be made. = mrOk} FModal := 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 := 300; {Sets a Minimum FormWidth} FMinFormHeight := 300; {Sets a Minimum FormHeight} SetBevel;{Set bevel prior to resizing} ReSizeAll;{ReSize at the end of the create} end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_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} End; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.FormResize(Sender: TObject); begin ReSizeAll; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.FormActivate(Sender: TObject); var I,J: Integer; begin Try If DataSource = nil Then Exit; If DataSource.DataSet = nil Then Exit; For I := 0 to DataSource.DataSet.FieldCount - 1 Do begin FieldNameList.Items.Add (DataSource.DataSet.Fields[I].FieldName); end; FieldNameList.Sorted := True; If MultiSelect Then Begin For I := 0 to DataSource.DataSet.FieldCount - 1 Do Begin If DataSource.DataSet.Fields[I].Visible then Begin For J := 0 to FieldNameList.Items.Count - 1 Do Begin If UpperCase(FieldNameList.Items[J]) = UpperCase(DataSource.DataSet.Fields[I].FieldName) Then Begin Try FieldNameList.Selected [J] := True; Except Break; End; End; End; End; End; End; Except Raise Exception.Create('Unable to list the Tables Fields'); End; If MultiSelect Then Begin ButtonAll.Enabled := True; End Else Begin ButtonAll.Enabled := False; End; If IsComponent Then Begin {} End Else Begin Caption := Title; {stores the Dialog Title} MsgPanel.Caption := Msg; {stores the Dialog Message} FieldNameList.Color:= ColorOfFieldList; SetBevel; Left := GetCenterFormLeft(Width); Top := GetCenterFormTop(Height); End; end; //Unit Description UnitIndex Master Index
function TDBFieldFilterDlg_ads.GetDataSource: TDataSource; begin Result := FDataSource; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.SetDataSource(Value : TDataSource); begin FDataSource := Value; end; //Unit Description UnitIndex Master Index
function TDBFieldFilterDlg_ads.GetMultiSelect: Boolean; begin Result := FieldNameList.MultiSelect; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.SetMultiSelect(Value : Boolean); begin FieldNameList.MultiSelect := Value; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.ButtonCancelClick(Sender: TObject); begin ApplyChanges := False; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.ButtonOKClick(Sender: TObject); Var I: Integer; begin Try Try FieldNameList.Invalidate; For I := 0 to DataSource.DataSet.FieldCount - 1 Do If FieldNameList.Selected[I] Then Begin DataSource.DataSet.FieldByName(FieldNameList.Items[I]).Visible := True; {MessageDlg(FieldNameList.Items[I]+'.Visible = True '+IntToStr(I), mtInformation,[mbOK], 0);} End Else Begin DataSource.DataSet.FieldByName(FieldNameList.Items[I]).Visible := False; {MessageDlg(FieldNameList.Items[I]+'.Visible = False '+IntToStr(I), mtInformation,[mbOK], 0);} End; Except Raise Exception.Create('Unable to select the Tables Fields'); End; Finally FieldNameList.Clear; ApplyChanges := True; End; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.ButtonAllClick(Sender: TObject); Var I: Integer; begin TBitBtn(Sender).ModalResult := mrNone; Try FieldNameList.Invalidate; For I := 0 to FieldNameList.Items.Count - 1 Do FieldNameList.Selected[I] := True; Except Raise Exception.Create('Unable to select All Fields'); End; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.ButtonNoneClick(Sender: TObject); Var I: Integer; begin TBitBtn(Sender).ModalResult := mrNone; Try FieldNameList.Invalidate; For I := 0 to FieldNameList.Items.Count - 1 Do FieldNameList.Selected[I] := False; Except Raise Exception.Create('Unable to select All Fields'); End; end; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.SetBevel; Begin PanelBevel(Beveled,MsgPanel); PanelBevel(Beveled,BaseList); PanelBevel(Beveled,PanelButtons); End; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.SetReSizeNow(Value : Boolean); Begin ReSizeAll; FReSizeNow := Value; End; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.SetMinFormWidth(Value : Integer); Begin If FMinFormWidth <> Value Then FMinFormWidth := Value; End; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.SetMinFormHeight(Value : Integer); Begin If FMinFormHeight <> Value Then FMinFormHeight := Value; End; //Unit Description UnitIndex Master Index
procedure TDBFieldFilterDlg_ads.ButtonReSizer( ButtonBase : TPanel; ButtonSlider : TPanel; ButtonWidth : Integer; ButtonSpacer : Integer; ButtonsReSize : Boolean; ButtonsAlignment: TAlignment; Beveled : Boolean); Var i : Integer; LeftPos : Integer; NButtons : Integer; NSpacers : Integer; p : TWinControl; SpacersWidth : Integer; SpacerWidth : Integer; W : 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; MinFormHeight := PanelButtons.Height + FieldNameList.Count*25 + MsgPanel.Height + 40; Try p:=ButtonBase.Parent; For i:=1 To 5 Do Begin If p is TForm Then Begin If p.Width < MinFormWidth Then p.Width := MinFormWidth; If p.Height < MinFormHeight Then p.Height := MinFormHeight; Break; End Else Begin p:=p.Parent; 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; //Unit Description UnitIndex Master Index
Function TDBFieldFilterDlg_ads.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; //Unit Description UnitIndex Master Index
Function TDBFieldFilterDlg_ads.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; //Unit Description UnitIndex Master Index
Procedure TDBFieldFilterDlg_ads.PanelBevel(Beveled : Boolean; Panel: TPanel); Begin If Not Beveled Then Begin Panel.BevelOuter := bvNone; Panel.BevelInner := bvNone; Panel.BorderStyle:= bsNone; End Else Begin Panel.BevelOuter := bvRaised; Panel.BevelInner := bvLowered; Panel.BorderStyle:= bsSingle; End; End; Constructor TDBFieldFilterDlg_ads.Create(AOwner: TComponent); Begin ProcName := 'TDBFieldFilterDlg_ads.Create'; Try inherited; Self.Parent := TWincontrol(AOwner); BaseList := TPanel.Create(AOwner); With BaseList Do Begin Parent := Self; Left := 0; Top := 49; Width := 337; Height := 202; Align := alClient; BevelOuter := bvNone; BorderWidth := 2; Caption := ' '; ParentColor := True; TabOrder := 0; End; FieldNameList := TListBox.Create(AOwner); With FieldNameList Do Begin Parent := BaseList; Left := 10; Top := 10; Width := 317; Height := 180; Hint := 'Ctrl-LeftClick fields to be visible.'; Align := alClient; IntegralHeight := True; ItemHeight := 16; MultiSelect := True; TabOrder := 0; End; PanelButtons := TPanel.Create(AOwner); With PanelButtons Do Begin Parent := Self; Left := 0; Top := 251; Width := 337; Height := 53; Align := alBottom; BevelOuter := bvNone; BorderWidth := 10; Caption := ' '; ParentColor := True; TabOrder := 1; End; PanelButtonSlider := TPanel.Create(AOwner); With PanelButtonSlider Do Begin Parent := PanelButtons; Left := 10; Top := 10; Width := 309; Height := 33; Align := alLeft; BevelOuter := bvNone; Caption := ' '; ParentColor := True; TabOrder := 0; End; ButtonAll := TBitBtn.Create(AOwner); With ButtonAll Do Begin Parent := PanelButtonSlider; Left := 6; Top := 0; Width := 75; Height := 25; Hint := 'Select all fields.'; Caption := '&All'; TabOrder := 0; OnClick := ButtonAllClick; NumGlyphs := 2; End; ButtonNone := TBitBtn.Create(AOwner); With ButtonNone Do Begin Parent := PanelButtonSlider; Left := 82; Top := 0; Width := 75; Height := 25; Hint := 'Have no fields selected.'; Cancel := True; Caption := '&None'; TabOrder := 1; OnClick := ButtonNoneClick; NumGlyphs := 2; End; ButtonOK := TBitBtn.Create(AOwner); With ButtonOK Do Begin Parent := PanelButtonSlider; Left := 154; Top := 0; Width := 75; Height := 25; Hint := 'Activate field selection.'; Caption := '&OK'; TabOrder := 2; OnClick := ButtonOKClick; Kind := bkOK; End; ButtonCancel := TBitBtn.Create(AOwner); With ButtonCancel Do Begin Parent := PanelButtonSlider; Left := 234; Top := 0; Width := 75; Height := 25; Hint := 'Make no changes and close this dialog.'; Caption := '&Cancel'; TabOrder := 3; OnClick := ButtonCancelClick; Kind := bkCancel; End; MsgPanel := TPanel.Create(AOwner); With MsgPanel Do Begin Parent := Self; Left := 0; Top := 0; Width := 337; Height := 25; Align := alTop; BevelOuter := bvNone; BorderWidth := 2; Caption := 'Select your fields'; ParentColor := True; TabOrder := 2; End; ButtonDummyAll := TBitBtn.Create(AOwner); With ButtonDummyAll Do Begin Parent := MsgPanel; Left := 16; Top := 8; Width := 25; Height := 25; TabOrder := 0; Visible := False; Kind := bkAll; End; ButtonDummyNone := TBitBtn.Create(AOwner); With ButtonDummyNone Do Begin Parent := MsgPanel; Left := 304; Top := 8; Width := 27; Height := 25; TabOrder := 1; Visible := False; Kind := bkNo; End; Except On E : Exception Do RaiseError(UnitName,ProcName,E); End; End; Destructor TDBFieldFilterDlg_ads.Destroy; Begin ProcName := 'TDBFieldFilterDlg_ads.Destroy'; Try ButtonDummyNone .Free; ButtonDummyAll .Free; MsgPanel .Free; ButtonCancel .Free; ButtonOK .Free; ButtonNone .Free; ButtonAll .Free; PanelButtonSlider .Free; PanelButtons .Free; FieldNameList .Free; BaseList .Free; inherited Destroy; Except On E : Exception Do RaiseError(UnitName,ProcName,E); End; End; //Unit Description UnitIndex Master Index
Function DlgDBFieldFilter_ads(DataSource: TDataSource): Boolean; Var Dialog : TForm; Form : TDBFieldFilterDlg_ads; boDataSource: Boolean; MinFormHeight: Integer; Begin Result := False; Dialog := nil; ProcName := 'DlgDBFieldFilter_ads'; Try Try Dialog := TForm.Create(nil); Form := TDBFieldFilterDlg_ads.Create(Dialog); Form.Parent:= Dialog; Form.Align := alClient; With Dialog Do Begin Left := 568; Top := 252; Width := 345; Height := 100; BorderIcons := [biSystemMenu, biMaximize]; Caption := 'Field Selection Dialog'; Color := clBtnFace; Font.Color := clWindowText; Font.Height := -14; Font.Name := 'System'; Font.Style := []; OldCreateOrder := True; Position := poScreenCenter; ShowHint := True; OnActivate := Form.FormActivate; OnCreate := Form.FormCreate; OnResize := Form.FormResize; PixelsPerInch := 96; End; Form.FormCreate(Dialog); Form.DataSource := DataSource; Form.ButtonAll.Glyph.Assign(Form.ButtonDummyAll.Glyph); Form.ButtonNone.Glyph.Assign(Form.ButtonDummyNone.Glyph); boDataSource:= DataSource<>nil; If boDataSource Then boDataSource:= (DataSource.DataSet<>nil); If boDataSource Then boDataSource:= DataSource.DataSet.Active; If boDataSource Then Begin MinFormHeight := Form.PanelButtons.Height + DataSource.DataSet.Fields.Count*25+ Form.MsgPanel.Height + 40; End Else Begin MinFormHeight := Form.PanelButtons.Height + 100+ Form.MsgPanel.Height + 40; End; Dialog.Constraints.MinHeight:=MinFormHeight; Dialog.ShowModal; If Dialog.ModalResult = mrOK Then Begin Result := True; End; Finally Dialog.Free; End; Except On E : Exception Do RaiseError(UnitName,ProcName,E); End; End; Initialization UnitName := 'ads_DlgDBFieldFilter'; ProcName := 'Unknown'; End. //