Newsgroup: it.comp.lang.delphi
Titolo: Aggiornamento di "memo"

Salve a tutti; sono un neofita di delphi e come tale il mio problema sarà
banale ma io non riesco a trovarvi una soluzione ed è per questo che chiedo
aiuto...
Ho un programma con 2 form: form1 e form2; sulla form1 ho un bottone:
button1; sulla form2 ho un memo:memo1.
Premendo button1 visualizzo form2 ed eseguo un ciclo "for" che fa aumenatare
una variabile intera "i" e scrive in memo1 una stringa. Vorrei che il
componente memo1 venisse aggiornato in tempo reale ovvero ad ogni incremento
della variabile.
Il problema è che quando clicco su button1 si apre form2 ma memo1 non mostra
cambiamenti.
Che funzione/procedura devo usare per aggiornare il componente?
Thx a coloro che mi aiuteranno.

 della variabile.
Forse un Refresh della form2 ... ma se il ciclo for è dicretamente lungo
(dai 50 in su)...
risulterà lento !!! sei proprio sicuro di volere questo ?
procedure tform1.button1click (sender ...);
var i : integer;
begin
 for i := 1 to x do begin
  form2.memo1.lines.add (inttostr(i));
  form2.refresh; // o update o invalidate ... non ricordo bene.
  //  Application.ProcessMessages;  oppure usi questo.
 end;
Byezz !! Davide DG.

Innanzitutto Grazie!
Ho seguito le tue istruzioni ma non sono riuscito... :-(
Ho provato con:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
 form2.showmodal;
 for i := 1 to 10 do
 begin
  form2.memo1.lines.add (inttostr(i));
  Application.ProcessMessages; file://oppure form2.invalidate o anche
form2.refresh o anche form2.update
 end;
end;
Quando clikko sul button1 appare la form2 con il memo che però non viene
modificato. Allora chiudo la form2 e clikko ancora su button1 per far
riapparire la form2 questa volta con il memo modificato (con i numeri
inseriti).
Io vorrei invece che il memo venisse aggiornato ad ogni incremento della
variabile del ciclo for (se I varia da 1 a 10 vorrei aggiornare il memo 10
volte in modo che ad ogni refresh apparisse una nuova linea che indichi il
numero dell'incremento senza dover chiudere form2 per avere
l'aggiornamento.)
A questo punto vorrei sapere dove sbaglio.

Se devi semplicemente aggiornare una volta per tutte la form2, č sufficiente
che esegui il ciclo prima di chiamare il metodo showmodal.
Se invece desideri visualizzare la form e solo dopo aggiornare il comp. memo
il tuo codice diventa cosě:
 procedure TForm1.Button1Click(Sender: TObject);
 var i : integer;
 begin
           form2.show; {Guarda l' help in linea per capire le differenze tra
Show e ShowModal}
           for i := 1 to 10 do  form2.memo1.lines.add (inttostr(i));
 end;
In alternativa, se la form2 deve essere modale, potresti provare a spedirle
un messaggio tramite la API PostMessage che č asincrona.
 procedure TForm1.Button1Click(Sender: TObject);
 var i : integer;
 begin
           form2.showmodal;
           for i := 1 to 10 do  PostMessage(Form2.Handle, WM_MESSAGGIO, 0,
I);
 end;
E' ovvio che la form2 deve avere una procedura che si attiva al ricevimento
del messaggio.
La dichiarazione potrebbe essere cosě:
const WM_MESSAGGIO = WM_USER + 100;
procedure  WMMessaggio(var Msg: TMessage): message WM_MESSAGGIO;
nella sezione implementation:
procedure  form2.WMMessaggio(var Msg: TMessage);
begin
          memo1.lines.add(Msg.lParam);
          memo1.refresh; {non indispensabile}
end;
In questo modo puoi aggiornare la form2 da qualsiasi punto del tuo codice.
Ti basta spedire il messaggio passando in LPARAM il valore - integer -
appropriato. Nel caso in specie, il messaggio viene spedito 10 volte.
Consulta l' help in linea per maggiori chiarimenti. Per i miei applicativi
gestionali, all' occorrenza, io uso questa tecnica.
Marco Soravia.

 Marco Soravia.
Avevi ragione: mi è bastato cambiare "showmodal" con "show" per ottenere ciò
che volevo!
Ti ringrazio!