Newsgroup: it.comp.lang.delphi
Titolo: Per distrarsi dal virus

 
Per distrarmi dal virus, sto riguardando alcuni miei vecchi programmi per 
provare delle modifiche che avevo in mente. In una che mi sembrava 
facilissima ho incontrato subito una difficoltà che non riesco a superare.
Un form1 (GestU.pas) ha un bottone la cui pressione apre un altro piccolo 
form2 per la raccolta di tre dati che deve restituire al form chiamante. I 
dati sono un oggetto di tipo record con tre campi e di nome TDatiRicorrenza 
dichiarato nel form1.
 
Nel form2 ho usato una Create così:
....
uses GestU, .....;
....
  publc
    FDatiRicorrenza: TDatiRicorrenza;
   constructor Create(AOwner: TComponent; var DatiRicorrenza: 
TDatiRicorrenza );
  end;
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
constructor TFormDatiRicorrenze.Create(AOwner: TComponent; var 
DatiRicorrenza: TDatiRicorrenza );
begin
  inherited Create(AOwner);
  FDatiRicorrenza := DatiRicorrenza;
end;
 
Nel form1, il click sul bottone richiama il form2 così:
 
Form2 := TForm2.Create(Self, TDatiRicorrenza);
 
Ricevo il seguente errore di compilazione:
[DCC Error] GestU.pas(1403): E2029 '(' expected but ')' found
 
Perchè? 
 

Ciao Stark,
   e' un problema di facile risoluzione.
Stai passando un record.
Al moemento anche nella versione 10.3.3 NON puoi copiare un record con
 
RecordCopia:=RecordOriginale
 
Ma lo devi assegnare campo per campo.
 
Nel tuo caso, nell'oncreate basta fare
FDatiRicorrenza.Campo1:=DatiRicorrenza.Campo1
ecc...
 
Poi, dato che devi editare i campi, io preferisco chiamare la form con 
una funzione che ritorna la tua base dati.
 
In ultimo, ricorda che se devi creare una form con un constructor 
personalizzato e' bene cambiargli il nome (almeno io faccio cosi') per 
esempio
Contructor NewCreate(AOwner: TComponent; DatiRicorrenza:TDatiRicorrenza)
 
In diversi post su stackoverflow ho letto che e' preferibile NON 
cambiare il create.
 
Prova con queste 2 strade e fai sapere !!
 
Ciao
 
Daniele
 
 
 
Il 20/03/2020 12:31, Stark ha scritto:> > Per distrarmi dal virus, sto 


Ciao Daniele, spero che tu sia come me rintanato in casa (io con qualche 
motivazione in più per la mia età).
Grazie delle indicazioni. Ho provato subito a passare i dati campo per campo 
e funziona, ma poi ho pensato che potevo trasformare la mia struttura di 
dati da record a classe e infatti funziona anche così, ma mi risparmio di 
specificare tutti i campi singolarmente. Invece non ho capito quando dici "
io preferisco chiamare la form con una funzione che ritorna la tua base 
dati."
Puoi spiegarmi meglio o darmi un esempio ?
 
"Daniele"  ha scritto nel messaggio news:r5a03e$h39$1...@gioia.aioe.org...


Ciao,
   bhe io invece sono al lavoro .... mezza giornata ..
Ecco l'esempio, facendo rabbrividire qualcuno ....
 
Nei miei progretti le form non le autocreao.
Quelle che si autocreano, di solito, sono la principale e quella dove 
sono contenuti i dati.
 
Quando ho bisogno di lavorare su record di solito procedo cosi'
 
Function ModifyMyData(MyData : TMyData) : TMyData;
Begin
   Result := MyData;
   Form1.NewCreate(Ni,MyData);
   Try
     Form1.Showmodal;
   finally
     If Condizione_che_accetta_il_cambio_data Then Result:=Form1.MyData;
     FreeandNil(Form1);
   End;
End;
 
Nella form lavori su MyData a piacimento, se non fai niente la funzione 
restitusce il record originale.
 
Ciao
 
Daniele


Si adesso è chiaro. Grazie e bon lavoro
 
"Daniele"  ha scritto nel messaggio news:r5a2nh$1ufu$1...@gioia.aioe.org...
