PDA

Visualizza la versione completa : [Delphi] Errore causato da SETFOCUS


Lyll0
28-08-2003, 13:56
ciao gente,

ho un problema alquanto fastidioso.

un pulsaante genera un frame che contiene una lista.
ad ogni click si reitera il discorso.

siccome voglio che la lista venga mostrata da subito con i contenuti in vista (cioè, appena viene generata deve mostrare i valori, non deve essere dunque l'utente a cliccare sopra di essa per attivare il contenuto) uso la proprietà SETFOCUS...

il fatto è che questo codice:


with TFRAME.Create(contenitore) do
begin
parent:=contenitore;
left:=sn;
top:=115;
Inc(sn,250);
name:=frame+IntToStr(nframe);
Inc(nframe);
setfocus; // <-- !!!
end;

provoca un errore in fase di creazione:
infatti:
genero il primo frame e la tabella viene visualizzata con i contenuti,
quando vado a generare il frame successivo viene creato MOLTO più in BASSO, NON rispettando l'impostazione TOP!!!! :dhò:
e così via...

come mai?
che posso fare?

alka
28-08-2003, 14:36
La frase "provoca un errore" sta ad indicare che il comportamento del codice non è quello che ti aspetti o che viene proprio generata un'eccezione quando tenti di richiamare il metodo SetFocus.

Se il caso è quest'ultimo, quale tipo di errore viene generato?
Percaso è "Cannot focus a disabled or invisible window" o qualcosa del genere?

Occorre dire che creazione e visualizzazione sono due operazioni distinte. Quando crei il frame, allochi nella pratica tutte le strutture dati che servono per mantenerne in memoria i dati: queste sono strutture Delphi, a cui segue l'allocazione delle strutture Windows, cioè quelle strutture che appartengono invece al sistema operativo per poter gestire il controllo visuale, inviare ad esso dei messaggi in corrispondenza del movimento del mouse e della pressione di tasti.

Nel momento in cui tu fai la SetFocus, forse non sono ancora state allocate le strutture dati Windows per il controllo visuale su cui si sta cercando di impostare il focus.

Controlla che non vi sia una ulteriore chiamata a SetFocus nel codice del frame, ma solo nel codice del contenitore, richiamato quando devi creare un nuovo frame (in pratica, il codice che hai inviato).

Ciao! :ciauz:

alka
28-08-2003, 14:37
Dimenticavo... spero che il codice che hai postato sia stato copiato e incollato da Delphi...e non ricopiato. Confermi?

Lyll0
28-08-2003, 15:13
l'errore è in fase di visualizzazione!

sia cche usi SETFOCUS sia che semplicemente dia il focus ad un frame già generato (senza usare SetFocus nel codice), quando vado a generare un nuovo frame questo risulta traslato in basso invece di essere sulla stessa linea.

cioè:
genero un frame.
lo seleziono, ci clicco sopra, insomma...
genero un altro framme e questo è più in basso dell'altro come se non avesse rispettato la proprietà TOP.

oppure
genero un frame
viene selezionato automaticamente con la proprietà SetFocus,
genero un altro framme e questo è più in basso dell'altro come se non avesse rispettato la proprietà TOP.

capit'?

e si, il codice è copiato da delphi... è quello mio...

alka
28-08-2003, 15:18
Originariamente inviato da Lyll0
genero un frame
viene selezionato automaticamente con la proprietà SetFocus,
genero un altro framme e questo è più in basso dell'altro come se non avesse rispettato la proprietà TOP.

Quindi tutti i frame hanno lo stesso Top (che imposti fisso a 115), mentre Left è variabile...però in realtà ti ritrovi con frame che hanno un valore di Top diverso da 115?

Hai degli allineamenti impostati o qualcosa che può far "traslare" le coordinate? Sei sicuro di non assegnare nuovamente la proprietà Top?

Lyll0
28-08-2003, 17:09
no!
Top rimane quella sempre!!! :dhò:

alka
28-08-2003, 17:24
Nel codice non noto errori, quindi il problema è sicuramente da un'altra parte.

Lyll0
02-09-2003, 17:01
non lo so.
ho risolto in un altro modo...

certo è che rimane alquanto fastidioso dover cliccare su ogni componente per far si che questo visualizzi il prorpio contenuto! :dhò:

alka
02-09-2003, 17:20
Originariamente inviato da Lyll0
certo è che rimane alquanto fastidioso dover cliccare su ogni componente per far si che questo visualizzi il prorpio contenuto!
Questo è un tuo problema di programmazione e organizzazione.

Un controllo visuale, ad esempio una ListBox, visualizza il contenuto quando la proprietà Items che contiene gli elementi da mostrare viene inizializzata. Se la inizializzi quando il controllo riceve il focus, allora il contenuto lo vedrai solo cliccando all'interno del controllo, ma il problema è dovuto solo ad un errore tuo nel posizionare il codice di inizializzazione, non riguarda il codice o il funzionamento del controllo visuale stesso.

Lyll0
03-09-2003, 11:47
e allora dove dovrei metterlo secondo te?
qui non si parla di un controllo già presente il quale può essere inizializzato anche sul click del pulsante che lo visualizza,

io avevo messo setfocus al controllo appena veniva creato, che rappresenta l'unica via possibile, ma quella scelta causava lo sfasamento dei controlli generati in sequenza...

a questo punto, tu che mi consiglieresti?

io sono ad un punto mortissimo! :dhò:

grazie e :ciauz:

Loading