Newsgroup: it.comp.lang.delphi
Titolo: visualizzare form durante un post

Salve,
Uso delphi 2007,
Ho questo problema e proprio non so come risolverlo , ora mi spiego,
nel mio programma eseguo dei post in un db di file di circa 1 mb
mediante il campo longblob, durante questo post vorrei far apparire
una piccola form con un label con scritto un messaggio, io attualmente
lo faccio in questo modo:
:
:
Form1.label1.caption := ' caricamento';
Form1.show;
// procedura per il caricamento
Form1.hide;
:
:
Ovviamente era un esempio molto grezzo, comunque il mio problema e'
che la form si visualizza e si nasconde come e quando gli comando ma
non mi fa venire fuori il contenuto perche rimane come frizzata appena
passa a fare il post il db.
Spero di essere stato abbastanza chiaro.
Ah se può essere utile mi collego a un db mysql usando il componenze
Zeos.
Grazie
Luigi

 una piccola form con un label con scritto un messaggio,
non è chiarissimo: il form non renderizza tutti i ctrl prima di
freezzarsi? Non viene fuori?
Ad ogni modo hai provato con gli eventi before e afterpost?
<code>
procedure TmyADO.MytableBeforePost(DataSet: TDataSet);
begin
  form1.show;
  form1.repaint;
end;
procedure TmyADO.MytableAfterPost(DataSet: TDataSet);
begin
  form1.hide;
end;
però la tua form, una volta mostrata rimane comunque freezed durante
l'operazione. Questo perché l'app. è single thread. Altra cosa che
puoi fare è lanciare un thread che esegua il post lungo e usare un
form di avanzamento (progress bar).
Gp

 form di avanzamento (progress bar).
Sinceramente non ho capito il tuo suggerimento, io uso un componente
della TMS ( AdvCircularProgress non so se lo conosci ) che fa
l'animazione del caricamento tipo una progress bar ma circolare e'
questo che intendevi?
Grazie ancora
Luigi

  ( ovviamente perche uso form1.hide dopo il post )
application.processmessages dentro lo show della form splah.
oppure, ti crei un custom thread che visualizza una finestra e lo tieni 
acceso/spento a tuo piacimento tramite messaggi esterni.
Ciao
-- 
Morde


<considerazione ON>
Avevo pensato anche io ad un Application.processmessages, ma poi ho 
riletto il post principale
[
Form1.label1.caption := ' caricamento';
Form1.show;
// procedura per il caricamento
Form1.hide;
]
mi immagino proprio i casini che potrebbe provocare un bell 
Application.processmessages qui in mezzo, a meno di far diventare la 
form1 modale, allora forse ci salva in corner ...
Ma anche senza A.P non mi sembra il caso di mostrare una form NON MODALE 
per fare operazioni "Atomiche"
<considerazione OFF>
mi sbaglio ???
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

 mi sbaglio ???
L'OP parlava di una scrittura sul db, quindi se vuole far attendere 
l'utente l'idea di mostrare una finestra modale che dica che e' in 
corso un'operazione non e' cosï¿œ sbagliata.
Modellizzando e ragionando ad oggetti, io immagino che la form di 
attesa sia una classe che riceve messaggi direttamente da chi la vuole 
pilotare. Andando oltre, si puï¿œ usare il pattern observer, facendo 
implementare questo comportamento alla finstrea di attesa che si 
registra alla classe manager reponsabile delle operazioni sul db.
Ci sono molte soluzioni come vedi, io nel thread ho fornito quella che 
ritengo essere la piï¿œ veloce: quando una gui freeza durante 
un'operazione che blocca il main thread, di solito le gui (la VCL non ï¿œ 
thread safe purtroppo) si refreshano con un bel processmessages e tutto 
va a posto. La scrittura sul db blocca il main thread nell'aggiornare 
la vcl. L'OP potrebbe trovare anche una soluzione maggiormente 
flessibile prendendo gli esempi eccellenti di delphi about in tema di 
refresh di gui in contesti multithreading: 
http://delphi.about.com/od/kbthread/a/thread-gui.htm
-- 
Morde

 va a posto.
Come detto nel mio post precedente è stato il mio primo pensiero, ma poi 
ho divagato un pochino ;P


 finestra non modale.
Si hai ragione, mi sono sbagliato ho proprio frainteso. :-)
Il discorso verteva su una .show piuttosto che un showmodal.
Quello ceh non mi ï¿œ chiaro ï¿œ perchï¿œ ritieni pericoloso utilizzare un 
precessmessages all'interno del blocco da te citato.. puoi spiegare 
meglio che pericoli ci sono?
Ciao
-- 
Morde


Allora, polpettone mentale in a(r)rivo ;)
Abbiamo questo scenario, un programma che per caricare, salvare, e 
compiere operazioni varie ha bisogno di "un po' di tempo", si hanno 2 
soluzioni:
1) Blocco clessidra(ON/OFF)
2) Aprire una finestrella che scandisce il tempo passato.
Dato che vogliamo abbelire il nostro programmino scegliamo la seconda 
strada una finestra con una "*bar".
Bene .. Apro la mia finestra in .Show con A.P. e mentre la mia 
Prograssbar cammina ... faccio un bel click nella X della finestra e la 
chiudo cosa succede ???
Bene ... Apro la mia finestra in .Show con A.P. e mentre la mia 
Prograssbar cammina ... faccio un bel click nel bel mezzo della mia form 
principale .... cosa succede ???
Ovviamente tutto questo si potrebbe evitare, molto facilmente, ma con un 
approccio diverso, anche lasciando A.P, che potrebbe essere una delle 
soluzioni descritte nei post precedenti, oppure l'uso di una form 
modale, controllata nell'evento di chiusura.
^_Goblin_^
PS: Ho la tastiera che mi ignora la lettera "r" .. mi scuso per 
eventuali errori

 modale, controllata nell'evento di chiusura.
Scusa la mia ignoranza, ma per uso della finestra modale indenti
" .showmodal " giusto?
Ma con questo tipo di visualizzazione poi non mi resta in attesa
finchè non la chiudo ? come faccio a far andare avanti e poi
chiuderla ?
Es:
:
:
Form1.label1.caption := ' caricamento';
Form1.showmodal   ------------> se non erro aspetta finche non chiudo
l'avviso giusto?
// procedura per il caricamento
Form1.hide;  ---------> io invece vorrei chiuderla qui dopo il
caricamento del file.
:
:
Immagino che la mia domanda sia stupida ma sono ancora all'inizio stò
imparando :)
Grazie ancora.


Se ho capito bene il tuo problema, qui:
 
http://www.delphi3000.com/articles/article_977.asp?SK=
dovresti trovare la soluzione che ti serve.
In alternativa potresti attivare un form non modale e disattivare il form 
principale e riattivarlo al termine della tua elaborazione con 
rispettivamente form1.enable := false e form1.enable := true;
Fammi sapere se hai risolto.
Ciao a presto.
-- 
http://www.blueware.it
bluewarewebstudio (skype) 

 modale, controllata nell'evento di chiusura.
Scusa la mia ignoranza ma per form modale intendi un " .shomodal"
giusto?
Perche da quello che fin'ora ho imparato se faccio una cosa del genere
rimando in attesa finche la form non viene chiusa o sbaglio?
Es:
:
:
Form1.label1.caption := ' caricamento';
Form1.showmodal;  -----> equi faccio comparire la form con il
caricamento che però blocca tutto finche non la chiudo ??????
// procedura per il caricamento
Form1.hide;  ---- > qui vorrei far chidere la form al termine del
caricamento ...
:
:
Sicuramente io ho capito male o non so come fare, scusate ancora se
sbaglio ma sono ancora all'inizio ma mi piace imparare :)
Grazie ancora della pazienza .


In poche righe....togli la form dall'autocreate, in modo da gestire il 
create e il destroy
with TForm2.create(self) do
try
   label1.caption := ' caricamento';
   ShowModal;
finally
   free
end;
dentro Form2 gestisci il mex aftershow e richiami la tua procedura per 
il caricamento, finito il caricamento fai un close della form
ovviamente devi controllare la variabile lLocalClose per eventuali errori.
const
WM_AFTERSHOW = WM_USER + $55;
type
   TForm2 = class(TForm)
     Label1: TLabel;
     ProgressBar1: TProgressBar;
     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
     procedure FormCreate(Sender: TObject);
     procedure FormShow(Sender: TObject);
   private
     { Private declarations }
     lLocalClose: Boolean;
     procedure WMAFtershow(var msg : TMessage); message WM_AFTERSHOW;
     procedure CaricoDati;
   public
     { Public declarations }
   end;
implementation
{$R *.dfm}
procedure TForm2.CaricoDati;
Var x,y: Integer;
begin
   for x:=1 to 100 do
     for y:=1 to 10 do
     begin
       application.ProcessMessages;
       Sleep(1);
       ProgressBar1.Position := x;
     end;
     lLocalClose:=True;
   close;
end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   CanClose := lLocalClose;
end;
procedure TForm2.FormShow(Sender: TObject);
begin
   PostMessage(self.Handle, WM_AFTERSHOW, 0, 0);
end;
procedure TForm2.WMAFtershow(var msg: TMessage);
begin
   CaricoDati;
end;
end.
Ovviamente è solo uno spunto da cui partire, scritto "al volo"
^_Goblin_^