Newsgroup: it.comp.lang.delphi
Titolo: puntare ad oggetto in fase di dichiarazione

E' possibile creare una costante o variabile che punti ad un'oggetto
in fase di dichiarazione? (naturalmente se si, come?)
Mi spiego con un esempio pratico:
********
type
  TMioForm = class(TForm)
    Combo: TComboBox;
    ...
  end;
var
  frmMio: TMioForm;
const
  cVari: ComboBox =  frmMio.Combo ;
********
solo che cosě in fase di compilazione da il seguente errore: Constant
expression expected
Qualche suggerimento? (a parte quello di creare una variabile da
valorizzare in seguito ...)
Grazie.

 expression expected
semmai dovrebbe essere
const
  cVari: TComboBox = TComboBox.Create(nil);
ma non te lo compilerą mai perchč TComboBox.Create(nil) restituisce una 
variabile (un puntatore a un oggetto).
E' che non si capisce cosa vuoi fare, visto che piazzando una ComboBox su una 
form, il meccanismo di streaming dal file DFM si occupa *da solo* di chiamare 
il costruttore di TComboBox e assegnare il risultato a frmMio.Combo (che per 
essere incluso in questo meccanismo dev'essere appunto un campo published - 
come effettivamente č dal codice che hai scritto).
Come ulteriore spunto, guarda questo esempio (nella uses ci dev'essere 
StdCtrls):
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    ComboBox1: TComboBox;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1:= TComboBox.Create(Self);
  ComboBox1.Parent:= Self;
  ComboBox1.Top:= 10;
  ComboBox1.Left:= 10;
  ComboBox1.Items.CommaText:= 'uno,due,tre';
  ComboBox1.ItemIndex:= 1;
end;
O anche questa variante
type
  TForm1 = class(TForm)
  public
    constructor Create(Owner: TComponent); override;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
constructor TForm1.Create(Owner: TComponent);
begin
  inherited;
  with TComboBox.Create(Self) do
  begin
    Parent:= Self;
    Top:= 10;
    Left:= 10;
    Items.CommaText:= 'uno,due,tre';
    ItemIndex:= 1;
  end
end;
Nota che una volta creato il controllo con TComboBox.Create(Self), non c'č 
bisogno di distruggerlo (chiamare il distruttore al termine del suo ciclo di 
vita).
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

...
Grazie per la risposta ma probabilmente mi sono espresso male, provo a
chiarire.
Io ho un form con dei combo e vorrei creare delle costanti globali,
che fanno da puntatori ai combo del form.
Un esempio banale potrebbe essere ad esempio voler dichiarare un array
di puntatori ai combo del form, dove in fase di dichiarazione decido
l'ordine in cui questi devono essere indicizzati, senza dover
dipendere dall'ordine in cui appaiono nell'array Form.controls[n] (che
mi pare sia in ordine di creazione giusto?)
********
type
  TMioForm = class(TForm)
    ...
    ComboD: TComboBox;
    ComboA: TComboBox;
    ComboC: TComboBox;
    ComboB: TComboBox;
    ...
  end;
var
  frmMio: TMioForm;
const
  cArrVari: array of [0..3] TComboBox = 
(frmMio.ComboA,frmMio.ComboB,frmMio.ComboC,frmMio.ComboD) ;
********
Quello dell'array sopra è solo un esempio. Io dovrò utilizzare una
dichiarazione dle genere per inizializzare un array di record dove uno
dei campi dovrà essere di tipo TComboBox e puntare ad un Combo del
form.
C'è una soluzione?
Grazie :)

 C'č una soluzione?
Anche se, almeno a me, non rimane chiaro il *motivo* per cui vuoi fare
cio',
credo che tu debba dare un occhio alla classe TCollection e magari poi
abbandonare l'ipotesi di un "array di record con un oggetto come campo".
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 C'è una soluzione?
sì ed è molto semplice.
Se proprio vuoi usare un array (mentre io userei una TList o meglio una lista 
safe type o anche un derivato di TCollection):
const
  cArrVari: array of [0..3] TComboBox;
punto e fine
Poi inizializzi l'array nella sezione initialization della unit.
  cArrayVari[1]:= frmMio.ComboB;
ecc ecc.
Però attenzione: mi stai usando una variabile globale a livello di unit 
(cArrVari) ciò vuol dire che sarà condivisa tra tutte le istanze di TfrmMio 
(qualcosa nel tuo approccio mi dice che provieni da VB - impressione mia!)
Meglio far diventare cArrayVari un campo privato di TfrmMio:
type
  TfrmMio
  ...
  private
    FArrayVari ecc ecc
(F è il prefisso che standard per i campi - i prefissi migliorano la 
leggibilità del codice)


 impressione mia!)
Non sempre è un male dato che Delphi nella versione win32 non ha i
campi di classe, alcune volte non si può fare a meno di ricorrere ad
una variabile di unit proprio per condividerla tra più istanze della
stessa classe.
Antonio

 Grazie :)
Prego,
Andrea

 non ricordo male)
ricordi bene, hai ragione


 Grazie :)
Ritengo di si', ma non puoi definire il puntatore al combo come una
costante, visto che non lo e'.
Fai quanto devi fare usando le Var e implementando delle funzioni o metodi
per assegnarle, non mi sembra che cosi' comporti chissa' che svantaggio.
Puoi, ad esempio, usare Initialization per eseguire le funzioni di
assegnazione.
Giorgio