2013-07-15 3 views
1

Как написать настраиваемое событие, которое срабатывает при изменении DBGrid.SelectedRows.Count?Как написать настраиваемое событие, которое срабатывает при изменении DBGrid.SelectedRows.Count?

Мне нужны эти события, чтобы условно показать/скрыть панель, когда выбранные строки в DBGrid равны [ноль | один] или более одного.

Поскольку в настоящее время я использую следующий код, но ИМО кодирование пользовательского события является более подходящим здесь:

TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; Field: TField; State: DBGridDrawState); 
begin 
    Panel1.Visible := TDBGrid(Sender).SelectedRows.Count > 1; 
end; 
+0

Вы должны использовать событие, которое происходит при выборе строк, например 'onclick'. – lurker

+0

Мне нужно общее событие, которое работает либо с помощью мыши, либо с клавиатуры: OnClick работает только с мышью –

+0

Ah OK. Затем я предложил бы также проверить событие keydown или keypress для компонента. Похоже, @bummi уже включил это понятие в свой ответ. – lurker

ответ

2

Чтобы поймать все события, изменяющие внутреннее Bookmarklist Yoe придется переопределить

  1. LinkActive
  2. KeyDown
  3. MouseDown

выше пример как класс промежуточных элементов, может быть изменен на новый компонент.

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB; 

type 
    TDBGrid=Class(DBGrids.TDBGrid) 
    private 
    FOnSelectionChanged: TNotifyEvent; 
    procedure LinkActive(Value: Boolean); override; 
    procedure KeyDown(var Key: Word; Shift: TShiftState);override; 
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; 
     X, Y: Integer); override; 
    published 
    published 
    property OnSelectionChanged:TNotifyEvent read FOnSelectionChanged write FOnSelectionChanged; 
    End; 

    TForm1 = class(TForm) 
    ADODataSet1: TADODataSet; 
    DataSource1: TDataSource; 
    DBGrid1: TDBGrid; 
    Button1: TButton; 
    procedure MyOnSelectionChanged(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private-Deklarationen } 
    public 
    { Public-Deklarationen } 
    end; 

var 
    Form1: TForm1; 

implementation 
uses unit3; 
{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    AdoDataset1.Active := Not AdoDataset1.Active; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    DBGrid1.OnSelectionChanged := MyOnSelectionChanged; 
end; 

procedure TForm1.MyOnSelectionChanged(Sender: TObject); 
begin 
    Caption := IntToStr(TDBGrid(Sender).SelectedRows.Count); 

end; 

{ TDBGrid } 

procedure TDBGrid.KeyDown(var Key: Word; Shift: TShiftState); 

begin 
    inherited; 
    if Assigned(FOnSelectionChanged) then FOnSelectionChanged(self); 

end; 

procedure TDBGrid.LinkActive(Value: Boolean); 
begin 
    inherited; 
    if Assigned(FOnSelectionChanged) then FOnSelectionChanged(self); 

end; 

procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    inherited; 
    if Assigned(FOnSelectionChanged) then FOnSelectionChanged(self); 

end; 

end. 
+1

Большое спасибо @bummi! Это именно то, что я ищу! –

Смежные вопросы