Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour
Une astuce PowerBuilder concernant les tableaux et les appels de fonctions.
Il est possible de déclarer un tableau et de l’initialiser :
String ls[] = {'hello', 'la', 'planète'}
Il est également possible de déclarer une fonction ayant un argument de type tableau est de l’appeler comme cela :
F( ls[] )
Le truc, c’est que l’on peut aussi le faire comme ceci :
F({'hello', 'la', 'planète'} )
Encore plus étonnant, on peut aussi appeler une fonction sur les éléments du tableau …
F({Upper('hello'), Lower('la'), 'planète'} )
Intéressant, non ?
A+
Hors ligne
00 pépites,
Tron a écrit:
Encore plus étonnant, on peut aussi appeler une fonction sur les éléments du tableau …
Code: pb
F({Upper('hello'), Lower('la'), 'planète'} )
pas si étonnant que ça quand tu déclares un tableau explicitement (avec {}) la syntaxe est
tableau = { expression1, expression2, .... , expressionN }
où les expressions comportent tout ce qui est autorisé en terme de variables, appels de fonctions, objets... dans la mesure où le type de l'expression est le même que celui du tableau
Hors ligne
Hello,
Un exemple d'application de l'astuce précédente, l'instruction IN que l'on trouve par exemple en SQL : select ... from.... where macolonne in ( 10, 20, 30)
Elle n'existe pas en powerScript (seulement dans les expressions des dw ...)
mais on peut la remplacer par une fonction globale f_In et écrire quelque chose comme ça :
if f_IN( ls, {'aaaaa', 'bbb', lower('Cc'), "D"} ) then
au lieu de :
if ls = 'aaaaa' OR ls = 'bbb', OR ls = lower('Cc') or ls = "D"
La fonction f_in (any aa_valeur, any aa_liste_argument[]) est très simple elle retourne TRUE si une valeur aa_valeur existe dans le tableau aa_liste_argument[]...
A+
Hors ligne
000 pépites
et le code de la fonction f_IN pour la route ?
Hors ligne
Quelque chose comme ceci...
boolean lb = false long ll = 1 long ll_nb ll_nb = upperBound( aa_liste_argument ) do while ll <= ll_nb and not lb if aa_valeur = aa_liste_argument[ll] then lb = true else ll ++ loop return lb
A+
Dernière modification par Tron (03-11-2007 21:49:23)
Hors ligne
return lb
Hors ligne
ErAsORz a écrit:
return lb
et à Tron pour son astuce
Hors ligne
c'est mieux
Hors ligne
Hello
Une autre utilisation de cette astuce avec la fonction système OpenWithParm.
Cette fonction permet d’ouvrir une fenêtre en passant un et un seul paramètre.
Malheureusement, la plupart du temps on a plusieurs paramètres à passer …
La 1° idée c’est de passer un tableau et d’écrire quelque chose comme ceci:
openWithParm(w_1, {1,2,3}) , mais cela ne marche pas car le compilateur refuse les tableaux comme paramètres...
La 2° idée consiste à créer une fonction pour écrire qlq chose comme :
openWithParm(w_1, f_sets({1,2,3})). La fonction prend prend un argument de type tableau d'any et le mémorise qlq part...
A l’ouverture de la fenêtre, on récupère les paramètres en passant par une fonction f_get( indice ) qui lie le i° indice du tableau ou l’on a mémorisé les paramètres…
Le problème c’est qu’il faut que les paramètres soient du même type car la syntaxe suivante est refusée par le compilateur.
openWithParm(w_1, f_sets({1, ‘coucou’, now()}))
La 3° idée consiste alors à utiliser une autre fonction f_set( parametre ) qui va mémoriser la valeur passer en paramètre, qui retourne un type accepté par le compilateur et qui permet d’écrire qlq chose comme ceci :
openWithParm(w_1, f_sets({1,f_set( ‘coucou’) ,3})). Le type any n’étant pas typé le compilateur accepte cette syntaxe.!
Pour que cela soit un peu plus propre, on met toutes ces fonctions dans la classe système Message et on obtient :
openWitnParm ( w_1, message.uf_sets( { ‘Bonne année, message.uf_set( 2008 ) } )
dans w_1
messageBox(message.uf_get(1), message.uf_get(2) )
A+
Hors ligne