Newsgroup: it.comp.lang.delphi
Titolo: onDblClick su componente

Salve a tutto il NG.
ho creato un componente derivandolo da un TDBGrid. Ecco il codice
// ******************************************************
unit Enti_coinvolgibili;
interface
uses
  Dialogs, SysUtils, Classes, Controls, Grids, DBGrids;
type
  TSUAPecDBGrid = class(TDBGrid)
  private
    { Private declarations }
    DoppioClick: TNotifyEvent;
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
    procedure CreateWnd; override;
    procedure MioOnDblClick(Sender : TOBject);
  published
    property Top;
    property Left;
    property Width;
    property Height;
    property Visible;
    property DataSource;
    property onDblClick : TNotifyEvent Read DoppioClick Write DoppioClick;
  end;
procedure Register;
implementation
uses Funzioni;
constructor TSUAPecDBGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;
procedure TSUAPecDBGrid.CreateWnd;
begin
  inherited CreateWnd;
end;
procedure Register;
begin
  RegisterComponents('Ec', [TSUAPecDBGrid]);
end;
Procedure TSUAPecDBGrid.MioOnDblClick(Sender : TOBject);
begin
  If Assigned(DoppioClick) Then
  begin
    DoppioClick(Self);   // In questo caso il referente della procedura è il
DBGrid
    ShowMessage('ciao');
  end;
end;
end.
// ******************************************************
Dopo di che creo a runtime il tale componente in una form con questa
procedura
// ******************************************************
procedure Tframe_Enti_coinvolti.CreaDBGrid(top_pos: integer);
var dbgEnti_coinvolgibili: TSUAPecDBGrid;
begin
  with TLabel.Create(self.sboxEnti_coinvolti) do
  begin
    Parent   := self.sboxEnti_coinvolti;
    Caption := 'Coinvolgi altri enti:';
    Left := 5;
    Top := top_pos;
    Visible := true;
    Font.Height := 13;
    Font.Style := [fsBold];
  end;
  top_pos := top_pos + 25;
  dbgEnti_coinvolgibili := TSUAPecDBGrid.Create(self.sboxEnti_coinvolti);
  with dbgEnti_coinvolgibili do
  begin
    Parent   := self.sboxEnti_coinvolti;
    Visible  := true;
    Name     := 'dbgEnti_coinvolgibili';
    Top      := top_pos;
    Left     := 5;
    Width    := 643;
    Height   := 170;
    Options  := Options + [dgRowSelect];
    Cursor   := crHandPoint;
    DataSource := self.dsEnti_specifici;
    with TColumnTitle.Create(Columns.Items[0]) do
    begin
      Caption := 'codice ente';
      Font.Style := [fsBold];
      Width := 70;
    end;
    with TColumnTitle.Create(Columns.Items[1]) do
    begin
      Caption := 'ente specifico';
      Font.Style := [fsBold];
      Width := 573;
    end;
    dbgEnti_coinvolgibili.onDblClick := MioOnDblClick;
  end;
end;
// ******************************************************
Il problema è che l'evento onDblClick non viene attivato e, quindi, non
funziona!
Cosa c'è di sbagliato?
Grazie
Luca

L'evento DBLClick è già dichiarato In TDBGrid (lo deriva da TControl) 
quindi il tuo non sarà mai chiamato.
Dovresti rendere invisibile l'evento dell'antenato in maniera da non 
visualizzarlo a design time:
Private
   OnDBLClick;
dopo di chè, sul create, redirezionare il tuo evento:
begin
   inherited Create(AOwner);
   OnDblClick := MioOnDBLClick;
end;
Oppure devi intercettare uno di questi tre messaggi:
WM_LBUTTONDBLCLK     // Doppio click Bottone sinistro
WM_RBUTTONDBLCLK     // Doppio click Bottone destro
WM_MBUTTONDBLCLK     // Doppio click Bottone centrale
per esempio:
private
     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message 
WM_LBUTTONDBLCLK;
procedure TSUAPecDBGrid.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
   MioOnDBLClick;
   Message.result := 1;
end;
Ciao,
David

 end;
quando scrivo questo codice, mi vengono segnati come errore TWMLButtonDblClk
e WM_LBUTTONDBLCLK.
Oltre a Controls nella sezione uses devo includere qualche libreria
particolare?
grazie.
Luca


Come non detto; ho risolto il problema. Ho aggiunto alla sezione uses la
libreria Messages ed ho riscritto la procedura in questo modo:
procedure TSUAPecDBGrid.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
    MioOnDBLClick(self as TObject);
    Message.result := 1;
end;
adesso sembra funzionare perfettamente!
Grazie mille
Luca

Luca
	Ciao
	MassimoB
 
---------------------------------
http://www.massimobeschi.it/
---------------------------------
Se tu pagare come dici tu ...
Io lavorare come dico io ...
Se tu pagare come dico io ...
Io lavorare come dici tu ...
---------------------------------

 classe ereditata da TObject. ;)
Hai perfettamente ragione!!
grazie
Luca

grazie


 risponda alle tue necessità
Soluzione decisamente più elegante e pratica. Funziona alla grande.
Adesso però ho un altro problemino. Se al posto di ShowMessage('ciao') ci
metto qualcosa del tipo
procedure TMiaDbGrid.DblClick;
var query_coinvolgi_ente: string;
    qryCoinvolgi_ente: TSQLQuery;
begin
    query_coinvolgi_ente := 'INSERT INTO tab_prova (ID, Campo_prova) VALUES
(NULL, '''' +
self.DataSource.DataSet.FieldByName('campo_da_dblclick).AsString + ''')';
    qryCoinvolgi_ente := TSQLQuery.Create(self);
    with qryCoinvolgi_ente do
    begin
      SQLConnection := frmPrincipale.connessioneMySQL;
      Active := false;
      SQL.Text := query_coinvolgi_ente;
      ExecSQL();
      Active := true;
    end;
    qryCoinvolgi_ente.Destroy;
    Parent.Repaint;
end;
una volta che faccio il doppio click sulla dbgrid, la query di inserimento
viene eseguita due volte (ovvero nella tabella tab_prova vengono inseriti
due record uguali) e poi mi ritorna l'errore
Cursor not returned from Query
Cosa sbaglio questa volta?
grazie mille
Luca

grazie mille


 tanto che è un componente "usa e getta" ;).
Ho utilizzato la connessione dalla form frmPrincipale perche pensavo che in
questo modo occupasse meno risorse. In pratica in questa applicazione MDI
tutte le form figlie usano la connessione MySQL impostata nella MainForm
frmPrincipale. In particolare questa query è fine a se stessa e server per
inserire nella tabella tab_prova il record della DBGrid sul quale si è fatto
doppio click.
Il mio unico dubbio, a questo punto, è legato all'ultima riga del codice:
Parent.Repaint:
Infatti non fa quello che pensavo. L'intenzione era quella di ridisegnare la
form nella quale è inserito il componente TMiaDbGrid perchè nella parte alta
di tale form compare un'elenco di GroupBox con tutti i record della tabella
tab_prova. In pratica, cliccando su TMiaDbGrid aggiungo un record che,
subito dopo deve essere visualizzato nell'elenco soprastante; tale elenco
viene creato a runtime usando dei componenti derivati da TGroupBox.
Grazie mille
Luca