Innanzi tutto hai inserito veramente troppi componenti con nomi "assurdi" nel senso che Label981 non è un nome che si ricordi no? Stessa cosa per la Form.
Tieni anche presente che è buona norma commentare il codice (dopo 2 mesi non ricordi cosa faceva una procedura) ed accorpare le procedure e funzioni comuni
Comunque tieni presente una cosuccia semplice semplice...
...se devi inserire molti componenti simili tipo
<Immagine 1> <Etichetta 1> <Etichetta 1.1>
<Immagine 2> <Etichetta 2> <Etichetta 2.1>
<Immagine 3> <Etichetta 3> <Etichetta 3.1>
.......
[Eccetera, Eccetera]
come hai inserito per la parte formazione ed energie/voto ti conviene creare i controlli a run time ed inserirli in vettori se le procedure sono molto differenti, oppure lavorare sul campo TAG se le procedure sono simili ma differiscono di alcuni campi, spiego:
Passo 1 creare i controlli (piccolo esempio espandibile)
Var
Y : Integer;
Num : Integer;
Img1 : TImage;
Img2 : TImage;
Msg : TLabel
Begin
Y := 5; // Posizione iniziale Y primo dato
// Ciclo per tutte le linee
For Num := 1 To Numero_Giocatori Do
Begin
// Creazione prima immagine
Img1 := TImage.Create(Self);
Img1.Parent := Self;
// Assegnazione coordinate, dimensione ed altre proprietà
Img1.Left := 10;
Img1.Top := Y;
Img1.Height := 16;
Img1.Width := 16;
Img1.Trasparent := True;
Img1.Visible := False;
// Assegnazione immagine
// ImmagineOriginale1 è un TImage con Visible = False
// su cui ho caricato l'immagine
// Oppure se l'immagine è un file su disco uso
// Img.Image.LoadFromFile(NomeFile);
Img1.Image.Assign(ImmagineOriginale1);
// Assegnazione tag di ricerca
Img1.Tag := I;
// Creazione seconda immagine
Img2 := TImage.Create(Self);
Img2.Parent := Self;
// Assegnazione coordinate, dimensione ed altre proprietà
Img2.Left := Img1.Left+Img1.Width+10;
Img2.Top := Y;
Img2.Height := 16;
Img2.Width := 16;
Img2.Trasparent := True;
Img2.Visible := False;
// Assegnazione immagine
// (come per Img1)
Img2.Image.Assign(ImmagineOriginale2);
// Assegnazione tag di ricerca
// (Notare il +$100 serve per la ricerca)
Img2.Tag := I + $100;
// Creazione etichetta
Msg := TLabel.Create(Self);
Msg.Parent := Self;
// Assegnazione coordinate, dimensione ed altre proprietà
Msg.Left := Img2.Left + Img2.Width + 50;
Msg.Top := Y;
Msg.Height := 20;
Msg.Width := 140;
Msg.Autosize := False;
Msg.Caption := 'Pippo';
// Assegnazione eventi
Msg.OnClick := Clicca_Giocatore;
// Assegnazione tag di ricerca
Msg.Tag := I;
// Aggiustamento coordinata Y
Y := Y + 20;
End;
End;
Passo 2 gestire i controlli
.per gestire i controlli ovviamente devo avere il controllo e, per fare questo, creiamo una procedura che mi ricerchi il controllo che mi serve
// Ritorna l'oggetto TImage con Tag = Quale
// se non trovato ritorna NIL
Procedure TForm1.GetImmagine(Quale : Integer) : TImage;
Var
I : Integer;
Ok : Boolean;
Begin
// Inizializzazione uscita
Result := Nil;
// Ciclo di ricerca
I := 1;
Ok := False;
While (I <= ControlCount) And (Not Ok) Do
Begin
// L'oggetto è un TImage?
If (Controls[I-1] Is TImage) Then
// L'oggetto ha il TAG uguale a quello passato?
If (Controls[I-1] As TImage).Tag = Quale Then
Begin
// Memorizzazione controllo
Result := (Controls[I-1] As TImage);
// Flag di uscita
Ok := True;
End;
// Passaggio al successivo
Inc(I);
End;
End;
Stessa cosa se vogliamo ricercare una TLabel invece di un TImage: basta sostituire la dicitura Timage con quella del controllo che vogliamo cercare.
Ora per usare un controllo all'interno del nostro programma possiamo scrivere (esempio sempre con l'immagine)
GetImmagine(2).Visible := True;
oppure
Var
I : TImage;
Begin
....
I := GetImage(2);
T.Visible := True;
...
End;
la differenza tra il primo metodo ed il secondo è che se vogliamo manipolare più di una proprietà conviene usare la seconda che è più ottimizzata.
Passo 3 gestire gli eventi
Questa è facile... dichiariamo, nella nostra form le procedure di gestione come ad esempio
Procedure Clicca_Giocatore(Sender : TObject)
e la gestiamo nel solito modo fatta eccezzione per le piccole differenze che gestiremo con il campo TAG
Procedure TForm1.Clicca_Giocatore(Sender : TObject);
Var
Label : TLabel;
Begin
// Preleviamo l'oggetto chiamante
Label := (Sender As TLabel);
// Qui' eseguiamo la gestione comune
Label.Visible := True;
// Ora eseguiamo la gestione specializzata
Case Label.Tag Of
1 : Label.Caption := 'Mario Rossi';
2 : Label.Caption := 'Luca Bianchi';
End;
End;
Ciao,
David
Altra piccola cosuccia (non solo in Pascal ma in tutti i linguaggi)
Usa una sola unit per una sola form o oggetto
Raggruppa i tipi, costanti e variabili globali in una unit che chiamerai Costanti_Comuni o Tipi o come ti pare inserendola nella uses delle altre unit che usi
Raggruppa le procedure globali in una sola unit
e, ovviamente, commenta il tutto il più possibile ed in maniera "umana" e dai dei nomi descrittivi alle variabili/funzioni. Per esempio se hai una funzione che esegue una somma tipo:
// Eseguo la somma
Function TForm1.FunctionSum1(A : Integer) : Integer;
Begin
Result := Round(A+A*1.1+A*1.2);
End;
che ovviamente non si capisce è meglio usare
// Sommo al valore passato il 10% ed il 20%
Function TMainForm.Somma_Percentuali(Valore_Iniziale : Integer) : Integer;
Var
Risultato : Double;
Begin
// Prelevo il valore iniziale
Risultato := Valore_Iniziale;
// Aggiungo il 10%
Risultato := Risultato + (Valore_Iniziale * 1.1);
// Aggiungo il 20%
Risultato := Risultato + (Valore_Iniziale * 1.2);
// Prelevo il valore di uscita
Result := Round(Risultato);
End;
meglio no?
Unit Comuni;
Interface
Uses
Windows, SysUtils;
Procedure Fattoriale(Numero : Integer) : Double;
Procedure WriteLn(Dove : TListBox; Const Stringa : String)
Implementation
Procedure Fattoriale(Numero : Integer) : Double;
Begin
If Numero > 1 Then Result := Numero*Fattoriale(Numero-1);
End;
Procedure WriteLn(Dove : TListBox; Const Stringa : String)
Begin
Dove.Lines.Add(Stringa);
End;
end.
Ora se includi la unit Comuni (clausola Uses) puoi utilizzare le due procedure al di sopra della sezione implementation dove vuoi tu
Ciao