@@ -297,6 +297,8 @@ TLabeledDbGrid = class;
297297 TCBCheckBoxedColumnEvent = procedure (Column: TColumn; var IsCheckBoxedColumn: Boolean) of object ;
298298 TColumnNotifyEvent = procedure (Column: TColumn) of object ;
299299
300+ TGridIncrementalSearchType = (stBeginsWith, stFilterBy);
301+
300302 TLabeledDbGrid = class (TDBGrid)
301303 private
302304 FBoundLabel: TControlBoundLabel;
@@ -320,6 +322,9 @@ TLabeledDbGrid = class(TDBGrid)
320322 FLinesPerRow: Integer;
321323 FRowMargin: Integer;
322324 FWrapAllText: Boolean;
325+ FColMoving: Boolean;
326+ FTitleMouseDown: boolean;
327+ FIncrementalSearchType: TGridIncrementalSearchType;
323328 function TitleOffset : Integer;
324329 procedure OnSearchTimer (Sender : TObject);
325330 procedure SetBoundCaption (const Value : TCaption);
@@ -344,6 +349,7 @@ TLabeledDbGrid = class(TDBGrid)
344349 function isCheckBoxedField (Field: TField): boolean;
345350 function isUnsortableField (Field: TField): boolean;
346351 procedure doIncrementalLocate ;
352+ procedure doIncrementalFilter ;
347353 procedure SetIncrementalSearchDelay (const Value : integer);
348354 function GetIncrementalSearchDelay : integer;
349355 procedure SetDrawCheckBoxImages (const Value : Boolean);
@@ -358,6 +364,7 @@ TLabeledDbGrid = class(TDBGrid)
358364 const AField: TField; Const AColumn: TColumn);
359365 function CalcRowMargin (const ARect: TRect): Integer;
360366 procedure SetWrapAllText (const Value : Boolean);
367+ procedure SetColMoving (const Value : Boolean);
361368 protected
362369 procedure SetParent (AParent: TWinControl); override;
363370 procedure Notification (AComponent: TComponent; Operation: TOperation); override;
@@ -379,12 +386,17 @@ TLabeledDbGrid = class(TDBGrid)
379386 procedure MouseMove (Shift: TShiftState; X, Y: Integer); override;
380387 procedure MouseDown (Button: TMouseButton; Shift: TShiftState;
381388 X, Y: Integer); override;
389+ procedure MouseUp (Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
390+
382391 function GetBorderStyle : TBorderStyle;
383392 { $IF DEFINE DXE8+}
384393 procedure ChangeScale (M, D: Integer; isDpiChange: Boolean); override;
385394 { $ELSE}
386395 procedure ChangeScale (M, D: Integer); override;
387396 { $ENDIF}
397+
398+ function CreateColumns : TDBGridColumns; override;
399+
388400 public
389401 procedure DefaultDrawColumnCell (const Rect: TRect; DataCol: Integer;
390402 Column: TColumn; State: TGridDrawState);
@@ -408,6 +420,8 @@ TLabeledDbGrid = class(TDBGrid)
408420 function ColumnIndexByFieldName (const AFieldName: string): Integer;
409421 function GetMouseOverField (X, Y: Integer): TField;
410422 function GetDefaultRowHeight : Integer;
423+ procedure ClearFilters ;
424+
411425 published
412426 property TitleFont: TFont read GetTitleFont write SetTitleFont stored False;
413427 property IsEmpty: Boolean read GetIsEmpty;
@@ -431,6 +445,8 @@ TLabeledDbGrid = class(TDBGrid)
431445 property CanEditColumn: TCBCanEditColumn read FCanEditColumn write FCanEditColumn;
432446 property RowMargin: Integer read FRowMargin write SetRowMargin default 0 ;
433447 property WrapAllText: Boolean read FWrapAllText write SetWrapAllText default False;
448+ property ColMoving: Boolean read FColMoving write SetColMoving default True;
449+ property IncrementalSearchType: TGridIncrementalSearchType read FIncrementalSearchType write FIncrementalSearchType default stBeginsWith;
434450 end ;
435451
436452 TNavInsMode = (imInsert, imAppend);
@@ -449,6 +465,14 @@ implementation
449465 DBActns, UxTheme, UITypes,
450466 // Labeled components
451467 Vcl.DbAwareLabeledUtils, Vcl.LabeledCtrls;
468+
469+ type
470+ TXColumn = class (TColumn)
471+ private
472+ FTitleCaption: string;
473+ public
474+ property TitleCaption: string read FTitleCaption write FTitleCaption;
475+ end ;
452476
453477var
454478 DbGridPrintSupport: TStringList;
@@ -1199,10 +1223,17 @@ constructor TLabeledDbGrid.Create(AOwner: TComponent);
11991223 FDrawCheckBoxImages := True;
12001224 FShowSortOrder := True;
12011225 FIncrementalSearch := False;
1226+ FIncrementalSearchType := stBeginsWith;
12021227 FSearchTimer := TTimer.Create(nil );
12031228 FSearchTimer.Interval := INCREMENTAL_DELAY_DEFAULT;
12041229 FSearchTimer.Enabled := False;
12051230 FSearchTimer.OnTimer := OnSearchTimer;
1231+ FColMoving := True;
1232+ end ;
1233+
1234+ function TLabeledDbGrid.CreateColumns : TDBGridColumns;
1235+ begin
1236+ Result := TDBGridColumns.Create(Self, TXColumn)
12061237end ;
12071238
12081239procedure TLabeledDbGrid.VisibleChanging ;
@@ -1337,6 +1368,8 @@ procedure TLabeledDbGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGr
13371368 SortOrder: TCBSortOrder;
13381369 LRect: TRect;
13391370 LDataLinkActive: Boolean;
1371+
1372+ Text: string;
13401373begin
13411374 dxGridSortedShapeMinWidth := ARect.Bottom - ARect.Top; // 16
13421375 // se è il record corrente aggiorno il flag in modo tale che nell'evento
@@ -1351,6 +1384,26 @@ procedure TLabeledDbGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGr
13511384 FDrawingCurrentRecord := True
13521385 else
13531386 FDrawingCurrentRecord := False;
1387+
1388+ // artifizio per avere i puntini di sospensione anche in caso di troncatura del testo sul titolo
1389+ if not FTitleMouseDown and (gdFixed in AState) and (ACol > 0 ) and not (csDesigning in ComponentState) then
1390+ begin
1391+ DrawColumn := Columns[ACol];
1392+ Text := TXColumn(DrawColumn).TitleCaption;
1393+
1394+ if Text = ' ' then
1395+ begin
1396+ Text := DrawColumn.Title.Caption;
1397+ TXColumn(DrawColumn).TitleCaption := Text; // prima assegnazione della caption originale
1398+ end ;
1399+
1400+ if (StrRicercaIncrementale <> ' ' ) and (SelectedIndex = ACol) then
1401+ Text := ' [' + StrRicercaIncrementale + ' ] ' +Text;
1402+
1403+ DrawColumn.Title.Caption := TruncStringInRect(Canvas, ARect, Text, 2 ) ;
1404+ end ;
1405+ // --ale
1406+
13541407 finally
13551408 Inc(ACol, IndicatorOffset);
13561409 end ;
@@ -1619,6 +1672,9 @@ procedure TLabeledDbGrid.SetOnBkCellColorAssign(const Value: TCBBkCellColorAssig
16191672procedure TLabeledDbGrid.MouseDown (Button: TMouseButton; Shift: TShiftState; X,
16201673 Y: Integer);
16211674begin
1675+ FTitleMouseDown := (Button = mbLeft) and (Shift = [ssLeft])
1676+ and isMouseOverTitleColumn(X,Y) and not Sizing(X,Y);
1677+
16221678 inherited ;
16231679 if (Button = mbLeft) and (Shift = [ssLeft]) then
16241680 begin
@@ -2135,12 +2191,67 @@ procedure TLabeledDbGrid.doIncrementalSearch(Key: Char);
21352191 FSearchTimer.Enabled := True;
21362192end ;
21372193
2194+ procedure TLabeledDbGrid.doIncrementalFilter ;
2195+ var
2196+ IntValue: Integer;
2197+ DateValue: TDateTime;
2198+ begin
2199+ FSearchTimer.Enabled := False;
2200+
2201+ if (DataSource = nil ) or (Datasource.DataSet = nil ) or (SelectedField = nil ) then
2202+ Exit;
2203+
2204+ Datasource.DataSet.Filtered := False;
2205+
2206+ if StrRicercaIncrementale = ' ' then
2207+ Datasource.DataSet.Filter := ' '
2208+ else
2209+ begin
2210+ Screen.Cursor := crHourGlass;
2211+ Try
2212+ if SelectedField.InheritsFrom(TNumericField) then
2213+ begin
2214+ if TryStrToInt(StrRicercaIncrementale, IntValue) then
2215+ Datasource.DataSet.Filter := SelectedField.FieldName + ' =' + IntValue.ToString;
2216+ end
2217+ else if SelectedField.InheritsFrom(TDateField) then
2218+ begin
2219+ if TryStrToDateTime(StrRicercaIncrementale, DateValue) then
2220+ Datasource.DataSet.Filter := SelectedField.FieldName + ' =' + QuotedStr(DateToStr(DateValue));
2221+ end
2222+ else if SelectedField.InheritsFrom(TDateTimeField) or SelectedField.InheritsFrom(TSQLTimeStampField) then
2223+ begin
2224+ if TryStrToDateTime(StrRicercaIncrementale, DateValue) then
2225+ Datasource.DataSet.Filter := SelectedField.FieldName + ' >=' + QuotedStr(DateTimeToStr(DateValue));
2226+ end
2227+ else
2228+ Datasource.DataSet.Filter := SelectedField.FieldName+ ' like ' +QuotedStr(' %' +StrRicercaIncrementale+' %' );
2229+
2230+ Datasource.DataSet.Filtered := True;
2231+ Finally
2232+ Screen.Cursor := crDefault;
2233+ End ;
2234+ end ;
2235+ end ;
2236+
2237+ procedure TLabeledDbGrid.ClearFilters ;
2238+ begin
2239+ ChangeStrSearch(' ' );
2240+ OnSearchTimer(self);
2241+ end ;
2242+
2243+
2244+
21382245procedure TLabeledDbGrid.doIncrementalLocate ;
21392246var
21402247 IntValue: Integer;
21412248 DateValue: TDateTime;
21422249begin
21432250 FSearchTimer.Enabled := False;
2251+
2252+ if (DataSource = nil ) or (Datasource.DataSet = nil ) or (SelectedField = nil ) then
2253+ Exit;
2254+
21442255 if StrRicercaIncrementale <> ' ' then
21452256 begin
21462257 Screen.Cursor := crHourGlass;
@@ -2308,6 +2419,13 @@ procedure TLabeledDbGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
23082419 end ;
23092420end ;
23102421
2422+ procedure TLabeledDbGrid.MouseUp (Button: TMouseButton; Shift: TShiftState;
2423+ X, Y: Integer);
2424+ begin
2425+ FTitleMouseDown := False;
2426+ inherited ;
2427+ end ;
2428+
23112429procedure TLabeledDbGrid.SetCheckBoxedFields (const Value : string);
23122430begin
23132431 if FCheckBoxedFields <> Value then
@@ -2318,7 +2436,10 @@ procedure TLabeledDbGrid.SetCheckBoxedFields(const Value: string);
23182436
23192437procedure TLabeledDbGrid.OnSearchTimer (Sender: TObject);
23202438begin
2321- doIncrementalLocate;
2439+ case FIncrementalSearchType of
2440+ stBeginsWith: doIncrementalLocate;
2441+ stFilterBy : doIncrementalFilter;
2442+ end ;
23222443end ;
23232444
23242445procedure TLabeledDbGrid.SetIncrementalSearchDelay (const Value : integer);
@@ -2373,6 +2494,23 @@ function TLabeledDbGrid.ChangeColumnFieldName(const OldFieldName,
23732494 Column.FieldName := NewFieldName;
23742495end ;
23752496
2497+
2498+ type
2499+ THackCustomGrid = class (TCustomGrid)
2500+ public
2501+ property Options;
2502+ end ;
2503+
2504+ procedure TLabeledDbGrid.SetColMoving (const Value : Boolean);
2505+ begin
2506+ FColMoving := Value ;
2507+ with THackCustomGrid(Self) do
2508+ if Value then
2509+ Options := Options + [goColMoving]
2510+ else
2511+ Options := Options - [goColMoving];
2512+ end ;
2513+
23762514{ TLabeledDBLabel }
23772515
23782516constructor TLabeledDBLabel.Create(AOwner: TComponent);
0 commit comments