La butto lì, poi magari arriveranno proposte migliori ...
Io farei così:
- creo una variabile globale booleana "VFDoppioClick" e la inizializzo a false alla creazione del progetto
- nella OnDblClick imposto VFDoppioClick a True
- nella OnClick, aspetto 100 millisecondi (il che da' il tempo all'utente di fare eventualmente il secondo click). Poi, se VFDoppioClick=true non faccio niente, se è False, allora significa che l'utente ha fatto un solo click, quindi faccio quello che deve fare l'OnClick
- alla fine di OnClick, rimetto VFDoppioClick=false in modo che sia pronta per la volta successiva
Il problema è che scatta prima l'OnClick.
Appunto ...
1)dovresti metterti a più basso livello ...
2) Controlli cosa scatta prima ... double e single click.
Sì, dovrebbe funzionare, anche se mi scoccia scomodare un Timer per una cosa del genere.
A dire la verità, io avevo pensato ad un semplicissimo "Sleep(100);"
var DoppioClick: Boolean;
procedure TMain.SortColumn(i: Integer);
begin
[...]
end;
procedure TMain.DBGrid1TitleClick(Column: TColumn);
begin
DoppioClick := False;
Sleep(150);
Application.ProcessMessages;
if not DoppioClick then SortColumn(Column.Index)
end;
procedure TMain.DBGrid1DblClick(Sender: TObject);
begin
DoppioClick := True;
if DBGrid1.ScreenToClient(Mouse.CursorPos).Y < 18 then Exit;
[... Esegui il Doppio Click ... ]
end;