Come faccio a rilevare l'evento clic di un pulsante che ha un TDBGrid come padre?

StackOverflow https://stackoverflow.com/questions/748190

  •  09-09-2019
  •  | 
  •  

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;
È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top