Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
[pascal] cicli for in
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 17 Dic 2011 10:58    Oggetto: [pascal] cicli for in Rispondi citando

Per chi non lo sapesse, in pascal, o almeno usando lazarus o delphi, è possibile fare cicli for in, come spiegato qua: link

la cosa mi è interessata perchè io ho 10 CheckListBox che voglio, ad un certo punto del programma, svuotare completamente, quindi al posto di copidare-incollare 10 volte il comando (cambiando il nome delle checklistbox):
Codice:
for i:=Form2.CheckListBox1.Items.Count-1 downto 0 do Form2.CheckListbox1.Items.delete(i);   

ho pensato di scrivere:
Codice:

for lista in (Form2.CheckListBox1, Form2.CheckListBox2) do
   begin
   for i:=lista.Items.Count-1 downto 0 do lista.Items.delete(i);
   end;                                                         

dove lista è stata definita come TCheckListBox.

Non riesco a capire il motivo, ma se tento di compilare ottengo l'errore
Codice:
unit2.pas(174,34) Fatal: Syntax error, ")" expected but "," found

ho quindi provato a scrivere il for con un solo elemento
Codice:

for lista in (Form2.CheckListBox1) do
   begin
   for i:=lista.Items.Count-1 downto 0 do lista.Items.delete(i);
   end;                                                         

ma ottengo l'errore
Codice:
unit2.pas(174,5) Error: Incompatible types: got "TComponent" expected "TCheckListBox"

e invece scrivendo (visto che alla fine quelle che voglio modificare sono tutte le checklistbox)
Codice:
for lista in (TCheckListBox)do
   begin
   for i:=lista.Items.Count-1 downto 0 do lista.Items.delete(i);
   end;       

mi da' l'errore
Codice:
unit2.pas(174,14) Error: Cannot find an enumerator for the type "Class Of TCheckListBox"


quindi a questo punto temo di averle provate tutte, senza capire perchè il codice scritto all'inizio non vada bene (tutto quello che ho scritto successivamente sono stati tentativi invani per capire cosa dovessi cambiare). Non è per me una cosa gravissima dover copiare-incollare quel pezzo di codice 10 volte, perchè devo fare una operazione 'veloce' (cioè che scrivo in una riga), ma so gia che dopo ne ho una non altrettanto corta e quindi si incasina tutto, oltre al fatto che dal punto di vista sintattico, per quanto corretto, mi sembra proprio brutto non riuscire a metterlo nel ciclo...
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10530
Residenza: Tokelau

MessaggioInviato: 19 Dic 2011 09:53    Oggetto: Rispondi citando

ma Form2.CheckListBox1 è un array? che il for-in (in qualunque linguaggio) lavora su tutti gli elementi di un array, o di una collezione...
Top
Profilo Invia messaggio privato HomePage
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 19 Dic 2011 15:36    Oggetto: Rispondi citando

No, si tratta del nome della checklistbox, dovevo scrivere forse (non ho con me il pc ora): 'form2.checklistbox1' !?
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 20:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 19 Dic 2011 17:02    Oggetto: Rispondi citando

E definire prima la lista?
Non ricordo se pascal permetteva di definire le liste inline come stai provando tu.
Quindi invece di avere il
Codice:

for lista in (a,b,c)...

definire in qualche modo
Codice:

var lista:=(a,b,c);
for ll in lista...
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10530
Residenza: Tokelau

MessaggioInviato: 19 Dic 2011 17:48    Oggetto: Rispondi citando

un attimo... ho letto meglio... ma non ho capito allora se hai una checklistbox con dentro 10 elementi o se hai 10 checklistbox e in ognuna vuoi rimuovere gli elementi. Confused
Top
Profilo Invia messaggio privato HomePage
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 20 Dic 2011 08:07    Oggetto: Rispondi citando

la seconda
10 checklistbox e a tutte voglio sostanzialmente fare la stessa operazione; rimuovere tutti gli elementi
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10530
Residenza: Tokelau

MessaggioInviato: 20 Dic 2011 09:20    Oggetto: Rispondi citando

allora se non puoi creare liste 'inline' come ti suggeriva freemind, ti conviene creare un array di checklistbox e poi fare un for-in all'interno di un altro for-in... uno per l'array di checklistbox e uno per ogni elemento di ogni checklistbox...
Top
Profilo Invia messaggio privato HomePage
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 20 Dic 2011 15:46    Oggetto: Rispondi citando

grazie per le risposte
ma di cicli for in me ne basta uno solo, cioè quello per selezionare tutte le checklistbox, il comando
Codice:
for i:=form2.checklistobox1.Items.Count-1 downto 0 do lista.Items.delete(i);

fa il suo lavoro egregiamente.

non ho capito bene cosa suggerisce di fare freemind, nel senso ho capito, ma concettualmente cosa cambia da quello che ho scritto se riuso gli stessi tipi?
oltre al fatto che sotto var si definisce il tipo di variabili con il ':' e non ':=', non riesco e definire nemmeno sotto var l'elenco di checklistbox.

edit:
comunque non è che io debba usare per forza il for-in loop
mi basta avere un modo perchè lista, variabile di tipo TCheckListBox, possa passare con un ciclo (o qualcosa di analogo) a CheckListBox1,CheckListBox2,CheckListBox3,CheckListBox4,CheckListBox5,CheckListBox6 e via dicendo visto che devo effetuare su tutti queste CheckListBox la stessa operazione.

edit: temo che quello che voglio fare io non si possa fare e che sia necessario trovare una strada alternativa, scrivendo sotto procedure:
Codice:
type
  chklist = array [1..2] of TCheckListbox;
const
  elenco: chklist=(Form2.CheckListBox1,Form2.CheckListBox2,Form2)

mi da il seguente errore
Codice:
unit2.pas(170,39) Error: typed constants of classes or interfaces are not allowed

e mi sembra intendere che non posso prendere componenti dell'interfaccia grafica...
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10530
Residenza: Tokelau

MessaggioInviato: 20 Dic 2011 16:43    Oggetto: Rispondi citando

Citazione:
mi basta avere un modo perchè lista, variabile di tipo TCheckListBox, possa passare con un ciclo (o qualcosa di analogo) a CheckListBox1,CheckListBox2,CheckListBox3,CheckListBox4,CheckListBox5,CheckListBox6 e via dicendo visto che devo effetuare su tutti queste CheckListBox la stessa operazione.


appunto per questo ti dicevo di avere un array di CheckListBox invece che tanti oggetti distinti...

edit: intendo che così le tue CheckListBox si chiameranno, ad esempio:
myCheckListBox[1]
myCheckListBox[2]
myCheckListBox[3]
myCheckListBox[4]
myCheckListBox[5]
myCheckListBox[6]
non so se mi sto facendo capire...
Top
Profilo Invia messaggio privato HomePage
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 20 Dic 2011 19:08    Oggetto: Rispondi citando

prima in effetti non avevo capito.

Ma quindi per fare l'array come intendi te mi basta cambiare il nome della checklistbox?

Appena ho il computer provo...
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 10530
Residenza: Tokelau

MessaggioInviato: 21 Dic 2011 09:59    Oggetto: Rispondi citando

se le CheckListBox le hai disegnate nel form attraverso il wizard, dovresti poter semplicemente fare copia-incolla, e dovrebbe crearti un array, o chiederti se vuoi creare un array (il VisualBasic 5 faceva così, almeno... poi sono passati troppi anni, non garantisco... Rolling Eyes )
Top
Profilo Invia messaggio privato HomePage
mozart2
Mortale adepto
Mortale adepto


Registrato: 14/12/11 22:45
Messaggi: 30

MessaggioInviato: 21 Dic 2011 23:48    Oggetto: Rispondi

forse sbaglio qualcosa, mi da un'altro tipo di errore

diciamo che al momento ho risolto nel seguente modo (nel caso interessase a qualcuno) con un ciclo for ed un if-else if
faccio
Codice:
for i:=1 to 10 do begin
 if i=1 then lista:=.....
 else if ....
 ...
 else
end;


almeno funziona Wink
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi