Есть DBGrid на форме.
У него есть событие OnDataHintShow.
Я его описал. Но понял что этот код будет повторятся у многих Grid'ов, решил вынести в отдельную процедуру, и передавать туда параметры.
Когда описал еще пару обработчиков, понял что параметры остаются те же что и в предыдущем, но опять же код будет повторяться и нужно его вынести.
Поэтому создал класс:
TDynamicGrid = class(DBGridEh)
Описал ему свойства и процедуру, например ShowPanel (которая выскакивает на OnDataHintShow).
Возникли вопросы:
1. Как сделать, что бы Grid (DBGridEh) расположенный на форме, стал TDynamicGrid.
Он настроен, подогнал, оформлен, и не хотелось бы создавать программно и прописывать все параметры.
Если в описании формы, я у этого грида в коде меняю класс на нужный - Делфик ругается, говорит что неправильно определен, но ошибку можно проигнорировать. Тогда все срабатывает, но! Выскакивает ошибка "Exception EInvalidPointer"
2. Все равно приходиться заходить в грид и прописывать в событии OnDataHintShow вызов этой процедуры.
Можно ли как-то в классе прописать обработчик события, что бы он по умолчанию действовал для всех объектов этого класса?
unit DynamicGrid;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.UITypes, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, CompoMansEh, Vcl.ExtCtrls,
PivotGridToolsEh, Data.DB, EhLibVCL, GridsEh, DBAxisGridsEh, DBVertGridsEh,
Vcl.StdCtrls, Vcl.DBCtrls, Data.Win.ADODB, DBGridEhGrouping, ToolCtrlsEh,
DBGridEhToolCtrls, DynVarsEh, DBGridEh, System.ImageList, Vcl.ImgList;
type
TDynamicGrid = class(TDBGridEh)
private
PanelOnGrid: TPanel;
HighlightColor: TColor;
GlobalArrSList: TStringList;
public
property GridPanel : TPanel read PanelOnGrid write PanelOnGrid;
property HColor: TColor read HighlightColor write HighlightColor;
property GlobalArr: TStringList read GlobalArrSList write GlobalArrSList;
procedure ShowPanel(Cell: TGridCoord);
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
end;
implementation
procedure TDynamicGrid.ShowPanel(Cell: TGridCoord);
var
rect: TRect;
rectX, rectY : extended;
Name, ID: string;
begin
rect := self.CellRect(Cell.X, Cell.Y);
rectX := Rect.TopLeft.X + Rect.Width;
rectY := Rect.TopLeft.Y + Rect.Height/2 + Rect.Height - 1;
if Cell.Y = self.Row then
self.PanelOnGrid.Color := self.HColor
else
self.PanelOnGrid.Color := clWhite;
self.PanelOnGrid.Left := trunc(rectX - self.PanelOnGrid.Width/2);
self.PanelOnGrid.Top := trunc(rectY);
self.PanelOnGrid.Visible := true;
Name := self.DataSource.DataSet.FieldByName('Name').AsString;
ID := self.DataSource.DataSet.FieldByName('ID').AsString;
self.GlobalArr.Values['ID'] := ID;
self.GlobalArr.Values['Name'] := Name;
TForm(self.Parent).caption := 'Справочник: ' + Name;
end;
constructor TDynamicGrid.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TDynamicGrid.Destroy;
begin
inherited;
end;
end.
Так вот. У DBGrid'а есть колонка, а у неё событие OnDataHintShow.
Делфик обработчик называется так: TForm.GridNameColumns0DataHintShow.
где 0 - это видимо номер колонки, GridName - имя Grid.
Хочу что бы автоматом это событие вызывало процедуру ShowPanel. Что бы не приходилось руками прописывать.