Newsgroup: it.comp.lang.delphi
Titolo: gestione componenti a runtime

Sono cocciuto ma cocciuto......
Allora, ho 50 edit dal nome edit1..edit50
Devo modificare a runtime le proprieta di queste.
Credo che debba usare un puntatore per poter scrivere meno codice. Ma come
si fa?
Grazie mille


uses TypInfo;
Procedure Modifica(Sender:TObject;PropertyName:String;Value:Variant);
Var
 PropInfo: PPropInfo;
Begin
    if Sender is TEdit then
     PropInfo := GetPropInfo(Sender.ClassInfo, PropertyName);
      if Assigned(PropInfo) then
        SetPropValue(Sender, PropInfo, Value);
End;
Poi ti chiami la tua
Modifica(Edit1,'Text','Ciao!');


Mi correggo :
 Procedure Modifica(Sender:TObject;PropertyName:String;Value:Variant);
 Begin
     if Sender is TEdit then
         SetPropValue(Sender, PropertyName, Value);
 End;
questo e piu che sufficente


Mars University: «Knowledge brings Fear»

Ma io intendevo chje i componenti gia li ho creati e che voglio di tutti
modificare o fare il grabbing di alcuni valori di loro proprietà.
Io pensavo a i puntatori, ma non so se è giusto.
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:ZS22c.3352$O31....@news4.tin.it...


"Luca Zanni" <Punga@Libero.g> ha scritto nel messaggio
news:LJ22c.53307$FJ6.1...@twister1.libero.it...

Bella routine, molto generica; a questo aggiungerei una sana iterazione
attraverso le proprietà "Controls" o "Components" (nel tuo caso basta
"Controls", se non hai utilizzato pannelli, o altri contenitori nella form),
perchè come gia saprai, "Controls" ti indica tutti i controlli child di un
determinato contenitore (Controllo), mentre "Components" ti permette di
accedere a tutti i componenti di cui un partocolare controllo è responsabile
o proprietario, il che è ben diverso.
Ciao e Buon Lavoro.

 Io pensavo a i puntatori, ma non so se è giusto.
Cosa significa "pensare ai puntatori"? I puntatori sono strutture
dati...in generale, qualsiasi riferimento ad un oggetto, componente o
controllo (che sempre oggetti sono) è rappresentato da un puntatore.
Ad ogni modo, se hai bisogno di leggere o scrivere una proprietà di un
controllo TEdit accedendo attraverso il nome, usa il metodo
FindComponent del form.
In alternativa, per un accesso più rapido, soprattutto considerando che
crei "manualmente" i controlli, crea un'istanza di TList e aggiungi con
il metodo Add i riferimenti ai controlli creati alla lista.
Segue un esempio di codice:
===
procedure TDemoForm.FormCreate(Sender: TObject);
begin
  FEditList := TList.Create;
  CreateAllEdits;
end;
procedure TDemoForm.FormDestroy(Sender: TObject);
begin
  if FEditList <> nil then
    FreeAndNil(FEditList);
end;
procedure TDemoForm.CreateAllEdits;
var
  Edit: TEdit;
  i: Integer;
begin
  for i := 1 to 30 do
  begin
    Edit := TEdit.Create(Self);
    Edit.Parent := Self;
    Edit.Left := i * 20;
    Edit.Top := i * 20;
    // imposta altre proprietà...
    FEditList.Add(Edit);
  end;
end;
procedure TDemoForm.ChangeAllEdits;
var
  Edit: TEdit;
  i: Integer;
begin
  if FEditList <> nil then
  begin
    for i := 0 to FEditList.Count - 1 do
    begin
      Edit := TEdit(FEditList.Items[i]);
      Edit.Text := 'Casella 
n.ro
 ' + IntToStr(i);
    end;
  end;
end;
procedure TDemoForm.ChangeButtonClick(Sender: TObject);
begin
  ChangeAllEdits;
end;
===
Nella FormCreate viene eseguita la creazione dell'oggetto TList che
ospiterà i riferimenti ai controlli TEdit creati dinamicamente;
successivamente, viene richiamato il metodo opportuno che si occupa
appunto della creazione dei controlli TEdit.
Nell'evento FormDestroy, si procede alla distruzione dell'oggetto TList,
mentre i controlli TEdit stessi verranno distrutti automaticamente
dall'oggetto Form che è il loro "possessore" (owner).
Il metodo CreateAllEdits esegue un ciclo e crea dinamicamente 30
controlli Edit specificando la Form come owner responsabilizzandola
della distruzione dei controlli stessi; la proprietà Parent deve essere
assegnata per designare il "contenitore" dei controlli; all'interno di
questo blocco di codice, vanno definite le proprietà iniziali dei
controlli TEdit creati dinamicamente, che verranno poi modificate dal
metodo ChangeAllEdits, nell'esempio.
Il metodo ChangeAllEdits scandisce la lista dei controlli TEdit e per
ciascun controllo reimposta il testo contenuto al suo interno; il metodo
viene invocato premendo il pulsante "ChangeButton" che scatena l'evento
ChangeButtonClick.
Il campo privato "FEditList" è definito nella sezione privata della
dichiarazione di classe del form:
===
  TDemoForm = class(TForm)
    ChangeButton: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ChangeButtonClick(Sender: TObject);
  private
    { Private declarations }
    FEditList: TList; // <---- lista di controlli TEdit
    procedure ChangeAllEdits;
    procedure CreateAllEdits;
  public
    { Public declarations }
  end;
===
Spero di averti chiarito le idee e di averti fornito qualche valido
suggerimento implementativo.
