PDA

Visualizza la versione completa : [delphi]lentezza aggiornamento schermate


vicky
27-01-2012, 18:27
:ciauz:
A seconda del computer in cui visualizzo l'applicazione si verifica che nel passaggio da una form all'altra (tramite form2.show;form1.hide) compare per un istante il desktop del PC cioè quello che c'è dietro la finestra dell'applicazione. Non ne capisco il motivo, al limite dovrebbe vedersi il form 1 per un secondo in più visto che Delphi lo nasconde dopo che ha mostrato il form2.
Forse c'è qualcosa che non capisco. In effetti io utilizzo il metodo "show" ma forse dovrei prima creare il form che poi mostrerò e quindi scrivere:


form2.create;
form2.show;
form1.hide

c'è qualche altra cosa che devo fare per evitare questo problema?

alka
27-01-2012, 19:03
Prova a indicare un codice più completo (non esemplificativo) per vedere come viene visualizzata la finestra secondaria, in quale evento e in che contesto.

vicky
27-01-2012, 19:20
ok.
L'applicazione è formata da vari form che vengono mostrati solo uno alla volta tramite evento onclick su pulsanti o su label.
Nel'application main form ho inserito i componenti per l'accesso al database. I form successivi contengono testo o griglie per mostrare il contenuto del database.
Questo scrivo nell'evento onclick dei form:


form2.show;
form1.hide;

Il form contiene codice sia nell'evento oncreate che nell'evento onshow anche se non ho capito bene la differenza tra i due, solo che certe cose ho visto che funzionano solo se le metto nell'evento onshow.
Cos'altro devo dire?

alka
27-01-2012, 20:04
Originariamente inviato da vicky
Il form contiene codice sia nell'evento oncreate che nell'evento onshow anche se non ho capito bene la differenza tra i due, solo che certe cose ho visto che funzionano solo se le metto nell'evento onshow.


L'evento OnCreate viene eseguito quando la finestra viene creata: è possibile creare tante volte una finestra quante sono le effettive finestre che voglio vedere a video.

Ad esempio, mi pare di capire che ogni finestra della tua applicazione sia unica e che venga creata una sola volta.

Una volta creata, la finestra può essere nascosta e visualizzata quante volte si vuole, e ogni volta che la finestra viene mostrata entra in azione l'evento OnShow.

E' chiaro che se quest'ultimo evento contiene operazioni pesanti, la finestra impiegherà del tempo a mostrarsi; qualsiasi operazione che inizializza la finestra va fatta solo una volta.

Ho il sospetto che l'architettura dell'applicazione sia abbastanza intricata... :stordita:

vicky
27-01-2012, 20:26
Quindi poiché nelle impostazioni del mio progetto è previsto un main form e 7 form che si auto-creano (tra questi c'è anche il main form) vuol dire che poi non devo più utilizzare l'evento oncreate dei form secondari ma solo l'evento onshow perché i form sono già tutti creati quando parte l'applicazione e quindi quelle istruzioni non possono essere più eseguite?
In effetti anche se io vedo che il codice messo nell'oncreate del form secondario viene eseguito, forse questo può essere l' errore che mi causa i problemi di visualizzazione?

vicky
28-01-2012, 17:49
Anche se ho eliminato tutti gli eventi oncreate dei vari form secondari la situazione non è cambiata. Riporto il codice che richiama dal form Sommario (che contiene varie label) una pagina di testo:


procedure TformSommario.lblIntroduzioneClick(Sender: TObject);
begin
HTMLPath:=ExtractFilePath(Application.ExeName) + 'HTML\introduzione.htm';
formTesto.webbrwser.Navigate(HTMLPath);
formTesto.show;
formSommario.Hide;
end;

Il formTesto è molto semplice perché contiene solo una webbrowser. Non mi sembra che ci siano operazioni "pesanti" da svolgere.
Quello che avviene a video è che per 1-2 secondi nel passaggio da un form all'altro si vede lo sfondo azzurro del desktop con il logo di window. (preciso che il computer è quello che uso normalmente per le elaborazioni grafiche quindi è potente, veloce e con molta RAM). L'unica cosa che mi lascia in dubbio è che il sistema operativo è Window 7, sul mio portatile che ha Win XP il problema, infatti, non si verifica. :(

alka
30-01-2012, 12:27
Originariamente inviato da vicky
Quindi poiché nelle impostazioni del mio progetto è previsto un main form e 7 form che si auto-creano (tra questi c'è anche il main form) vuol dire che poi non devo più utilizzare l'evento oncreate dei form secondari ma solo l'evento onshow perché i form sono già tutti creati quando parte l'applicazione e quindi quelle istruzioni non possono essere più eseguite?


Il Form deve essere "creato" in quanto oggetto per poter essere utilizzato, all'avvio dell'applicazione o quando serve.

Se il Form che viene visualizzato o nascosto non deve essere "reinizializzato" in qualche modo, ma è sufficiente che venga reso visibile o invisibile mantenendo il suo stato, tale stato va inizializzato al momento della creazione con OnCreate.

Il fatto che il Form sia visibile o meno è solamente una informazione sullo stato dell'oggetto, che non ha nulla di diverso rispetto all'essere blu o verde, per intenderci.

L'evento OnShow va definito se, ogni volta che il Form viene mostrato, è necessario che le informazioni al suo interno siano in qualche modo aggiornate rispetto all'ultima volta in cui era visibile; è chiaro però che, eseguendo istruzioni nel contesto dell'OnShow, la finestra impiega più tempo a visualizzarsi.



Originariamente inviato da vicky
Anche se ho eliminato tutti gli eventi oncreate dei vari form secondari la situazione non è cambiata.

Infatti non c'era nessun problema nell'evento OnCreate, così come ce n'è uno nell'OnShow.

Riepilogo: se le informazioni che sono nella finestra non cambiano quando questa viene nascosta con Hide e poi mostrata di nuovo con Show, la sua inizializzazione deve essere effettuata una sola volta, nell'evento OnCreate. Se invece ogni volta che la finestra deve essere mostrata va aggiornata, quella logica va nell'evento OnShow, pena un certo ritardo nella visualizzazione se quel codice richiede tempo per essere eseguito.

vicky
30-01-2012, 13:04
Effettivamente la finestra che viene mostrata contiene un controllo webbrowser il cui contenuto viene stabilito tramite un link presente nella finestra precedente. Quindi nell'evento onshow della finestra secondaria non è presente il codice che ne permette l'aggiornamento. Non so come potrei fare altrimenti. La mia finestra principale non è altro che una serie di link (parlando come se fosse una pagina html) che portano verso pagine con contenuti diversi.

vicky
30-01-2012, 18:40
Mi viene in mente una cosa: il problema della lentezza nell'aggiornamento della pagina potrebbe derivare dal fatto che vedo la mia applicazione in un PC win 7 a 64bit? Dopotutto la versione di Delphi che uso e le librerie di componenti sono a 32 bit.

alka
30-01-2012, 18:51
Originariamente inviato da vicky
Mi viene in mente una cosa: il problema della lentezza nell'aggiornamento della pagina potrebbe derivare dal fatto che vedo la mia applicazione in un PC win 7 a 64bit? Dopotutto la versione di Delphi che uso e le librerie di componenti sono a 32 bit.

Ma questo "problema di lentezza" come si verifica esattamente?

E' il Form che impiega tempo ad apparire, o è la pagina mostrata nel WebBrowser a caricarsi lentamente?

Loading