Il linguaggio di programmazione Delphi
 

TField.FocusControl ed errore "Cannot focus a disabled or invisible window"

Luigi Siciliano 3 Mar 2017 13:11
nel codice eseguo: Field.FocusControl ma, in alcuni casi mi esce
l'errore in oggetto. So che l'errore è legato al fatto che da codice il
DBEdit che contiene il Field viene posto a Enabled := False oppure a
Visible := False.

Poiché per il flusso del programma non è un problema, come posso evitare
che mi esca l'errore?

TField non mi sembra abbia una property o funzione per sapere se c'è un
controllo che lo contiene per poterlo interrogare se può ottenere il
focus e comportarsi di conseguenza, infatti lo pseudo codice seguente
non può essere invocato:

if "Field.Control.CanFocus" then
Field.FocusControl

C'è un modo per risolvere?

Grazie.
Alberto Salvati 3 Mar 2017 13:21
> nel codice eseguo: Field.FocusControl

perche?

> Poiché per il flusso del programma non è un problema, come posso evitare
> che mi esca l'errore?


try..except?

A.
Luigi Siciliano 3 Mar 2017 15:06
Il 03/03/2017 13.21, Alberto Salvati ha scritto:
>> nel codice eseguo: Field.FocusControl
>
> perche?
>

In realtà utilizzo un componente "TdbTable" che nell'evento OnNewRecord
richiama Fields[0].FocusControl, solo che in alcuni casi il TDBEdit che
punta al field è Disattivo o invisibile.
Volendo modificare il componente per evitarlo mi ero posto il problema
di un modo elegante per risolverlo o aggirarlo.

>
> try..except?
>
> A.
>
Potrebbe essere una soluzione ma l'eccezione EInvalidOperation è
abbastanza generica e potrebbe essere sollevata per altro e
nascondendola poi non avrei certezza di quello che succede.

Grazie.

Ciao.
Alberto Salvati 3 Mar 2017 15:20
> In realtà utilizzo un componente "TdbTable"

Non lo conosco...


> che nell'evento OnNewRecord
> richiama Fields[0].FocusControl,

Non ho capito..
La riga sopra l'ahi scritta TU nell'evento OnNewRecord o la chiama internamente
il componente stesso?

A prescindere da CHI lo fa, dare per scontato che un oggetto possa avere il
focus è una *****ata...


A.
Luigi Siciliano 3 Mar 2017 15:28
Il 03/03/2017 15.20, Alberto Salvati ha scritto:
> La riga sopra l'ahi scritta TU nell'evento OnNewRecord o la chiama
internamente il componente stesso?

la chiama il componente stesso.

>
> A prescindere da CHI lo fa, dare per scontato che un oggetto possa avere il
focus è una *****ata...
>
sono d'accordo.

Ho utilizzato il metodo del Try ... except in questo modo:

procedure TdbTable.DoOnNewRecord;
const
Msg = 'Cannot focus a disabled or invisible window';
begin
try
Fields[0].FocusControl;
except
on E:Exception do
if (E.Message <> Msg) then
Raise;
end;
end;

così, credo che se l'eccezione sollevata è diversa dovrebbe sempre
essere sollevata, giusto?

Grazie.
Alberto Salvati 3 Mar 2017 15:32
..io toglierei la riga...

A.
Luigi Siciliano 3 Mar 2017 15:43
Il 03/03/2017 15.32, Alberto Salvati ha scritto:
> ..io toglierei la riga...
>
> A.
>
Il componente è già utilizzato in molte altre parti del programma che
dovrebbero poi essere modificate.

Grazie.
Alberto Salvati 3 Mar 2017 15:50
> Il componente è già utilizzato in molte altre parti del programma che
> dovrebbero poi essere modificate.

Aggiungi una property boolean, che di default è true.
Nel caso che ti rompe le balle la metti a false.
Infine, nel metodo NewRecord del componente fai un if sul valore di questa
property: se è true vai di focus altrimenti no.


A.
4ndre4 3 Mar 2017 16:49
On Friday, 3 March 2017 12:11:28 UTC, Luigi Siciliano wrote:

> Poiché per il flusso del programma non è un problema, come posso evitare
> che mi esca l'errore?

L'errore viene fuori, giustamente, perche` stai cercando di dare il focus ad un
controllo disabilitato o invisibile. La soluzione e` non farlo.

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.