Le forum (ô combien francophone) des utilisateurs de Powerbuilder.





Bonjour,
Voici une brève description de mon contexte :
1) J'ai une fenêtre modale (w_response_new_account). Cette fenêtre est utilisée pour saisir des données et ajouter un utilisateur dans la base de données.
2) Lorsque l'on valide l'ajout, des traitements de contrôle sont effectués. On fait alors appel à un user object (uo_data_new_account) commun à plusieurs fenêtres (ajout, modification, suppression d'un utilisateur). Ce dernier va alors afficher une autre fenêtre modale (w_response_similar_accounts) elle aussi héritée de l'ancêtre basique (w_base_response_button).
3) Ma seconde fenêtre modale s'affiche et recherche en base de données si il existe des utilisateurs similaires à celui saisi dans la fenêtre d'ajout en 1).
Le but c'est d'éviter des créer plusieurs fois le même utilisateur.
Problème :
Lorsque je ferme ma seconde fenêtre modale (clic sur OK ou sur CANCEL), je dois retourner une valeur à ma première fenêtre (w_response_new_account). Celle-ci attend de savoir si l'on poursuit l'ajout de l'utilisateur ou non. La fonction utilisée dans mon user object retourne un entier à la première fenêtre modale : ça c'est bon. Il me faut donc retourner ma valeur depuis ma seconde fenêtre modale (w_response_similar_accounts) au user object qui l'a appelée (uo_data_new_account). Et là j'ai plus de difficultés.
Auriez-vous des suggestions à me faire ?
Merci pour votre aide.
Dernière modification par Nyphel (10-06-2008 11:10:10)
Hors ligne














Bonjour, lors de l'ouverture de w_response_similar_accounts, tu peux faire passer uo_data_new_account et le récupérer avec Message.PowerObjectParm
Hors ligne





Bonjour et merci pour le conseil.
Plutôt que de passer l'user object complet, j'ai simplement passé une structure avec les quelques données qui m'intéressent.
Je m'y prend comme suit :
// Open the sheet that will display accounts list str_account lstr_account lstr_account.window = calling_window lstr_account.name = ls_account_owner_name lstr_account.address2 = ls_account_owner_address lstr_account.post_code = ls_account_owner_postalcode lstr_account.double_address_warrning_flag = -1 w_response_similar_accounts lw_response_similar_accounts OpenWithParm(lw_response_similar_accounts, lstr_account, calling_window) messagebox('Code retour', string(lstr_account.double_address_warrning_flag))
Dans fenêtre, je déclare ma structure en variable globale :
str_account istr_account
Dans mon open() event, je récupère les données passées en paramètre :
istr_account = Message.PowerObjectParm
string ls_account_owner_name, ls_account_owner_address, ls_account_owner_postalcode
ls_account_owner_name = istr_account.name
ls_account_owner_address = istr_account.address2
ls_account_owner_postalcode = istr_account.post_code
Et ensuite je cherche à retourner le code retour en fonction que l'on clic sur OK ou CANCEL.
Si on clic sur CANCEL je ne fais rien (car l'ancêtre a déjà défini un close(this) sur l'appel de ue_cancel())
Si on clic sur OK, je change la valeur retour. Voici donc mon ue_ok() event :
istr_account.double_address_warrning_flag = 1 close(this)
Ma valeur retour reste à -1, que je clic sur OK ou sur CANCEL.
C'est surement un problème tout bête, mais débutant en powerbuilder j'avoue que ça me bloque.
J'ai tenté de passer ma structure par référence, mais cela ne change rien :
OpenWithParm(lw_response_similar_accounts, ref lstr_account, calling_window)
Hors ligne














Si tu passais un nvo, c'est la référence qui aurait été passée, donc en gros l'objet lui-même...
Avec une structure, tu ne passes que la valeur, donc impossible à récupérer ensuite, sauf en utilisant un CloseWithReturn :
CloseWithReturn(This, istr_account)
et ensuite récupérer la structure :
OpenWithParm(lw_response_similar_accounts, lstr_account, calling_window) lstr_account_new = Message.PowerObjectParm
Hors ligne





Merci pour votre aide, je comprends mieux maintenant !
Here is my final code :
// Open the window that will display accounts list str_account lstr_account lstr_account.window = calling_window lstr_account.name = ls_account_owner_name lstr_account.address2 = ls_account_owner_address lstr_account.post_code = ls_account_owner_postalcode lstr_account.double_address_warrning_flag = -1 w_response_similar_accounts lw_response_similar_accounts OpenWithParm(lw_response_similar_accounts, ref lstr_account, calling_window) // Check user response IF IsValid(Message.PowerObjectParm) and NOT IsNull(Message.PowerObjectParm) THEN lstr_account = Message.PowerObjectParm IF lstr_account.double_address_warrning_flag = 1 THEN // User clic OK and accepts the warning return guo_cst.ii_ReturnOK ELSE // Should not happen return guo_cst.ii_ReturnKO END IF ELSE // User clic CANCEL button, no param returned (cause of inheritance, ue_cancel returns directly) return guo_cst.ii_ReturnKO END IF
Dernière modification par Nyphel (10-06-2008 11:10:35)
Hors ligne
Nyphel a écrit:
Merci pour votre aide, je comprends mieux maintenant !
Here is my final code :Code: pb
// Open the window that will display accounts list str_account lstr_account lstr_account.window = calling_window lstr_account.name = ls_account_owner_name lstr_account.address2 = ls_account_owner_address lstr_account.post_code = ls_account_owner_postalcode lstr_account.double_address_warrning_flag = -1 w_response_similar_accounts lw_response_similar_accounts OpenWithParm(lw_response_similar_accounts, ref lstr_account, calling_window) // Check user response IF IsValid(Message.PowerObjectParm) and NOT IsNull(Message.PowerObjectParm) THEN lstr_account = Message.PowerObjectParm IF lstr_account.double_address_warrning_flag = 1 THEN // User clic OK and accepts the warning return guo_cst.ii_ReturnOK ELSE // Should not happen return guo_cst.ii_ReturnKO END IF ELSE // User clic CANCEL button, no param returned (cause of inheritance, ue_cancel returns directly) return guo_cst.ii_ReturnKO END IF
Pas très programmation objet tout ca, une déclation de routines publiques pour le passage de paramètres auraient été plus adéquat, voir la discussion à ce sujet dans la rubrique "Articles généraux", topic "Programmation objet avec PB".
Hors ligne





J'ai trouvé le sujet très intéressant, mais en tant que débutant Pb avec des délais restreints, je vais d'abord essayer de faire ce que l'on attend de moi (à savoir du code homogène avec ce qui a été fait) et consolider les bases, avant de chercher à m'améliorer. J'avoue qu'un exemple complet et fonctionnel, avec les getter/setter, m'aurait bien intéressé... Je débute non seulement en Pb, mais aussi en tant que développeur. Je ne suis pas encore bien rodé sur les classes abstraites, plus encore sous Pb ;-)
Hors ligne