Precedente :: Successivo |
Autore |
Messaggio |
mozart2 Mortale adepto
Registrato: 14/12/11 22:45 Messaggi: 30
|
Inviato: 17 Dic 2011 10:58 Oggetto: [pascal] cicli for in |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 19 Dic 2011 09:53 Oggetto: |
|
|
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 |
|
|
mozart2 Mortale adepto
Registrato: 14/12/11 22:45 Messaggi: 30
|
Inviato: 19 Dic 2011 15:36 Oggetto: |
|
|
No, si tratta del nome della checklistbox, dovevo scrivere forse (non ho con me il pc ora): 'form2.checklistbox1' !? |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 19 Dic 2011 17:02 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 19 Dic 2011 17:48 Oggetto: |
|
|
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. |
|
Top |
|
|
mozart2 Mortale adepto
Registrato: 14/12/11 22:45 Messaggi: 30
|
Inviato: 20 Dic 2011 08:07 Oggetto: |
|
|
la seconda
10 checklistbox e a tutte voglio sostanzialmente fare la stessa operazione; rimuovere tutti gli elementi |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 20 Dic 2011 09:20 Oggetto: |
|
|
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 |
|
|
mozart2 Mortale adepto
Registrato: 14/12/11 22:45 Messaggi: 30
|
Inviato: 20 Dic 2011 15:46 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 20 Dic 2011 16:43 Oggetto: |
|
|
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 |
|
|
mozart2 Mortale adepto
Registrato: 14/12/11 22:45 Messaggi: 30
|
Inviato: 20 Dic 2011 19:08 Oggetto: |
|
|
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 |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11559 Residenza: Tokelau
|
Inviato: 21 Dic 2011 09:59 Oggetto: |
|
|
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... ) |
|
Top |
|
|
mozart2 Mortale adepto
Registrato: 14/12/11 22:45 Messaggi: 30
|
Inviato: 21 Dic 2011 23:48 Oggetto: |
|
|
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 |
|
Top |
|
|
|