Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Ottobre 02, 2018, 08:06:04 am

Titolo: Usare oggetti creati a Runtime
Inserito da: bonmario - Ottobre 02, 2018, 08:06:04 am
Ciao a tutti,
sto creando un nuovo progetto che, tra le altre cose, fa questo:
- all'apertura, come prima cosa, legge un file di testo in cui ci sono una frase per ogni riga
- per ogni riga letta, deve creare un TCheckBox la cui Caption è uguale alla riga letta

Visto che non so a priori quante ne dovrò creare, le creo a runtime così:
Codice: [Seleziona]
    with TCheckBox.Create(Form1) do begin
      Name:='CheckBox' + PreparaNumeroPerNomeComp(IdxCatg);
      Caption:=RigaLetta;
      Checked:=True;
      Left:=296;
      Height:=24;
      Top:=WrkTop;
      Width:=24;
      TabOrder:=GestTabOrder;
      Parent:=Form1;
    end;

Per farla breve, ogni TCheckBox creata si chiamerà CheckBox001, CheckBox002, ecc.

Al momento, quando poi devo andare a vedere se una di loro è Checked o no, faccio così:
Codice: [Seleziona]
    for Idx:=0 to Form1.ComponentCount - 1 do begin
      NomeComp:=Form1.Components[Idx].Name;

      if (NomeComp = 'TCheckBox001') then begin
        .........................
      end;
    end;


C'è qualche modo per referenziare direttamente l'oggetto che mi interessa, senza farli passare tutti e scegliere quello che mi interessa in base al nome?

Grazie in anticipo, Mario
Titolo: Re:Usare oggetti creati a Runtime
Inserito da: Stilgar - Ottobre 02, 2018, 08:23:28 am
Al posto del nome puoi associare un valore all'attributo tag.
Confronti quello....no?
Forse non ho capito il problema .
Stilgar
Titolo: Re:Usare oggetti creati a Runtime
Inserito da: Stilgar - Ottobre 02, 2018, 08:26:47 am
Ma non puoi associare un evento a quei componenti?
Tieni da qualche parte la lista delle domande e usi un secondo contenitore per tenere gli indici dei componenti checked=true. Con il parametro sender puoi estrarti il nome del componente o fare altri ragionamenti su cosa è stato selezionato
Titolo: Re:Usare oggetti creati a Runtime
Inserito da: bonmario - Ottobre 02, 2018, 11:59:11 am
Ciao,
diciamo che ho scritto solo "una parte" di quelo che deve fare il programma.
Un comportamento analogo lo deve tenere anche per:
- TLabel
- TEdit
- TDateTimePicker
- TSpinEdit

In ogni caso, la mia era solo una curiosità: il programma già così funziona, solo che la cosa mi sembrava un po' macchinosa, e pensavo che ci fosse qualcosa di più "diretto" per referenziare un oggetto creato a runtime.

Grazie, Mario
Titolo: Re:Usare oggetti creati a Runtime
Inserito da: Stilgar - Ottobre 02, 2018, 12:04:01 pm
Diciamo che onchange e onclick potrebbero aiutare 😉
Titolo: Re:Usare oggetti creati a Runtime
Inserito da: bonmario - Ottobre 02, 2018, 12:06:50 pm
Grazie !

Ciao, Mario