Как добавить дополнительные свойства объектам одного класса и сделать обработчик один на всех? Есть 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. Что бы не приходилось руками прописывать.
Чтобы наследовать от TDynamicGrid, нужно в редакторе форм изменить класс DBGridEh на TDynamicGrid. Делается это следующим образом:
Откройте форму с DBGridEh в редакторе форм.Выделите DBGridEh и откройте его свойства в Object Inspector.В свойстве Class выберите TDynamicGrid.Программа сначала выдаст ошибку, потому что TDynamicGrid находится в отдельном модуле. Щелкните по кнопке "Ignore Errors", чтобы игнорировать это.Перекомпилируйте проект.
Чтобы автоматически вызывать процедуру ShowPanel из события OnDataHintShow, вам нужно переопределить метод DataHintShow в классе TDynamicGrid. Примерно так:
type TDynamicGrid = class(TDBGridEh) private PanelOnGrid: TPanel; HighlightColor: TColor; GlobalArrSList: TStringList; procedure DataHintShow(var HintInfo: THintInfo; var AtPoint: TPoint; var Processed: Boolean); 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); begin // Ваш код для показа панели end; procedure TDynamicGrid.DataHintShow(var HintInfo: THintInfo; var AtPoint: TPoint; var Processed: Boolean); begin ShowPanel(HintInfo.CursorPos); end;
Теперь при создании экземпляра TDynamicGrid, метод ShowPanel будет автоматически вызываться из события OnDataHintShow без дополнительных прописываний.
Надеюсь, это поможет вам достичь вашей цели. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.
Чтобы наследовать от TDynamicGrid, нужно в редакторе форм изменить класс DBGridEh на TDynamicGrid. Делается это следующим образом:
Откройте форму с DBGridEh в редакторе форм.Выделите DBGridEh и откройте его свойства в Object Inspector.В свойстве Class выберите TDynamicGrid.Программа сначала выдаст ошибку, потому что TDynamicGrid находится в отдельном модуле. Щелкните по кнопке "Ignore Errors", чтобы игнорировать это.Перекомпилируйте проект.Чтобы автоматически вызывать процедуру ShowPanel из события OnDataHintShow, вам нужно переопределить метод DataHintShow в классе TDynamicGrid. Примерно так:
typeTDynamicGrid = class(TDBGridEh)
private
PanelOnGrid: TPanel;
HighlightColor: TColor;
GlobalArrSList: TStringList;
procedure DataHintShow(var HintInfo: THintInfo; var AtPoint: TPoint; var Processed: Boolean);
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);
begin
// Ваш код для показа панели
end;
procedure TDynamicGrid.DataHintShow(var HintInfo: THintInfo; var AtPoint: TPoint; var Processed: Boolean);
begin
ShowPanel(HintInfo.CursorPos);
end;
Теперь при создании экземпляра TDynamicGrid, метод ShowPanel будет автоматически вызываться из события OnDataHintShow без дополнительных прописываний.
Надеюсь, это поможет вам достичь вашей цели. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.