Newsgroup: it.comp.lang.delphi
Titolo: lista di componenti

Ho una form con 81 TImage (le caselle di una scacchiera 9x9) che vorrei
richiamare tramite un indice, per es:
a1:TImage; (1)
a2:TImage; (2)
...
i9:TImage; (81)
Cosa mi conviene usare tra array, TList, TComponentList, ecc...???
Una cosa che mi eviti di dover scrivere il metodo Add 81 volte
e che mi consenta con un for i:=1 to 81 di accedere in sequenza a 
tutti gli oggetti, esiste?
-- 
#@!&

"Nurax" ha scritto nel messaggio

La proprietà Tag?
Ciao.
-- 
ACSH
[D4]
Chi fa da se', fatica il doppio 

Naturalmente la cosa più adatta è la Tcomponentlist.
Utilizzando la Tcomponentlist, dovrai riccorre al casting solo per accedere 
alle proprietà specifiche di timange, non presenti nei tcomponent.
Se non ti erediti una lista da tcomponentlist e sovrawscrivi i metodi 
principali, tipo: add, indexof, delete, ecc......
"Nurax" <nu...@linux.site.INVALID> ha scritto nel messaggio 
news:pan.2006.06.23.15.41.16.594374@NuRaX...


richiamare tramite un indice, per es:
Ciao.
Io mi regolo così:
innanzi tutti nomino le Image con (ad esempio) Im1, Im2,Im3,... (a1... 
mi sembra troppo pericoloso come nome)
---------------------------
//--- creo un elenco delle posizioni dei TImage nel Components del Form,
//    un elemento (in ordine) per ogni TImage (pos. [1] per Im1, ...)
//    ed una variabile che ricorda l'ultimo "pezzo" toccato
var 
  LsImage: array[1..81] of integer; 
  Ultimo: integer;
//--- determino la posizione dei TImage nel Components e ne registro 
//    l'integer nell'elemento dell'array a lui dedicato
procedure TForm1.FormCreate
var I,C: integer;
begin
  ...
  for I := 0 to ComponentCount -1 do   
  if (Components[I] is TImage) 
  and (Copy(Components[I].Name,1,2) = 'Im') then begin
     C := StrToInt(Copy(Components[I].Name,3,2));     
     LsImage[C] := I;
  end;
  ...
end;
//-- cliccando contemporaneamente su tutti i TImage del Form (tengo
//   premuto Shift) creo un metodo comune a tutti gli 81 TImage: il 
//   Sender sarà sicuramente un TImage, quel TImage...
//   Portare il valore di Application.HintPause a meno di 20
procedure TForm1.ImageClick(Sender: TObject);
var I: integer;
begin
  I := StrToInt(Copy(TMaskEdit(Sender).Name,3,2 ));
  (Components[LsImage[I]] as TMaskEdit).Hint := 
     'Sono stato cliccato: dove mi sposto?';
  Ultimo := I;  
  // in alternativa puoi inserire in un punto della scacchier aun campo
  // che riporterà il nome del pezzo ed il suo codice "Components"
end;
//-- quando clicca sul quadrante di arrivo, determina le coordinate
//   da attribuire al "pezzo" (Image)
procedure Form1.Sposta;
begin
  with (Components[LsImage[Ultimo]] as TMaskEdit) do begin
    Left := 200; Top := 100;
  end;
  // in alternativa, rileva dal campo Edit di cui sopra il codice 
  // "Components"
end;
Spero potrà esserti utile :-)
NioBi
NioBi
--- posted by geoForum on 
http://www.delphiedintorni.it

"Nurax" <nu...@linux.site.INVALID> ha scritto nel messaggio 
news:pan.2006.06.23.15.41.16.594374@NuRaX...

Ho usato con soddisfazione il TList per una raccolta di TImage. Il problema 
e' il casting ma c'e' un trucco descritto nel web (con google mettici: 
tlist delphi casting) che con poco codice ti consente di evitarlo.
Giorgio

 tutti gli oggetti, esiste?
Utilizzando la unit Contnrs, io opterei per un container personalizzato,
tipo così:
Unit ImageContnr;
uses Controls, Contnrs;
interface
Type
   TImageContainer = class
   private
     FImagesList : TObjectList;
   public
     procedure AfterConstruction;override;
     // Metti qui il codice per creare FImagesList, usando questo metodo
     // dovresti essere compatibile anche con C++Builder che male non fa
     destructor Destroy;override;
     // Qui distruggi FImagesList
     procedure Add( AnImage : TImage );
     property ImageCount : Integer read GetImageCount;
     // GetImageCount deve solo ritornare FImagesList.Count
     property Images[ Index : Integer ] : TImage read GetImage;
     // Qui ci metti il cast per accedere al TImage in modo nativo
   end;
implementation
end.
Ovviamente devi usare il class completion e verificare le uses(l'ho
scritto al volo...).
Ciao,
Andrea