diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.lpi b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.lpi index b98305288..58fc4da7d 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.lpi +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.lpi @@ -55,13 +55,13 @@ - + - + @@ -70,9 +70,9 @@ - - - + + + @@ -407,12 +407,10 @@ - - + - @@ -447,10 +445,11 @@ - - - - + + + + + @@ -468,129 +467,163 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + - - + + - - + + - + + - - + - - + + - - + + - - + + - - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + @@ -615,4 +648,20 @@ + + + + + + + + + + + + + + + + diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.res b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.res index 6d5b2ae4e..c51fa0c8d 100644 Binary files a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.res and b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/RxDBGridDemo.res differ diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.lfm b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.lfm index 184d44000..9b0ac1674 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.lfm +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.lfm @@ -11,7 +11,7 @@ object RxDBGridMainForm: TRxDBGridMainForm OnCreate = FormCreate SessionProperties = 'RxDBGridExportSpreadSheet1.FileName;RxDBGridExportSpreadSheet1.OpenAfterExport;RxDBGridExportSpreadSheet1.Options;RxDBGridExportSpreadSheet1.PageName;RxDBGridPrint1.Options;RxDBGridPrint1.Orientation;RxDBGridPrint1.PageMargin;RxDBGridPrint1.ReportTitle;RxDBGridPrint1.ShowColumnHeaderOnAllPage' ShowHint = True - LCLVersion = '1.7' + LCLVersion = '1.9.0.0' object RxDBGrid1: TRxDBGrid Left = 0 Height = 627 @@ -33,8 +33,6 @@ object RxDBGridMainForm: TRxDBGridMainForm Constraints.MinWidth = 50 Constraints.MaxWidth = 150 EditButtons = <> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.EmptyValue = '(Нет)' @@ -59,8 +57,6 @@ object RxDBGridMainForm: TRxDBGridMainForm Width = 100 FieldName = 'ID' EditButtons = <> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.Color = clLime @@ -83,8 +79,6 @@ object RxDBGridMainForm: TRxDBGridMainForm FieldName = 'Developer' Constraints.MinWidth = 10 EditButtons = <> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.Color = clLime @@ -92,6 +86,7 @@ object RxDBGridMainForm: TRxDBGridMainForm Filter.AllValue = '(All values)' Filter.EmptyFont.Style = [fsItalic] Filter.ItemIndex = -1 + Filter.Style = rxfstDialog Footer.Value = 'This is test' Footer.ValueType = fvtStaticText Footer.Font.Color = clRed @@ -111,8 +106,6 @@ object RxDBGridMainForm: TRxDBGridMainForm Width = 110 FieldName = 'NAME' EditButtons = <> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.Color = clLime @@ -120,6 +113,7 @@ object RxDBGridMainForm: TRxDBGridMainForm Filter.AllValue = '(All values)' Filter.EmptyFont.Style = [fsItalic] Filter.ItemIndex = -1 + Filter.Style = rxfstManualEdit Footers = <> WordWrap = True end @@ -146,8 +140,6 @@ object RxDBGridMainForm: TRxDBGridMainForm Hint = 'Clear value' OnClick = TRxColumnEditButtons2Click end> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.Color = clLime @@ -182,8 +174,6 @@ object RxDBGridMainForm: TRxDBGridMainForm Width = 136 FieldName = 'Date_Present' EditButtons = <> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.EmptyValue = '(Нет)' @@ -201,8 +191,6 @@ object RxDBGridMainForm: TRxDBGridMainForm Width = 141 FieldName = 'DEVELOPER_ID' EditButtons = <> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.EmptyValue = '(Нет)' @@ -364,8 +352,6 @@ object RxDBGridMainForm: TRxDBGridMainForm Hint = 'Style "UpDownRx"' Style = ebsUpDownRx end> - Filter.IsNull = False - Filter.IsAll = True Filter.Font.Style = [fsItalic] Filter.DropDownRows = 0 Filter.EmptyValue = '(Нет)' @@ -450,7 +436,6 @@ object RxDBGridMainForm: TRxDBGridMainForm GridLineStyle = psSolid DataSource = Datasource1 Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColumnMove, dgColLines, dgRowLines, dgTabs, dgAlwaysShowSelection, dgConfirmDelete, dgMultiselect, dgHeaderPushedLook] - ParentColor = False PopupMenu = PopupMenu1 TabOrder = 0 TitleStyle = tsNative diff --git a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.pas b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.pas index db9695a6a..a7674e032 100644 --- a/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.pas +++ b/components/rx/trunk/demos/rxdbgrid/RxDBGrid/rxdbgridmainunit.pas @@ -131,7 +131,7 @@ begin RxMemoryData2.AppendRecord([3, 'Microsoft']); RxMemoryData1.Open; - RxMemoryData1.AppendRecord([1, 'Lazarus 0.9.23', 0, 'Open source', EncodeDate(2006, 1, 1), 1]); + RxMemoryData1.AppendRecord([1, 'Lazarus', 0, 'Open source', EncodeDate(2006, 1, 1), 1]); RxMemoryData1.AppendRecord([2, 'Delphi 7.0 Prof', 990, 'Borland', EncodeDate(2002, 1, 1), 2]); RxMemoryData1.AppendRecord([3, 'Open Office 2.2.0', 0, 'Open source', EncodeDate(2006, 10, 1), 1]); RxMemoryData1.AppendRecord([4, 'Microsoft Office', 150, 'Microsoft', EncodeDate(1997, 8, 12), 3]); @@ -147,6 +147,8 @@ begin RxMemoryData1.AppendRecord([14, 'Бух. комплекс "45-я Параллель"', 180, 'ООО "Boot"', EncodeDate(2007, 2, 1), 3]); RxMemoryData1.AppendRecord([15, 'Консультант+', 380, 'Консультант+', EncodeDate(2007, 2, 1), 3]); RxMemoryData1.AppendRecord([16, 'Гарант', 480, 'Гарант', EncodeDate(2007, 2, 1), 3]); + RxMemoryData1.AppendRecord([17, 'Fedora Linux', 0, 'Open source', EncodeDate(2007, 2, 1), 3]); + RxMemoryData1.AppendRecord([17, 'Ubuntu Linux', 0, 'Open source', EncodeDate(2007, 2, 1), 3]); RxMemoryData1.First; @@ -234,22 +236,20 @@ end; procedure TRxDBGridMainForm.DoFillFilters; var - C:TRxColumn; - i:integer; + C: TRxColumn; begin - for i:=0 to RxDBGrid1.Columns.Count-1 do + for C in RxDBGrid1.Columns do begin - C:=TRxColumn(RxDBGrid1.Columns[i]); C.Filter.EmptyValue:='None...'; C.Filter.ValueList.Add(C.Filter.EmptyValue); +// C.Filter.Style:=; end; RxMemoryData1.First; while not RxMemoryData1.EOF do begin - for i:=0 to RxDBGrid1.Columns.Count-1 do + for C in RxDBGrid1.Columns do begin - C:=TRxColumn(RxDBGrid1.Columns[i]); if C.Filter.ValueList.IndexOf(C.Field.AsString)<0 then C.Filter.ValueList.Add(C.Field.AsString); end; diff --git a/components/rx/trunk/rxdb/rxdbgrid.pas b/components/rx/trunk/rxdb/rxdbgrid.pas index 6b4ed5285..22a397d9c 100644 --- a/components/rx/trunk/rxdb/rxdbgrid.pas +++ b/components/rx/trunk/rxdb/rxdbgrid.pas @@ -384,7 +384,7 @@ type { TRxColumnFilter } TRxFilterState = (rxfsAll, rxfsEmpty, rxfsNonEmpty, rxfsFilter{, rxfsTopXXXX}); - TRxFilterStyle = (rxfstSimple, rxfstDialog); + TRxFilterStyle = (rxfstSimple, rxfstDialog, rxfstManualEdit); TRxColumnFilter = class(TPersistent) private @@ -710,6 +710,23 @@ type property Col: integer read FCol; end; + { TFilterSimpleEdit } + + TFilterSimpleEdit = class(TEdit) + private + FGrid: TCustomGrid; + FCol: integer; + FMouseFlag: boolean; + protected + procedure WndProc(var TheMessage: TLMessage); override; + procedure KeyDown(var Key: word; Shift: TShiftState); override; + public + procedure Show(Grid: TCustomGrid; Col: integer); + property Grid: TCustomGrid read FGrid; + property Col: integer read FCol; + property MouseFlag: boolean read FMouseFlag write FMouseFlag; + end; + { TRxDBGrid } TRxDBGrid = class(TCustomDBGrid) @@ -763,6 +780,7 @@ type FFilterListEditor: TFilterListCellEditor; FFilterColDlgButton: TFilterColDlgButton; + FFilterSimpleEdit:TFilterSimpleEdit; // FOldPosition: Integer; FVersion: integer; @@ -892,6 +910,7 @@ type procedure FFilterListEditorOnChange(Sender: TObject); procedure FFilterListEditorOnCloseUp(Sender: TObject); procedure FFilterColDlgButtonOnClick(Sender: TObject); + procedure FFilterSimpleEditOnChange(Sender: TObject); procedure InternalOptimizeColumnsWidth(AColList: TList); procedure VisualChange; override; @@ -1245,6 +1264,45 @@ type procedure EditingDone; override; end; +{ TFilterSimpleEdit } + +procedure TFilterSimpleEdit.WndProc(var TheMessage: TLMessage); +begin + if TheMessage.msg = LM_KILLFOCUS then + begin + Change; + Hide; + if HWND(TheMessage.WParam) = HWND(Handle) then + begin + // lost the focus but it returns to ourselves + // eat the message. + TheMessage.Result := 0; + exit; + end; + end; + inherited WndProc(TheMessage); +end; + +procedure TFilterSimpleEdit.KeyDown(var Key: word; Shift: TShiftState); +begin + inherited KeyDown(Key, Shift); + case Key of + VK_RETURN: + begin + Change; + Hide; + end; + end; +end; + +procedure TFilterSimpleEdit.Show(Grid: TCustomGrid; Col: integer); +begin + FGrid := Grid; + FCol := Col; + Visible := True; + SetFocus; +end; + { TRxColumnGroupParam } procedure TRxColumnGroupParam.FontChanged(Sender: TObject); @@ -3155,6 +3213,7 @@ begin begin FFilterListEditor.Hide; FFilterColDlgButton.Hide; + FFilterSimpleEdit.Hide; LayoutChanged; end; @@ -3390,6 +3449,11 @@ begin RowHeights[0] := RowHeights[0] + FFilterListEditor.Height end else + if Assigned(FFilterSimpleEdit) then + begin + RowHeights[0] := RowHeights[0] + FFilterSimpleEdit.Height + end + else begin RowHeights[0] := RowHeights[0] + FDefRowH; end; @@ -4858,6 +4922,11 @@ begin begin if C.Filter.Style = rxfstSimple then begin + if FFilterSimpleEdit.Visible then + FFilterSimpleEdit.Hide; + if FFilterColDlgButton.Visible then + FFilterColDlgButton.Hide; + FFilterListEditor.Style := csDropDownList; if C.Filter.DropDownRows>0 then FFilterListEditor.DropDownCount := C.Filter.DropDownRows; @@ -4876,10 +4945,32 @@ begin FFilterListEditor.Show(Self, Cell.x - 1); end else + if C.Filter.Style = rxfstManualEdit then begin if FFilterListEditor.Visible then FFilterListEditor.Hide; + if FFilterColDlgButton.Visible then + FFilterColDlgButton.Hide; + + FFilterSimpleEdit.Parent := Self; + FFilterSimpleEdit.Width := Rect.Right - Rect.Left; + FFilterSimpleEdit.Height := Rect.Bottom - Rect.Top; + FFilterSimpleEdit.BoundsRect := Rect; + if C.Filter.CurrentValues.Count>0 then + FFilterSimpleEdit.Text := C.Filter.CurrentValues[0] + else + FFilterSimpleEdit.Text := ''; + FFilterSimpleEdit.Show(Self, Cell.x - 1); + end + else + begin + if FFilterListEditor.Visible then + FFilterListEditor.Hide; + + if FFilterSimpleEdit.Visible then + FFilterSimpleEdit.Hide; + FFilterColDlgButton.Parent:=Self; FFilterColDlgButton.Width := 32; FFilterColDlgButton.Height := Rect.Bottom - Rect.Top; @@ -5391,6 +5482,24 @@ begin RxDBGrid_PopUpFilterForm.Free; end; +procedure TRxDBGrid.FFilterSimpleEditOnChange(Sender: TObject); +begin + with TRxColumn(Columns[Columns.RealIndex(FFilterSimpleEdit.Col)]).Filter do + begin + CurrentValues.Text:=FFilterSimpleEdit.Text; + State:=rxfsFilter; + end; + + DataSource.DataSet.DisableControls; + DataSource.DataSet.Filtered:=false; + DataSource.DataSet.Filtered:=true; + CalcStatTotals; + DataSource.DataSet.EnableControls; + + if Assigned(FOnFiltred) then + FOnFiltred(Self); +end; + procedure TRxDBGrid.InternalOptimizeColumnsWidth(AColList: TList); var P: TBookmark; @@ -5485,9 +5594,16 @@ begin FFilterListEditor.Left:=R.Left; end else + if FFilterSimpleEdit.Visible then + begin + R:=CellRect(FFilterSimpleEdit.Col+1,0); + FFilterSimpleEdit.Width:=Columns[FFilterSimpleEdit.Col].Width; + FFilterSimpleEdit.Left:=R.Left; + end + else if FFilterColDlgButton.Visible then begin - R:=CellRect(FFilterListEditor.Col+1,0); + R:=CellRect(FFilterColDlgButton.Col+1,0); FFilterColDlgButton.Left := R.Right - FFilterColDlgButton.Width; end; end; @@ -5834,6 +5950,15 @@ begin else} if Filter.CurrentValues.Count > 0 then begin + if Filter.Style = rxfstManualEdit then + begin + if UTF8Pos(UTF8UpperCase(Filter.CurrentValues[0]), UTF8UpperCase(Field.DisplayText)) < 1 then + begin + Accept := False; + break; + end; + end + else if Filter.CurrentValues.IndexOf(Field.DisplayText) < 0 then begin Accept := False; @@ -6690,6 +6815,12 @@ begin FFilterColDlgButton.OnClick := @FFilterColDlgButtonOnClick; FFilterColDlgButton.Glyph.Assign(FEllipsisRxBMP); + + FFilterSimpleEdit:=TFilterSimpleEdit.Create(nil); + FFilterSimpleEdit.Name := 'FFilterSimpleEdit'; + FFilterSimpleEdit.Visible := False; + FFilterSimpleEdit.OnChange := @FFilterSimpleEditOnChange; + FColumnResizing := False; FRxDbGridLookupComboEditor := TRxDBGridLookupComboEditor.Create(nil); @@ -7070,7 +7201,6 @@ end; procedure TFilterListCellEditor.WndProc(var TheMessage: TLMessage); begin - if TheMessage.msg = LM_KILLFOCUS then begin Change; diff --git a/components/rx/trunk/rxdb/rxmemds.pas b/components/rx/trunk/rxdb/rxmemds.pas index 4f4cd53be..b453f6bad 100644 --- a/components/rx/trunk/rxdb/rxmemds.pas +++ b/components/rx/trunk/rxdb/rxmemds.pas @@ -1082,7 +1082,7 @@ begin Result := FActive and (TBookmarkData(ABookmark^) > Low(Integer)) and (TBookmarkData(ABookmark^) <= FLastID); {$ELSE} - Result := FActive and (TBookmarkData(pointer(ABookmark)^) > Low(Integer)) and + Result := FActive and Assigned(ABookmark) and (TBookmarkData(pointer(ABookmark)^) > Low(Integer)) and (TBookmarkData(pointer(ABookmark)^) <= FLastID); {$ENDIF} end;