@KTG

Как добавить дополнительные свойства объектам одного класса и сделать обработчик один на всех?

Есть 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. Что бы не приходилось руками прописывать.
  • Вопрос задан
  • 362 просмотра
Решения вопроса 1
@KTG Автор вопроса
В итоге вышло вот так:
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;
      FieldForPanel: String;
      FieldForkey: String;
    public
      property FieldPanel : String read FieldForPanel write FieldForPanel;
      property FieldKey : String read FieldForKey write FieldForKey;
      property GridPanel : TPanel read PanelOnGrid write PanelOnGrid;
      property HColor: TColor read HighlightColor write HighlightColor;
      property GlobalArr: TStringList read GlobalArrSList write GlobalArrSList;

      procedure ShowPanel(Sender: TCustomDBGridEh;
                CursorPos: TPoint; Cell: TGridCoord; InCellCursorPos: TPoint;
                                Column: TColumnEh; var Params: TDBGridEhDataHintParams;
                                                var Processed: Boolean);

      constructor Create(AOwner : TComponent); override;
      destructor Destroy; override;
 end;

implementation

procedure TDynamicGrid.ShowPanel;
var
 ScrPt, GrdPt: TPoint;
 grCell: TGridCoord;
 rect: TRect;
 rectX, rectY : extended;
 Name, ID: string;
begin
  ScrPt := Mouse.CursorPos;
  GrdPt := self.ScreenToClient(ScrPt);

  grCell := self.MouseCoord(GrdPt.X, GrdPt.Y);

  rect := self.CellRect(grCell.X, grCell.Y);

    rectX := Rect.TopLeft.X + Rect.Width;
    rectY := Rect.TopLeft.Y + Rect.Height/2 + Rect.Height - 1;

  if grCell.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(self.FieldPanel).AsString;
      ID := self.DataSource.DataSet.FieldByName(self.FieldKey).AsString;

    self.GlobalArr.Values[self.FieldKey] := ID;
    self.GlobalArr.Values[self.FieldPanel] := Name;

   TForm(self.Parent).caption := 'Справочник: ' + Name;
end;

constructor TDynamicGrid.Create(AOwner: TComponent);
begin
  inherited;
  self.OnDataHintShow := showpanel;
end;

destructor TDynamicGrid.Destroy;
begin
  inherited;
end;

end.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kalapanga
DBGridEh и всё про него ещё и в dfm-ке прописано. Можешь попробовать её руками отредактировать. Может прокатит.
Ну а по хорошему надо дооформить TDynamicGrid как компонент, чтобы с ним обычным образом в дизайнтайме работать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы