Ciao e prima di tutto grazie per la risposta.
Per quello che riguarda il DbEdit la tua soluzione è sicuramente valida, magari anziché spostare il focus bastarebbe fare un post:
if (MyDataSet.State in [dsEdit, dsInsert]) then MyDataSet.Post;
Con una piccola implementazione su tutti i moduli il problema del DbEdit verrebbe bypassato in maniera eccellente.
Il problema più grave si verifica tuttavia con la DbGrid, e qui non riesco proprio a venirne a capo, perché il problema si verifica anche se al momento dell'Alt+Tab l'utente non è sulla griglia (ovviamente si rende conto del problema quando prova a digitare qualcosa sulla griglia).
Hai qualche idea per riuscire in qualche modo a bypassare il problema con la DbGrid?
Ancora grazie e buona giornata,
Stefano
Grazie ancora della risposta. Il problema è che con la DbGrid né il Focus né il Post risolvono il problema.
Addirittura con la DbGrid il problema si verifica anche se l'utente non è sulla griglia al momento dell'Alt+Tab (ed il focus è quindi su un altro campo), appena l'utente va sulla griglia il problema purtroppo si presenta e finora non sono ancora riuscito in nessun modo a trovare un modo per bypassarlo.
La cosa strana è che con la 1.0 (e qui mi sembra esserci forse una differenza rispetto alla 0.9.30.X) quando si ritorna sulla form con Alt+Tab la prima cella su cui ci si posiziona sembrerebbe funzionare correttamente, poi all'uscita della cella la griglia perde il bordo rosso ed il problema si presenta fintanto che non mi sposto con il mouse sulla TaskBar e cambio ancora form e ritorno sempre con la TaskBar, allora la griglia sembra ritornare a funzionare.
Quando si verifica il problema, anche cliccando con il mouse sulla cella, questa non prende il bordo rosso.
Ho fatto una serie di tentativi, soprattutto sull'evento Activate, senza successo.
Lo stesso codice che utilizzo per selezionare una finestra (e che funziona correttamente):
Application.ProcessMessages;
with Sender as TMenuItem do begin
if (Screen.FormCount < 1) then exit;
for k := (Screen.FormCount - 1) downto 0 do begin
if Trim(Screen.Forms[k].Caption) = Trim(Caption) then begin
try
if (MyOs <> 0) then Screen.Forms[k].Show;
Screen.Forms[k].WindowState := wsNormal;
Screen.Forms[k].SetFocus;
finally
end;
end;
end;
end;
se copiato (nelle istruzioni necessarie) nell'evento Activate (ossia se setto il WindowsState ed SetFocus sulla form nell'evento Activate), il problema rimane. È solo con l'Alt+Tab che si verifica il problema, e non al momento di lasciare la form, ma solo al momento di ritornarci (se mi sposto con la TaskBar e ritorno con Alt+Tab il problema rimane, mentre se mi sposto con Alt+Tab e torno con la TaskBar no).
Hai qualche suggerimento da tentare con la DbGrid per bypassare in qualche modo il problema?
Ancora grazie per l'aiuto.
Buona giornata a tutti,
Stefano
Dalla versione 1.0.8 di Lazarus:
TKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState) of Object;
....
procedure AddOnKeyDownBeforeHandler(Handler: TKeyEvent;AsFirst: Boolean=true);
...
procedure TApplication.NotifyKeyDownBeforeHandler(Sender: TObject;
var Key: Word; Shift: TShiftState);
var
i: Integer;
begin
i:=FApplicationHandlers[ahtKeyDownBefore].Count;
while FApplicationHandlers[ahtKeyDownBefore].NextDownIndex(i) do
TKeyEvent(FApplicationHandlers[ahtKeyDownBefore][i])(Sender,Key,Shift);
end;
procedure TApplication.NotifyKeyDownHandler(Sender: TObject;
var Key: Word; Shift: TShiftState);
var
i: Integer;
begin
i := FApplicationHandlers[ahtKeyDownAfter].Count;
while FApplicationHandlers[ahtKeyDownAfter].NextDownIndex(i) do
TKeyEvent(FApplicationHandlers[ahtKeyDownAfter][i])(Sender, Key, Shift);
if WidgetSet.IsHelpKey(Key, Shift) and
(Widgetset.GetLCLCapability(lcLMHelpSupport) = LCL_CAPABILITY_NO) then
ShowHelpForObject(Sender);
end;
Mi viene in mente di applicare un Handler di preprocess alla gestione dei tasti ... in prima battuta per mettere solo sotto controllo cosa passa effettivamente ai componenti "alti".
Per poi procedere alla comprensione su come interferire con il normale processo dei messaggi.
Stilgar