Newsgroup: it.comp.lang.delphi
Titolo: Costruttori

Salve, è possibile far ritornare un valore a un costruttore come per una funzione?
Grazie in anticipo.
Alessandro

 una funzione?
Quale e' la necessita che sta alla base della domanda?
-- 
I am what I am, I do what I can
Cerchi un programmatore PHP/MySQL? 
http://url.repository.biz/go/1Y
L'uomo, conscio di sbagliare, persevera.

Certo, metti un parametro var nel costruttore.
Ciao, Rocco.

> Salve, è possibile far ritornare un valore a un costruttore come per
una funzione?
E' possibile far ritornare un valore, ma non come per una funzione,
nel senso che i costruttori non hanno un Result assegnabile
dall'utente.  Come dice Rocco, dovresti usare una variabile "var",
anche se questa mi sembra una soluzione inelegante, perché contraria a
un principio fondamentale: un costruttore serve a inizializzare lo
stato di un oggetto, quindi la logica vuole che tu costruisca
l'oggetto e poi ne interroghi lo stato (mediante una proprietà, o un
metodo pubblico).  Avere la necessità di restituire un valore,
significa secondo me aver progettato male la classe.

Alessandro
	Ciao
	MassimoB
 

 significa secondo me aver progettato male la classe.
La mia classe, che in realtà è una form modale, usa per il costruttore
il seguente codice:
constructor Create(...;var Ris: Integer); reintroduce;
constructor TMiaForm.Create(...;var Ris: Integer);
    begin
    inherited Create(Application);
    Ris:=ShowModal();
    end;
Ho la necessita di sapere, dopo che la form è stata chiusa e
distrutta, se l'utente ha premuto il tasto [OK] o [Annulla]. Non so se
questa sia la soluzione migliore, quindi qualsiasi consiglio è ben
accetto.
Saluti.
Alessandro

Da una Form1 con ShowModal chiamo la Form2 :
...
 Form2.ShowModal ;
  If ModalResult = mrOk Then
    ShowMessage ('Ok')
  Else
    ShowMessage ('Cancel') ;
...
E riesco a leggere quale dei due tasti ho clickato.
(Anche se ho spinto Enter o Esc)
Ciao
Mario
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 distrutta, se l'utente ha premuto il tasto [OK] o [Annulla].
Testa semplicemente il valore di ritorno:
case TuaForm.ShowModal of
  mrOK: .....
  mrCancel: ....
  ...
end;

...

Forse mi sono spiegato male.
Ho una form modale in cui per uscire può essere premuto il tasto [OK]
o [Annulla]. Per evitare di chiamare la ShowModal() dalla form che
chiama la modale o da una funzione in una unit comune al progetto:
{Unit funzioni comuni al progetto} 
function CreaFormModale([...]): Integer;
 
var
  FormModale: TFormModale;
    begin
    FormModale:=TFormModale.Create(Application);
    [...]
    Result:=FormModale.ShowModal();
    end; 
{Unit qualsiasi}
procedure ProceduraQualsiasi([...]); 
    begin
    [...]
    if(CreaFormModale()=mrOK) then
        begin
        [...]
        end;
    end;
Ho creato un nuovo costruttore della form modale:
constructor Create(...;var Ris: Integer); reintroduce;
constructor TFormModale.Create([...];var Ris: Integer);
    begin
    inherited Create(Application);
    [...]
    Ris:=ShowModal();
    end;
Questo sistema funziona, però mi chiedo se sia la soluzione migliore.

Questo sistema funziona, però mi chiedo se sia la soluzione migliore.
ciao
sinceramente non ne vedo l'utilità :)
magari mi puoi dare delucidazioni in merito alle migliorie
del tuo metodo rispetto alla normale flusso pensato degli 
implementatori Borland, così nel caso potrei utilizzare il tuo 
metodo.
	Ciao
	MassimoB
 

 	MassimoB
La mia intenzione è semplicemente di avere una procedura della form
(nel caso specifico un costruttore) che riunisce il costruttore della
form e lo ShowModal, per evitare di scrivere due righi anziché uno in
tutte le parti di programma in cui deve essere usata questa form
modale, per avere una maggiore pulizia di codice; tuttavia non so se
facendo così peggioro la situazione.
Mi pare d'intuire che la risposta sia affermativa... o sbaglio?
Ciao
Alessandro

Alessandro
	Ciao
	MassimoB
 

 facendo cosě peggioro la situazione.
[]
Personalmente farei una cosa tipo:
with TMyDlgForm.Create(nil) do try
  if Execute(SomeOrNoParam) then
    DoThis
  else
    DoThat;
finally
  Free;
end;
Oppure, se fai della tua form di dialogo un componente puoi
semplicemente poggiarlo sul form da cui lo chiamerai ed usare Execute,
come per ogni altra form di dialogo.
Dai un'occhiata a quel che fa il metodo Execute in dialogs.pas (o
simile).
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare" [Calvin & Hobbes]

 form e lo ShowModal, per evitare di scrivere due righi anziché uno in
Io in genere creo un metodo di classe che riunisce la creazione e la
chiamata a ShowModal, restituendo un boolean.
di seguito il metodo di classe.
class function TProductsForm.Execute: boolean;
var
  ProductsForm: TProductsForm;
begin
  ProductsForm := Create(nil) ;
  try
    Result := ProductsForm.ShowModal = mrOK ;
  finally
    ProductsForm.Release;
  end ;
end;
Antonio

Ringrazio tutti per i consigli.
Ciao.
Alessandro