Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je suis confronté à un petit probleme dans mes dévellopements.
Dans mon code j'ai quelque chose du genre :
// Je suis sur un evenement de ma_fenetre_1 // et ma_structure est une structure globale If this.dw_1.RowCount() > 0 Then ma_structure.une_fenetre = this open(ma_fenetre_2) End If
Je vais dans le code de ma_fenetre_2 et tout d'abord dans l'evenement open (le premier à s'executer) :
// Variable d'instance de la fenetre iw_ma_fenetre = ma_structure.une_fenetre // On va afficher le nombre de ligne présent dans la datawindow de la fenetre récupérée li_nb_row = iw_ma_fenetre.dw_1.RowCount() MassageBox("debug",li_nb_row) // Testé et renvoi bien un chiffre > 0
Ensuite je me place dans un autre évenement nommé ue_init (pour l'instant je ne sais pas trop encore combien d'evenements se placent entre open et ue_init mais je suppose qu'ils ne sont pas très nombreux) :
li_nb_row = iw_ma_fenetre.dw_1.RowCount() MassageBox("debug",li_nb_row) // Testé et renvoi 0
Comment peut on faire perdre les données d'une datawindow?
Est ce que la commande iw_ma_fenetre = ma_structure.une_fenetre crée un pointeur sur l'objet de la structure ou est ce qu'il en crée une copie? J'ai essayé de sauvegarder que la datawindow mais le résultat est le même
Merci pour vos réponses
Dernière modification par Nephtis (26-09-2007 09:40:06)
Hors ligne
MassageBox c'est une fonction supplémentaire dans la version Thaï de PB ?
sinon pour ta question comme ça je vois pas mais faudrait que tu sache ce qui se passe entre tes 2 events...
Dernière modification par rincevent (26-09-2007 09:51:59)
Hors ligne
et depuis l'evenement ue_init, il n'y a rien ?
tu veux dire que l'objet iw_ma_fenetre est à null ? tu peux verifier ?
Hors ligne
rincevent a écrit:
MassageBox c'est une fonction supplémentaire dans la version Thaï de PB ?
sinon pour ta question comme ça je vois pas mais faudrait que tu sache ce qui se passe entre tes 2 events...
Si seulement cette fonction pouvait exister
Je fais souvent cette faute de frappe, un lapsus calami?
pick ouic a écrit:
et depuis l'evenement ue_init, il n'y a rien ?
tu veux dire que l'objet iw_ma_fenetre est à null ? tu peux verifier ?
J'ai rajouté ces deux tests dans l'evenement ue_init mais aucune de ces messagebox n'est apparue
If (isNull(iw_ma_fenetre)) Then MessageBox("debug", "Attention la fenetre est nulle") End If If (isNull(iw_ma_fenetre.dw_1)) Then MessageBox("debug", "Attention la datawindow est nulle") End If
Dernière modification par Nephtis (26-09-2007 10:02:57)
Hors ligne
Attention aux variables globales pour stocker le nom de la fenêtre. Ca empêche de pouvoir gérer plusieures instances de la même fenêtre. C'est dommage. Le code suivant est préférable dans ce cas :
//définir lstr en local If this.dw_1.RowCount() > 0 Then lstr.une_fenetre = this openwithparm(ma_fenetre_2, lstr) End If
Dans la fenêtre ouverte
// Définir istr en instance pour l'utiliser partout dans la fenêtre istr = Message.PowerObjectParm // On va afficher le nombre de ligne présent dans la datawindow de la fenetre récupérée li_nb_row = istr.une_fenetre.dw_1.RowCount()
Sinon il parait qu'il existe un objet n_param qui permet de passer des objets d'une fenêtre à l'autre
http://pbadonf.fr/forum/viewtopic.php?pid=11577#p11577
http://pbadonf.fr/forum/viewtopic.php?pid=11610#p11610
Hors ligne
Chrnico a écrit:
Sinon il parait qu'il existe un objet n_param qui permet de passer des objets d'une fenêtre à l'autre
http://pbadonf.fr/forum/viewtopic.php?pid=11577#p11577
http://pbadonf.fr/forum/viewtopic.php?pid=11610#p11610
cadeau de la maison
Hors ligne
Chrnico a écrit:
Attention aux variables globales pour stocker le nom de la fenêtre. Ca empêche de pouvoir gérer plusieures instances de la même fenêtre. C'est dommage. Le code suivant est préférable dans ce cas :
Code: pb
//définir lstr en local If this.dw_1.RowCount() > 0 Then lstr.une_fenetre = this openwithparm(ma_fenetre_2, lstr) End If
Dans la fenêtre ouverteCode: pb
// Définir istr en instance pour l'utiliser partout dans la fenêtre istr = Message.PowerObjectParm // On va afficher le nombre de ligne présent dans la datawindow de la fenetre récupérée li_nb_row = istr.une_fenetre.dw_1.RowCount()
Sinon il parait qu'il existe un objet n_param qui permet de passer des objets d'une fenêtre à l'autre
http://pbadonf.fr/forum/viewtopic.php?pid=11577#p11577
http://pbadonf.fr/forum/viewtopic.php?pid=11610#p11610
L'application que je fais évoluer est déjà en mode "mono-fenêtre", tous les développements qui ont été apportés dessus ne permettent pas d'instancier deux fois la même fenêtre (c'est pas décrit comme évolution dans le devis donc je vais devoir m'en passer pour le moment)
Je reste toujours avec ce probleme de perte de données et il faut encore que je cheche qui se place entre mes deux évenements (je me pose une énigme pour moi tout seul )
Est ce que quelqu'un aurait une méthode pour savoir dans quels evenement on passe parce que pour le moment en mode debug je repasse 50 fois sur des evenement liés à la construction des objets présents sur cette fenêtre?
Dernière modification par Nephtis (26-09-2007 10:40:29)
Hors ligne
J'ai testé tout les evenements codés de la fenetre et je n'ai que l'evenement resize qui se place entre les deux evenement ci dessus
Je continue en testant les evenements des différents objets placés sur ma fenetre ...
Hors ligne
Nephtis a écrit:
J'ai testé tout les evenements codés de la fenetre et je n'ai que l'evenement resize qui se place entre les deux evenement ci dessus
Je continue en testant les evenements des différents objets placés sur ma fenetre ...
une recherche sur iw_ma_fenetre ne serait pas plus rapide ?
Hors ligne
eRaSorZ a écrit:
Nephtis a écrit:
J'ai testé tout les evenements codés de la fenetre et je n'ai que l'evenement resize qui se place entre les deux evenement ci dessus
Je continue en testant les evenements des différents objets placés sur ma fenetre ...une recherche sur iw_ma_fenetre ne serait pas plus rapide ?
Ca c'est déjà fait et justement y a que dans les evenements open et init qu'ils sont utilisés (c'est pour ça que j'y comprends pas grand chose et que j'essaie de trouver l'endroit où a lieu la perte d'information)
Hors ligne
Et "ma_structure" c'est quoi comme variable ?
Local, instance, shared, global ?
Tu devrais vraiment suivre le conseil de Chrnico et utiliser openwithParm
Hors ligne
shahin a écrit:
Et "ma_structure" c'est quoi comme variable ?
Local, instance, shared, global ?
d'ailleurs c'est pas pour jouer les puristes, mais en principe la portée des variables est donnée par le préfixe ( global : g, instance : i, local : l)...
shahin a écrit:
Tu devrais vraiment suivre le conseil de Chrnico et utiliser openwithParm
Hors ligne
eRaSorZ a écrit:
shahin a écrit:
Et "ma_structure" c'est quoi comme variable ?
Local, instance, shared, global ?d'ailleurs c'est pas pour jouer les puristes, mais en principe la portée des variables est donnée par le préfixe ( global : g, instance : i, local : l)...
shahin a écrit:
Tu devrais vraiment suivre le conseil de Chrnico et utiliser openwithParm
J'ai ecrit un condensé de mes scripts et ai changé le nom des variables pour que ça soit plus lisible et compréhensible. La structure est une structure globale donc accessible dans n'importe quel partie du code. Elle est composée de tableau des différents type de données (String, Integer, Window, ...) et d'autres champs tels que po_caller qui permet de stocker l'objet qui a appelé la fenetre sur laquelle on se trouve.
D'autre part il me serait difficile de justifier devant le client une extension de délai pour le developpement car avant que je ne commence certains développements sur cette pbl celà fonctionnait très bien.
Concernant le titre de la discussion j'ai tenté de déclarer un variable d'instance pour ma_fenetre_2 de type datawindow. Ainsi je suis sur qu'aucun autre bout de code ne vient ecraser ou modifier ma donnée. Cependant elle perd aussi toutes les données qu'elle possédait en arrivant sur l'évenement ue_init.
Est ce que le script suivant
idw_sav_dw = ma_structure.une_fenetre.dw_1
me crée un variable pointant sur ma_structure.une_fenetre.dw_1 ou est ce qu'il crée un copie de ma_structure.une_fenetre.dw_1?
Dernière modification par Nephtis (27-09-2007 08:03:12)
Hors ligne
Nephtis a écrit:
Est ce que le script suivant
Code: pb
idw_sav_dw = ma_structure.une_fenetre.dw_1me crée un variable pointant sur ma_structure.une_fenetre.dw_1 ou est ce qu'il crée un copie de ma_structure.une_fenetre.dw_1?
Ni l'un ni l'autre.
En pb, les objets (à l'exception des structures et des nvo autoinstantiate) se comportent comme des pointeurs.
Donc :
Str_foobar ma_structure
crée une structure
idw_sav_dw = ma_structure.une_fenetre.dw_1
Puisqu'il s'agit d'une dw, donc d'un objet idw_sav_dw et ma_structure.une_fenetre.dw_1 sont la même chose
En relisant ton tout premier message, il apparait que ton pbl se situe entre les evt open et ue_init
->Essaye le débogueur
D'autre part essaye de renommer dw_1 en choississant un nom unique à ton application
Dernière modification par shahin (27-09-2007 08:23:02)
Hors ligne
pour les problemes "non résolus" mais contournés (je suis reparti d'une version un tout petit peu plus ancienne et maintenant ça remarche) est ce qu'il faut mettre un tag spécifique dans le titre de la discussion?
Dernière modification par Nephtis (01-10-2007 14:49:08)
Hors ligne