Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour
Pour faire simple
J'ai une fenêtre, appelé w_liste, avec un Tabpage de 3 onglets. Le tabpage principal est appelé <tab_main>
<tab_main> est hérité d'un user object ancetre appelé <tab_anc>
Ce <tab_anc> est composé de 3 tabpages dont <tab_action>.
<tab_action> est hérité d'un user object ancêtre appelé <u_tabp_act> qui contient la dw liste
C'est donc sur cet objet <u_tabp_act> que se fait le retrieve de ma liste et que je gére le double clic
Lorsque je double clique sur une ligne sur l'onglet Tab1 de la fenêtre , un écran détail w_detail s'ouvre avec les données correspondantes à la ligne
Il n'y a pas de retrieve sur w_detail, surement un sharedata enfoui dans les pfc ou ancetres mais vu la complexité des pfc et de l'empilement je ne l'ai pas cherché
Les 2 dw de w_liste et w_detail ont le même Select (mais pas le même where)
J'ai une variable de type date, appelé v_dt1, que j'ai déclaré sur <u_tabp_act>.
Elle est initialisée lors du double clic
je voudrai récupérer dans une variable de la fenêtre w_detail la valeur de la variable déclarée et initialisée dans la fenêtre w_liste
J'ai essayé de créer une instance de la fenêtre w_liste et de récupérer la variable v_dt1 mais cela ne donne rien
w_liste w_t1 IF not isvalid(w_lt1) THEN w_t1 = create w_liste END IF v_dt1= w_t1.tab_main.tab_action.v_dt1
J'ai essayé d'appeler directement la fenêtre mais ca provoque une erreur Null object
v_dt1= w_liste.tab_main.tab_action.v_dt1
vu que la dw est sur u_tabp_act je dois declarer la variable et l'initialiser dans cet objet.
Et comme tab_main n'est pas hérité uniquement de u_tabp_act (mais contient l'heritage de tab_action) je ne peux pas faire appel à la variable
je ne veux pas modifier les ancêtres ou les pfc alors je sais plus comment faire
qu'est ce qui manque ou que dois je rajouter
je pourrai déclarer la variable en global mais je préfererai une solution plus rigoureuse
merci pour votre aide
Hors ligne
L'ouverture de ta w_detail se passe par un open simple?
Si c'est le cas, il suffit pour moi de faire un openwithparm à la place et de balancer ta variable à la w_detail.
Pour ça tu cast la date en format string car seul les types String, Numeric et PowerObject sont admis en tant que type des paramètre.
Dernière modification par Van (05-03-2014 10:17:14)
Hors ligne
Merci mais le open de la fenêtre est fait dans l'ancêtre que je ne veux pas modifier et je crois qu'il utilise déjà un openwithparm et envoie un tableau de data que je ne contrôle pas et que je ne veux pas modifier c'est trop sensible
Ma question en plus simple est :
comment récuperer la valeur d'une variable qui n'est pas déclarée dans un objet appelant mais dans un objet ancêtre d'un des composants de cette fenêtre appelante ????
Hors ligne
Si éventuellement tu est en fenêtre child ou pop-up pour ta w_detail et que lors de l'openwithparm le parent a été déclaré comme étant ta fenêtre w_liste,
une variable public d'instance à w_liste te permettrait un accès à la donné de cette façon dans l'event open de ta w_detail.
w_liste w_parent date d_parametreDate w_parent = this.getparent() d_parametreDate = w_parent.id_dateParametre
Dernière modification par Van (05-03-2014 10:27:50)
Hors ligne
Mais la variable n'est pas déclarée dans w_liste mais dans un ancêtre d'un de ses composants
La fenetre w_liste a un de ses objets qui est un user object tab. Ce tab est composé de 3 user objects tabpage
Et la variable est déclarée dans l'ancêtre d'un des 3 tabpages. J'ai déclaré ma variable sur le user object qui gére le retrieve de la liste de cet onglet
Il faudrait déjà que j'arrive à récupérer sur w_liste la valeur de cette variable
Dernière modification par remypb (07-03-2014 09:37:40)
Hors ligne
w_page.le_tab.le_tabpage.la_variable ?
Hors ligne
j'ai vérifié c'est bien un openwithparm qui ouvre ma fenetre detail
mais quand je veux récupérer ma variable qui est dans l'ancêtre du tabpage (code ci dessous)
// Declaration en instance de la fenetre liste appelante w_form_action w_parent // event OPEN w_parent = this.getparent() idt_create_test = w_parent.tab_main.tabpg_conditionaction.idt_create_c1 // tab_main = objet onglet principal // tabpg_conditionaction = onglet sur lequel est fait le double clic // idt_create_c1 = variable date déclarée en public sur le user object de la dw et du double clic
j'ai le msg d'erreur : Null Object reference ..... sur la ligne idt_create_test =
faut il déclarer une instance de la fenêtre parent ?
j'aurai une solution en déclarant ma variable date en global sur l'appli mais c'est pas très clean
Dernière modification par remypb (07-03-2014 11:22:08)
Hors ligne
tabpg_conditionaction est du type de ton user object ? ou alors le user object est déposé dans tabpg_conditionaction ?
Hors ligne
Ce ne serait pas this.parentwindow dont tu aurais besoin ? Parce que this.getparent() c'est plutôt pour récupérer des contrôles parent, pas une fenêtre. (j'ai lu le fil très en diagonale... )
Hors ligne
erasorz : tabpg_conditionaction est un user object hérité d'un autre user object ce dernier contient la dw sur lequel je gere le double clic
j'ai résolu mon probleme en faisant 2 choses
- ajouter une variable date a l'objet passé en paramètre dans le openwithparm (dans l'ancetre de la dw liste)
- affecter cette variable date avec la valeur de la date recuperée dans le doubleclic de ma dw
- recup dans la fenetre detail de cette variable dans une variable d'instance
je suis interessé a avoir vos avis et vos autres solutions
merci en tt cas de votre solidarité
Hors ligne
Salut,
Celà me parait être la meilleure solution. J'aurais quand même cherché si dans l'objet passé en paramètre il n'existe pas déjà ( soit un tableau, soit une structure ...) une variable qui pouvait prendre ma date. ( Celà doit également te permettre de prendre en main le framework avec lequel tu travaille )
Toutes les autre solutions que tu as tenté d'utiliser me semblent trop être liées à l'objet sur lequel tu doubleclique. ( Sachant que pour certaines elles étaient vouées à l'échec )
remyPB a écrit:
exemple Code:
w_liste w_t1
IF not isvalid(w_lt1) THEN
w_t1 = create w_liste
END IF
v_dt1= w_t1.tab_main.tab_action.v_dt1
Tu créé une variable de type fenêtre et tu lui affecte une variable de type date. Je ne vois pas comment celà peut fonctionner.
remyPB a écrit:
Code:
v_dt1= w_liste.tab_main.tab_action.v_dt1
Ce que tu as essayé c'est visiblement d'utiliser une variable globale qui porterait le nom w_liste et qui contiendrait le pointeur sur ta fenêtre liste.
C'est ce que fait Powerbuilder si tu utilise la syntaxe suivante pour l'open exemple : Open( w_liste ). Dans ce cas PB déclare une variable globale qui s'appelle w_liste et qui est valide tant que la fenêtre est ouverte
L'open de ta fenêtre liste doit être effectué à l'aide d'une variable locale ( voir d'instance pour effectuer son ouverture). Dans ce cas il n'existe pas de variable w_liste exemple
w_liste lw_temp
open(lw_temp )
Dans ce cas la variable w_liste n'existe pas et le pointeur est contenu dans lw_temp. Cette syntaxe permet la multiInstanciation des objets.
Cdt
Yanis
Hors ligne
Hors ligne