Forum > LCL

[RISOLTO] TForms: Problemi con Alt + Tab

(1/6) > >>

CortelliStefano:
Un saluto a tutto il forum. Volevo chiedervi se qualcuno di voi ha modo di verificare la presenza di problemi utilizzando Alt + Tab per passare da una form all'altra dello stesso programma scritto con Lazarus.

In pratica, passando da una form all'altra con Alt+Tab e ritornando poi sempre con Alt+Tab alla form originaria noto che:
-Se il focus era su un DbEdit, le modifiche apportate sul campo vengono perse;
-Le DbGrid presentano problemi (le celle non sono più bordate di rosso e presentano problemi al momento dell'inserimento, ogni carattere inserito si mangia l'altro, così che risulta problematico inserire testo nelle celle).

Questo almeno con Linux con le GTK2.

Se invece mi sposto tra le forms usando il mouse e la TaskBar tutto funziona perfettamente.

Anche se mi sposto con Alt+Tab tra applicazioni diverse (non tra le form di uno stesso programma) non ci sono problemi.

Inizialmente avevo "attribuito" il problema alla DbGrid, ma invece credo che dipenda da TForms, perché sembra proprio che l'Alt+Tab inneschi qualcosa che poi crea i problemi descritti.

Anche mettendo ShowInTaskBar = stNever, la semplice pressione di Alt+Tab, che in questo caso porta sulla MainForm, è sufficiente a generare il problema.

Il problema è per quanto mi riguarda molto grave e mi costringe a rimanere ancora alla versione 0.9.28.2 di Lazarus che funziona egregiamente.

Tutte le versioni successive presentano questo problema, troppo grave per applicazioni complesse che richiedono continuamente di spostarsi da una form all'altra: la 0.9.30, la 0.9.30.2, la 0.9.30.4 ed anche la nuovissima 1.0 presentano tutte il fastidioso problema.

Ho anche segnalato il problema sul bugtracker ufficiale, ma senza ricevere ancora alcun riscontro:
http://bugs.freepascal.org/view.php?id=22475

Se qualcuno avesse modo di verificare il problema, o magari qualche consiglio per poterlo in qualche modo bypassare... ne sarei estremamente grato.

Trovo penalizzante dovere rimanere su una versione di Lazarus vecchia ormai di tre anni... oppure di utilizzare versioni diversa a seconda del Widget/S.O. su cui devo compilare.

Qualcun altro si è imbattuto nello stesso problema?

Grazie infinite per qualsiasi consiglio.

Buona serata a tutti,

Stefano

nomorelogic:
ciao, ora non riesco a fare delle prove ma potresti provare con l'evento OnDeactivate della form.
Ad esempio, nel caso del DbEdit, potresti spostare il focus ad un altro controllo e poi ripristinarlo nel DbEdit.
So che è una pezza ma intanto potrebbe dare qualche risposta.

ciao

CortelliStefano:
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:


--- Codice: ---
if (MyDataSet.State in [dsEdit, dsInsert]) then MyDataSet.Post;
--- Termina codice ---

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

nomorelogic:
ciao Stefano,
dalla descrizine che fai è come se i controlli non avessero coscienza che l'input da parte dell'utente sia terminato. E' per questo che un post sistema: forza ai datacontrols il termine della fase di input.

Volendo utilizzare la soluzione del post, potresti implementare un metodo "PostAllTables" direttamente nel datamodule.
In questo modo se si rendono necessari post su più tabelle con un'unica chiamata a DataModule.PostAllTables hai sistemato tutte le tabelle necessarie e, di riflesso, tutti i datacontrol collegati.

Potrebbe anche essere una soluzione al problema della grid; non sono però sicuro che, quando l'utente tornerà alla finestra, si troverà davanti a quello che si aspetta (magari il cursore s'è spostato o no si è più sulla stessa colonna e poi, è possibile impostare a true  l'autoedit?).

Secondo me se il cambio focus funziona, soprattutto per le griglie, si tratta di un intervento preferibile in quanto meno invasivo.
Potresi anche provare ad abbinare il cambio focus con un Invalidate, al rientro (OnActivate), del controllo con il focus.

Se dovesse funzionare, questo potrebbe essere un comportamento da codificare in un form da cui tutte le form del progetto ereditano al posto di TForm.

Edit:
facci sapere come risolvi che la cosa sarà utile a molti :)
ciao
nomorelogic

CortelliStefano:
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):


--- Codice: ---
  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;

--- Termina codice ---

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

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa