|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#76 |
|
Messages: n/a
Hébergeur: |
Pierre Y. a pensé très fort :
> Pierre Y. avait prétendu : >> Flo a formulé ce lundi : >>> Pierre Y. a écrit : >>>> Patrons = générateurs de code ? >>> >>> oui cf rev 2192 (et les quelques fix suivants). >>> J'ai modifié JPP pour qu'il expande les macros contenant les différents >>> containers, j'en profite pour ajouter d'autres fonctionnalités comme la >>> vérification des doublons, la sensibilité à la casse... >> >> Il semblerait que ça bugge (j'ai le pb), quand on demande un itérateur sur >> une collection IJclIntfList, il ne parcoure pas le dernier élement : >> >> var >> ItF: IJclIntfIterator; >> begin >> // ... >> ItF := UneCollection.First; >> >> while ItF.HasNext do >> begin >> with IMonInterface(ItF.GetObject) do >> begin >> // Do Something >> end; >> ItF.Next; >> end; >> end; > > Semblerait que ce soit pas ça le pb. Je continue à chercher... :-? Semblerait que ce soit ça, je suis un neuneu de l'algo de parcours d'une liste avec un itérateur ;-) Ce que ne m'explique pas c'est que ma bouse fonctionnait avant... J'ai réécrit le truc comme ça : ItF := UneCollection.First; if ItF.HasNext then begin repeat with IMonInterface(ItF.Next) do begin // Do Something end; until (not ItF.HasNext); end; Y'a mieux ? Plus "propre" par rapport à la manière dont fonctionnent les composants de JclContainer ? -- Pierre Y. |
|
|
|
#77 |
|
Messages: n/a
Hébergeur: |
L'utilisation de GetObject est généralement source de problème.
Le fonctionnement interne des itérateurs implique que Next doit être appelé le premier dans la boucle afin d'initialiser la valeur courante, GetObject permet de récupérer le dernier objet retourné par Next ou Previous. while ItF.HasNext do begin with IMonInterface(ItF.Next) do begin // Do Something end; end; ou alors: while ItF.HasNext do begin MyRef := ItF.Next; // Do Something MyRef := Itf.GetObject; // same object end; D'après les différentes recherches que j'ai fait sur le net, cela semble être le comportement "standard" d'un itérateur. Par contre pour des raisons de compatibilité ascendante, l'implémentation est souple et ne génère pas d'erreur dans ton cas. Crois-tu qu'elle devrait? |
|
|
|
#78 |
|
Messages: n/a
Hébergeur: |
Pierre Y. a écrit :
> Semblerait que ce soit ça, je suis un neuneu de l'algo de parcours d'une > liste avec un itérateur ;-) Ce que ne m'explique pas c'est que ma bouse > fonctionnait avant... > > J'ai réécrit le truc comme ça : > > ItF := UneCollection.First; > > if ItF.HasNext then > begin > repeat > with IMonInterface(ItF.Next) do > begin > // Do Something > end; > until (not ItF.HasNext); > end; > > Y'a mieux ? Plus "propre" par rapport à la manière dont fonctionnent les > composants de JclContainer ? presque mieux, ton algo est identique à: while ItF.HasNext do begin with IMonInterface(ItF.Next) do begin // Do Something end; end; regarde aussi mon message précédent |
|
|
|
#79 |
|
Messages: n/a
Hébergeur: |
Flo vient de nous annoncer :
> Pierre Y. a écrit : >> Semblerait que ce soit ça, je suis un neuneu de l'algo de parcours d'une >> liste avec un itérateur ;-) Ce que ne m'explique pas c'est que ma bouse >> fonctionnait avant... >> >> J'ai réécrit le truc comme ça : >> >> ItF := UneCollection.First; >> >> if ItF.HasNext then >> begin >> repeat >> with IMonInterface(ItF.Next) do >> begin >> // Do Something >> end; >> until (not ItF.HasNext); >> end; >> >> Y'a mieux ? Plus "propre" par rapport à la manière dont fonctionnent les >> composants de JclContainer ? > > presque mieux, ton algo est identique à: > > while ItF.HasNext do > begin > with IMonInterface(ItF.Next) do > begin > // Do Something > end; > end; > > regarde aussi mon message précédent Parfait, en fait, je les avais déjà modifiés un peu partout sauf dans deux procédures et là ça m'a pété au nez. Merci Jcl de me faire programmer correctement ;-) -- Pierre Y. |
|
|
|
#80 |
|
Messages: n/a
Hébergeur: |
Pierre Y. a écrit :
> Parfait, en fait, je les avais déjà modifiés un peu partout sauf dans > deux procédures et là ça m'a pété au nez. Crois-tu qu'un pétage plus violent (du genre une exception si GetObject, Remove ou Insert est appelé avant le premier Next ou Previous) serait efficace? |
|
|
|
#81 |
|
Messages: n/a
Hébergeur: |
Flo a formulé la demande :
> Pierre Y. a écrit : >> Parfait, en fait, je les avais déjà modifiés un peu partout sauf dans deux >> procédures et là ça m'a pété au nez. > > Crois-tu qu'un pétage plus violent (du genre une exception si GetObject, > Remove ou Insert est appelé avant le premier Next ou Previous) serait > efficace? Voire enlever GetObject ou le marquer deprecated. De toutes manières ça ne peut qu'être positif d'inciter les développeurs à utiliser correctement ces objets. -- Pierre Y. |
|
![]() |
| Outils de la discussion | |
|
|