Newsgroup: it.comp.lang.delphi
Titolo: Ordine temporale di creazione degli oggetti

Salve a tutti!
Stavo cercando un documento in cui trovare descritto in che ordine vengono 
istanziati i diversi oggetti che fanno parte di un progetto all'avvio 
dell'applicazione...
Ho guardato sia l'help che google, ma non sapendo cosa usare come chiave di 
ricerca non ho ottenuto risultati significativi...
Potreste suggerirmi voi qualcosa? Link o anche solo stringa di ricerca?
Grazie mille,
    Stefano 

Stefano Bragaglia ha scritto:

Dipende da cosa intendi. In particolare:
1. L'ordine degli oggetti caricati in un progetto dipende dal contenuto 
del sorgente del /.dpr/. Quindi esattamente nell'ordine di creazione 
definito nel progetto. Se poi per uno o piu oggetti, nel costruttore, ne 
crei degli altri è un altro discorso. In sostanza è legato all'algoritmo 
di avviamento dell'applicazione.
2. L'ordine di creazione degli oggetti su TForm e TDataModule dipende 
dall'ordine in cui li hai inseriti ed è controllabile attraverso 
l'opzione /creation order/.
3. Per quanto relativo ad eventuali istanze globali dichiarate nella 
initialization delle singole unit (e quindi piu in generale tutte le 
procedure di initialization e finalization), non ricordo bene se dipende 
dall'ordine in cui vengono dichiarate o l'inverso. Comunque dovresti 
trovare documentazione nella guida di Object Pascal fornita con Delphi.
Idealmente, per fare qualche prova, potresti mettere un pò di MsgBox 
nelle varie initialization/finalization per verificare l'ordine di 
esecuzione
Ciao,
Gianluca.

 il processo di istanziazione degli oggetti di un progetto... non
IMHO non è saggio fare affidamento su queste cose (come anche, ad esempio,
l'ordine di valutazione delle espressioni in if), potrebbero cambiare col
tempo ed altre condizioni...
-- 
Jax
====
La paura è l'origine di tutti i nostri mali, dunque non abbiate paura.
(C.W. Brown)

Ciao Gianluca!
Grazie per la risposta così veloce!
Ti spiego in due parole qual è il mio problema così magari mi sai dare una 
informazione con un ordine di approssimazione maggiore...
Riduco all'essenziale: In una form del mio progetto ho dichiarato una 
variabile pubblica di tipo stringa e vi ho aggiunto un componente da me 
scritto. Il codice del componente rilevante ai fini della domanda è il 
seguente:
type
  TSetupEvent = procedure (Sender: TObject; var Param: String) of Object;
  TMyComponent = class(TComponent)
  private
    { Private declarations }
    fOnSetup: TSetupEvent;
  protected
    { Protected declarations }
  public
    { Public declarations }
    ...
    procedure Loaded; override;
  published
    { Published declarations }
    property OnSetup: TSetupEvent read fOnSetup write fOnSetup;
  end;
...
procedure TMyComponent.Loaded;
var
  aParam: String;
begin
  if not (csDesigning in ComponentState) then
    begin
      aParam := 'auto';
      if Assigned (fOnSetup) then
        fOnSetup (Self, aParam);
      if aParam <> auto then
        ...
      else
        ...
    end;
end;
Ho poi scritto questi due eventi:
procedure TfMain.FormCreate(Sender: TObject);
begin
  if FormStyle = fsMDIChild then
    theParam := 'manual'
  else
    theParam := 'auto';
end;
procedure TfMain.MyComponent1Setup(Sender: TObject; var Param: String);
begin
  Param := theParam;
end;
Ero convinto che l'OnCreate della Form venisse eseguito prima dell'OnSetup 
del mio componente, ma non è così! Ovviamente ho risolto cancellando 
l'OnCreate e modificando come segue l'OnSetup
procedure TfMain.MyComponent1Setup(Sender: TObject; var Param: String);
begin
  if FormStyle = fsMDIChild then
    theParam := 'manual';
end;
tuttavia per mia curiosità personale e per non essere colto in fallo la 
prossima volta, volevo sapere dove fosse spiegato come si svolge il processo 
di istanziazione degli oggetti di un progetto... non credo che sia 
sufficiente ragionare a livello di record di attivazione, o almeno non è 
sufficiente dato che, come dicevi tu, certi cose vengono inizializzate 
nell'ordine che sono scritte o al contrario...
Come ho detto, ho cercato nell'help ma non sono riuscito a trovare niente, 
sicuramente perchè per colpa mia ho usato chiavi di ricerca non buone... 
speravo che qualcuno mi potesse dare un aiutino in questo senso...
Ciao e grazie (e scusate per la mia logorrea),
            Stefano 

Stefano Bragaglia ha scritto:
[cut]
A dire il vero non conosco /TSetupEvent/ e da quel poco che ho trovato 
al volo della documentazione si tratta di una caratteristica poco 
documentata... ma non saprei... qual'è la versione di Delphi?
Inizializzando i componenti, io in genere preferisco suddividere 
nettamente l'inizializzazione "interna" da quella che dipende dalla 
relazione con gli altri componenti ed elementi dell'applicazione (salvo 
eccezioni per casi particolari).
In genere:
1. Aggiungo in evento OnInitialize al componente.
2. Aggiungo un metodo Initialize che internamente chiama, se assegnato 
OnInitialize.
3. Se previsto da particolari circostanze, nel costruttore del 
componente eseguo una chiamata ad Initialize.
Quindi nel create del form mi aspetto che il componente già esista e ne 
eseguo l'inizializzazione.
Ciao,
Gianluca.

 [cut]
Ops... forse mi son spiegato male... :-D
Uso Delphi 7, ma TSetupEvent non è un evento di Delphi: l'ho dichiarato io!
Grazie comunque per il suggerimento!
        Stefano