Come faccio a rilevare l'evento clic di un pulsante che ha un TDBGrid come padre?
Domanda
Ho un piccolo pulsante che voglio aggiungere verso l'angolo sinistro superiore di un componente Delphi TDBGrid (nelle cellule intestazione / titolo). Sono in grado di posizionare facilmente il pulsante, ma ora l'evento click non viene gestito. Sto indovinando l'evento è stato catturato dalla griglia. Un modo per forzare questo evento specifico per andare al pulsante, invece? Nota ho ancora bisogno della griglia per gestire cliccare eventi per i suoi pulsanti titolo, come invece accade attualmente.
procedure TForm38.FormCreate(Sender: TObject);
begin
button1.Parent := grid;
button1.Top := 0;
button1.Left := 0;
button1.Width := 12;
button1.Height := 18;
button1.OnClick := Button1Click;
end;
** Aggiornamento:. ** ho scoperto che ero in grado di utilizzare evento MouseDown del pulsante che sembra funzionare bene, ma non ho potuto utilizzare l'evento click
procedure TForm38.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ( Button = mbLeft ) then
TButton(Sender).Click;
end;
Soluzione
Io non sono sicuro perché sta mangiando il messaggio click. In realtà simulare l'evento click attraverso il gestore di eventi MouseUp.
procedure TForm38.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ctrl: TButton;
begin
ctrl := Sender as TButton;
if (x > 0) and (x < ctrl.Width) and (y > 0) and (y < ctrl.Height) then
ctrl.Click;
end;
Se si prova un normale pulsante vedrete che l'evento click non avviene fino al rilascio del mouse. Simulazione di un clic sul pulsante crea giù strano comportamento.
Altri suggerimenti
Wow, questo è un toughie. TDBGrid non dispone di un gestore di eventi generico "OnClick", e la posizione del pulsante rende difficile fingere. L'unica cosa che mi viene in mente è quello di creare il proprio componente. Questo non è così difficile come potrebbe sembrare in un primo momento. Si scende da TDBGrid e l'override del metodo MouseUp. Date un'occhiata al modo in cui TCustomDBGrid.MouseUp è implementato. Non ho ancora testato questo, ma probabilmente si potrebbe provare qualcosa di simile: Dopo l'istruzione if che i test per
(cell.x >= FIndicatorOffset)
e spara eventi click, l'hanno fuoco TitleClick (zero) o qualcosa se cell.x
Di seguito è una soluzione pulita, provato con successo sia con Delphi 1 e Delphi 2007:
procedure TForm38.FormCreate(Sender: TObject);
begin
button1.Parent := grid;
button1.Top := 0;
button1.Left := 0;
button1.Width := 12;
button1.Height := 18;
button1.OnClick := Button1Click;
// only add this line
button1.ControlStyle := button1.ControlStyle + [csClickEvents];
end;