Affichage Résultat C_OBJET

Pour découvrir la notion “Collection” et “C_OBJET” Je fais studieusement les exemples proposés ds la doc.
Question : comment vérifier le résultat (affichage) de façon simple : par ALERTE ? autre ?
ALERTE(“aaa = $Employés{1}” ) ne fonctionne pas
ALERTE("aaa = $Employés{$Employees}) ne fonctionne pas
???

TABLEAU TEXTE($tabText;2)
$tabText{1}:=“Smith”
$tabText{2}:=“White”
C_OBJET($Employees)
OB FIXER TABLEAU($Employees;“Employés”;$tabText)
AJOUTER A TABLEAU($tabText;“Brown”) //Ajout dans le tableau 4D
// $Employees = {“Employés”:[“Smith”,“White”]}
OB FIXER TABLEAU($Employees;“Employés”;$tabText)
// $Employees = {“Employés”:[“Smith”,“White”,“Brown”]}

Product :4D - 4D Server
OS : Mac OS X>
4D : v18

Dans le débogueur, zone de code, tu sélectionnes ton objet (ou ta collection) ; tu frappes cmde+d ; l’objet (ou collection) est alors affiché(e) dans la zone expression où tu peux le (la) dépiauter à l’envie. Ça me fatigue, l’écriture inclusive.

PS
je ne sais pas quel est le but de l’exemple que tu cites…Si c’est pour montrer les “commandes passerelles” entre tableaux et collections, il est parfait ; si c’est pour construire une collection de libellé, on ferait plutôt ça :
<code 4D>
$Employees.Employés:=Creer collection
$Employees.Employés.push(“Smith”)
$Employees.Employés.push(“White”) //d’habitude c’est Wesson ; c’est quoi cet exemple ?
</code 4D>
ou ça :
<code 4D>
$lesLibelles:=“Smith,White”
$Employees.Employés:=Separer chaine($lesLibelles;",")
</code 4D>

Je prends les exemples de la doc qui traite de la “notation objet” ou de la commande “OB lire Tableau” ou “Creer objet” et je triture ces exemples pour les mettre à ma sauce en essayant de les modifier voire de les compliquer. Je souhaite avoir le résultat…Tu m’as donné la solution : le débogueur. Parfait.
Je vais maintenant essayer de mixer “collections et tableaux” pour remplir une LB plus élégamment qu’avec une moulinette “Boucle” Pas évident car chaque ligne de code pose une interrogation…c’est le début. Merci pour ton aide passé et futur ?

Peux-tu vérifier la syntaxe de :
$lesLibelles:=“Smith,White”

<code 4D>
$lesLibelles:=“Smith,White”

C_OBJECT($Employees)
$Employees:=New object()
$Employees.Employes:=split string($lesLibelles;",")
</code 4D>

Evitons les accents

plus simple (ça dépend du nombre de ligne) :
<code 4D>
$Employees:=New collection(“Smith”;“Wesson”)

</code 4D>
ou
<code 4D>
$Employees:=New collection(“Smith”;
“Wesson”;
“Martin”;
…)
</code 4D>
Les tableaux sont à éviter dans le nouveau monde ; utilises les collections autant que possible.
On est obligé d’utiliser des tableaux quand une commande de 4D l’exige.
Il me reste des OB GET ARRAY dans des méthodes d’avant les collections (ou ma connaissance de) mais je ne vois pas de raison de l’utiliser.

Ce qui manque dans la doc de 4D, ce sont des conseils de meilleures pratiques qui te donneraient ce genre de conseil.
Il y a de nombreux cas où on peut obtenir un résultat par plusieurs méthodes différentes.
Des antiquités comme Before, After existent encore alors qu’elles sont obsolètes depuis des décennies ; dans ce cas précis, le commentaire est clair mais ce n’est pas le cas partout.

: Bernard ESCAICH

Les tableaux sont à éviter dans le nouveau monde ; utilises les
collections autant que possible.
ça dépend…
s’il faut par exemple chercher “intensivement” dans une liste de valeurs scalaires, chercher dans tableau ou chercher dans tableau trié restent très efficaces.

Merci pour ce précieux conseil : abandonner les anciennes pratiques.
Mais, il me manque les modalités d’applications entre la new notion et sa mise en place.
Exemple : comment remplir une LB à l’aide d’une collection sans passer par un tableau ?

: Jerome YZEBE

Merci pour ce précieux conseil : abandonner les anciennes pratiques.

Heu, non. Abandonner les pratiques obsolètes.

Méfiance Bernard, je pense que vous n’avez pas encore évalué les limites (actuelles ?) des collections sur les tableaux scalaires. Dès, qu’on a besoin de gérer des ordres (tri) ou de gérer des suppressions précises de la part de l’utilisateur, etc. Les collections pour l’instant sont moins performantes, voir incapables de le faire correctement. Et je ne parle pas de la gestion des widgets d’interface qui ne gèrent pas actuellement les collections, etc.

Bref, utiliser des collections c’est grisant, jouissif, mais on atteint encore trop rapidement les limites…

: Arnaud DE MONTARD

ça dépend…
s’il faut par exemple chercher “intensivement” dans une liste de
valeurs scalaires, chercher dans tableau ou chercher dans tableau
trié restent très efficaces.

C’est marrant, on évoque souvent des problèmes de performance ; ça fait des années que je n’en ai pas rencontré, bien que travaillant en interprété.
Je pense qu’il doit y en avoir réellement mais qu’ils sont assez localisés ; hormis ces cas à traiter, je suis partisan de chercher à avoir un code lisible, maintenable, évolutif… en privilégiant les technos ORDA, objet,…

Il reste des cas où on est obligé de garder les anciennes technos ou d’utiliser une solution mixte ; par exemple pour obtenir la liste des champs d’une table, on utilise ORDA + tableaux :
OB GET PROPERTY NAMES(ds;$dataclasses_ta)

Combien de lignes de code avec les commandes du thème Définition structure ?

: Jerome YZEBE

comment remplir une LB à l’aide d’une collection sans passer par un
tableau ?
Réponse au tout début de cette https://docs.4d.com/4Dv18/4D/18/Proprietes-specifiques-des-List-box.300-4575642.fe.htmlpage>

Bonjour,

: Bernard ESCAICH

Il reste des cas où on est obligé de garder les anciennes technos ou
d’utiliser une solution mixte ; par exemple pour obtenir la liste des
champs d’une table, on utilise ORDA + tableaux :
OB GET PROPERTY NAMES(ds;$dataclasses_ta)

Non ce n’est pas une ancienne techno d’utiliser OB GET PROPERTY NAMES !
D’ailleurs de nouvelles commandes vont arriver dans le thème OB GET …
J’avais bien expliqué lors du Summit 2018 qu’il ne faut surtout pas jeter aux orties les tableaux et savoir quand les utiliser, et quand utiliser les collections. L’un ne remplace pas l’autre et vice-versa !
Le développeur soucieux des performances choisira l’un ou l’autre des concepts en fonction du besoin. Un tableau de booléens sera toujours plus performant qu’une collection de booléens !

Cordialement,

: Jerome YZEBE

Exemple : comment remplir une LB à l’aide d’une collection sans
passer par un tableau ?

Dans la demo que j’ai posté:

Méthode “populate_clock” ça le fait à la ligne 82

Dans l’objet Form on insert une collection avec une proriété “clock”. (form.clock)

Après tu regardes le formulaire “demo” tu cliques sur la listbox et tu regardes l’explorateur des propriétés : tu retrouves Form.clock qui correspond à notre listbox collection

Oui, des fois on tombe dans l’excès de zèle en voulant être “moderne” à tout prix. Je me suis par exemple bêtement gratté l’occiput à chercher un équivalent “à point” à OB REMOVE. De même j’ai lu des fils où on se demande comment gérer un indice dans un “For each”, en oubliant le bon vieux “For” tout court.

D’un autre coté, ça devrait te plaire, l’excès de zèle c’est mieux que pas de zèle du tout :wink: