2013-02-25 3 views
2

У меня есть компонент TDBGrid. Мне нужно поймать событие, вызванное, когда я изменяю размер столбца сетки.Где произошло событие изменения размера столбцов TDBGrid

+1

Я не могу понять этот вопрос. Вы спрашиваете, как управление запускает событие? Если это так, это так же просто для вас, как для нас, чтобы посмотреть исходный код. –

+0

теперь должно быть более понятно :) – RBA

+1

@RBA - Это, безусловно, более ясно. Но действительно ли вопрос, который должен был спросить? –

ответ

3

единственное место, чтобы получить события, кажется, перекрывая ColWidthChanged ...

type 
    TDBgrid=Class(DBGrids.TDBGrid) 
     private 
     FColResize:TNotifyEvent; 
     procedure ColWidthsChanged; override; 
     protected 
     Property OnColResize:TNotifyEvent read FColResize Write FColResize; 
    End; 

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

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TDBgrid } 

procedure TDBgrid.ColWidthsChanged; 
begin 
    inherited; 
    if Assigned(FColResize) then FColResize(self); 

end; 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
    DBgrid1.OnColResize := ColResize; 
end; 

procedure TForm1.ColResize(Sender:TObject); 
begin 
    Caption := FormatDateTime('nn:zzz',now) ; 
end; 
3

вам нужно создать потомок TDBGrid и осуществлять мероприятия самостоятельно. Что-то вроде этого:

unit MyDBGrid; 

interface 

type 
    TMyDBGrid = class(TDBGrid) 
    private 
    FOnColResize: TNotifyEvent; 
    protected 
    procedure ColWidthsChanged; override; 
    public 
    published 
    property OnColResize: TNotifyEvent read FOnColResize write FOnColResize; 
    end; 

implementation 

{ TMyDBGrid } 

procedure TMyDBGrid.ColWidthsChanged; 
begin 
    inherited; 
    if (Datalink.Active or (Columns.State = csCustomized)) and 
    AcquireLayoutLock and Assigned(FOnColResize) then 
    FOnColResize(Self); 
end; 

end. 

Это должно работать, у меня нет времени, чтобы проверить его.

+0

Спасибо +1. Вам не нужно отменять эффект AquireLayoutLock, так как он вызывает BeginLayout, которому нужен EndLayout? – DaveBoltman

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