Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour,
J'ai une window qui permet de gérer des activités sportives.
Elle contient un DW qui gère l'activité. elle contient des booléens qui permettent de choisir le type d'activité, l'age, l'horaire, le lieu, au total 7 booléens.
En dessous de cette DW j'ai un tab control qui contient autant de tabpages que de booléen à true dans la dw activité.
les tabpage apparaissent en fonction des booléens de la dw activité.
Ensuite je fais en drag and drop à partir des tabpages vers la dw activité.
C'est là que survient le problème.
quelque fois le drag en drop fontionne et tout d'un coup PB plante.
Ce n'est jamais au même endroit. Cela survient quelque soit le nombre de tabpages activées.
Le problème survient aussi chez mon collègue que l'on soit sous source control ou pas.
Le journal des évènements signale une erreur sur MSVCR71.DLL.
Nous travaillons windows XP pro avec PB 11.1 build 8123 et SqlAnywhere 11. Il n'y a pas de conflits de versions des MSVCR71.DLL.
On est sur le problème depuis hier et on ne trouve pas la cause du problème.
Avez-vous une idée?
Merci
Dernière modification par jcc (14-04-2009 08:31:20)
Hors ligne
msvcr71.dll est un module contenant des fonctions de bibliothèque standard de C telles que le printf, memcpy, et cos. C'est une partie de la bibliothèque d'exécution de Microsoft C.
Ton problème fait penser à une mauvaise gestion des CREATE/DESTROY de tes tabpages.
Tu utilises systématiquement la fonction Isvalid dans tes drag'n drop?
Il y a peut-être aussi un problème avec le garbage collector.
Hors ligne
Salut,
En fonction des booléens de la dw_activite, je rend visible ou non les tabpages du tabcontrol.
Donc, si, par exemple, tranche_age est à true dans la dw_activite, le tabpage_age est rendu visible, le settransobject est fait pour la dw_age sur la tabpage_age et je termine par un retrieve si non tabpage_age est rendu invisible.
Pourquoi le isvalid? Est-ce pour savoir si j'ai bien cliqué sur une datawindow, une colonne....? Je ne l'ai pas fait mais je m'applique à cliquer exactement sur la column. Il faut dire que je suis au tout début de la réalisation de la window. les scripts ne sont pas tout à fait finalisés.
garbage collector Quid??
Merci
Hors ligne
Il y a moyen de voir ce que tu as codé dans les événements dragdrop de ta datawindow et de tes tapages? Tu utilises l'option de dragauto?
Le Isvalid permet de tester que ton objet est existant au moment du dragdrop, car tu semble avoir un problème de gestion de tes objets en mémoire. Je pensais que tu créais tes tabpages à la demande.
Hors ligne
Je n'utilise pas le dragauto.
Open event de la window
dw_activite.SetTransObject(sqlca) dw_activite.insertrow(0) dw_activite.object.activite_id[dw_activite.getrow()] = wf_newac() // Visualisation des tabpages if dw_event.object.even_type_activite[dw_event.getrow()] then tab_1.tabpage_ac.visible = true tab_1.tabpage_ac.dw_Ac.SetTransObject(sqlca) tab_1.tabpage_ac.dw_ac.Retrieve() else tab_1.tabpage_ac.visible = false end if if dw_activite.object.age_id[dw_event.getrow()] then tab_1.tabpage_age.visible = true tab_1.Tabpage_age.dw_age.SetTransObject(sqlca) tab_1.tabpage_age.dw_age.Retrieve() else tab_1.tabpage_age.visible = false end if if dw_activite.object.horaire_id[dw_event.getrow()] then tab_1.tabpage_horaire.visible = true tab_1.tabpage_horaire.dw_horaire.SetTransObject(sqlca) tab_1.tabpage_horaire.dw_horaire.Retrieve() else tab_1.tabpage_horaire.visible = false end if if dw_activite.object.tarif_id[dw_event.getrow()] then tab_1.tabpage_tarif.visible = true tab_1.tabpage_tarif.dw_tarif.SetTransObject(sqlca) tab_1.tabpage_tarif.dw_tarif.Retrieve() else tab_1.tabpage_tarif.visible = false end if if dw_activite.object.lieu_id[dw_event.getrow()] then tab_1.tabpage_lieu.visible = true tab_1.tabpage_lieu.dw_lieu.SetTransObject(sqlca) tab_1.tabpage_lieu.dw_lieu.Retrieve() else tab_1.tabpage_lieu.visible = false end if if dw_activite.object.activite_accomp[dw_event.getrow()] then dw_list_ac.visible = true tab_1.tabpage_accomp.visible = true tab_1.tabpage_accomp.dw_accomp.SetTransObject(sqlca) tab_1.tabpage_accomp.dw_accomp.Retrieve() else tab_1.tabpage_accomp.visible = false dw_list_ac.visible = false end if if dw_activite.object.activite_capacite[dw_event.getrow()] then tab_1.tabpage_solde.visible = true tab_1.tabpage_solde.dw_solde.SetTransObject(sqlca) else tab_1.tabpage_solde.visible = false end if
J'ai créé un user event mousemove (pbm_mousemove) sur chaque dw se trouvant sur chaque tab page
If Message.WordParm = 1 Then this.Drag(Begin!) End If
Dans le clicked event de chaque dw source, une variable d'instance
is_col_source = dwo.name
Dans le itemchanged de la dw_activite
choose case this.getcolumnname() case 'activite_age' if this.gettext() = '1' then this.object.age_id.visible = true tab_1.tabpage_age.visible = true tab_1.Tabpage_age.dw_age.SetTransObject(sqlca) tab_1.tabpage_age.dw_age.Retrieve() else tab_1.tabpage_age.visible = false this.object.age_id.visible = false end if case 'activite_horaire' if this.gettext() = '1' then this.object.horaire_id.visible = true tab_1.tabpage_horaire.visible = true tab_1.tabpage_horaire.dw_horaire.SetTransObject(sqlca) tab_1.tabpage_horaire.dw_horaire.Retrieve() else tab_1.tabpage_horaire.visible = false this.object.horaire_id.visible = false end if Case 'activite_tarif' if this.gettext() = '1' then this.object.tarif_id.visible = true tab_1.tabpage_tarif.visible = true tab_1.tabpage_tarif.dw_tarif.SetTransObject(sqlca) tab_1.tabpage_tarif.dw_tarif.Retrieve() else tab_1.tabpage_tarif.visible = false this.object.tarif_id.visible = false end if case 'activite_lieu' if this.gettext() = '1' then this.object.lieu_id.visible = true tab_1.tabpage_lieu.visible = true tab_1.tabpage_lieu.dw_lieu.SetTransObject(sqlca) tab_1.tabpage_lieu.dw_lieu.Retrieve() else tab_1.tabpage_lieu.visible = false this.object.lieu_id.visible = false end if end choose
Dans le DragDrop event de la dw_activite
dwc_ac = source this.setredraw(false) choose case is_col_source case 'activite_lib' This.object.activite_lib_id[row] =dwc_ac.object.activite_lib_id[dwc_ac.getrow()] this.drag(End!) case 'tranche' this.object.age_id[row] = dwc_ac.object.age_id[dwc_ac.getrow()] this.drag(End!) case 'horaire' this.object.horaire_id[row] = dwc_ac.object.horaire_id[dwc_ac.getrow()] this.drag(End!) case 'tarif_libelle' this.object.tarif_id[row] = dwc_ac.object.tarif_id[dwc_ac.getrow()] this.drag(End! case 'lieu_nom' this.object.lieu_id[row] = dwc_ac.object.lieu_id[dwc_ac.getrow()] this.drag(End!) end choose this.setredraw(true)
Message de modération:
Hors ligne
Toujours pas d'avis?
Y-at'il unnombre maximum de dw dans une window?
J'ai changé la window en supprimant de tabcontrol et en simulant celui-ci avec des boutons et des dw que je fais venir en front avec dw_x.show() sur event clicked des boutons. Le problème est le même.
Quand ca à l'air de fonctionner, c'est lorsque l'on ferme la window que ca plante.
On ne voit pas comment on pourrait faire.
Une idée?
Merci
Hors ligne
Bonjour,
Juste une observation en parcourant rapidement ton code, tu ne fais aucun contrôle sur la validité de row et dwc_ac.getrow() dans ton événement dragdrop.
Est-tu sur qu'il appartienne systématiquement à une valeur valide : genre drag en drop sur l'entête de la datawindow et non sur une ligne, dans ce cas row = 0, de même sur la source.
Parce que tu n'utilises pas de SetItem/Getitem pour réaliser ton affectation mais la notation point, et dans le cas d'une affectation erronée, il me semble qu'il n'y a pas de retour d'erreurs (Invalid Row/column ..), voir même un plantage.
Hors ligne
J'ai bien dit dans mes précedents messages que j'étais au début de la réalisation de cette window. Donc tous les tests n'y sont pas.
Dans une version précédente de la window, j'utilisais le setitem pour l'affectation et résultat était le même.
Je sais qu'il n'y pas encore de test sur la validation de la row et de l'endroit où je click, mais même en s'appliquant à clicker à l'endroit voulu. Ca plante.
Dernier test. Si j"ouvre la window et que je click sur un bouton de la dw_activité, donc sans tenter de drag and drop le programme plante.
Si les drag and drop fonctionne; oui, ca arrive; c'est quand je ferme la window que ca plante.
Message d'erreur au plantage sur PB110.exe et pbshr110.dll
Par contre, lors du plantage sur un drag and drop, le message d'erreur porte su PB110.exe et msvcr71.dll.
En remplaçant le tabcontrol par des dws, ca plante encore plus vite. Quelques fois, quelques secondes après avoir ouvert la window et sans avoir fait de manipulations.
Cela arrive aussi bien chez moi que sur le pc de mon collègue.
Hors ligne
J'ai remplacé la dot notation par des setitem.
J'ai mis un drag(End!) à la fin de chaque drag and drop.
J'ai rajouté un test dans le click event sur chaque dw du tabcontrol afin de vérifier si j'ai sur une row valide.
Rien n'a changé, ca plante.
Ce qui est bizarre, c'est que ce n'est jamais au même endroit, ni au même moment.
C'est comme si il n'acceptait pas un nombre trop élevé de dw dans une window.
Comment faire autrement puisque nous avons besoin de ces datawindows pour contruite une activité?
Hors ligne
Tu as regardé pour ta gestion mémoire?
Ouvre le gestionnaire de tâche Windows en regardant l'utilisation mémoire,
ouvre ta fenêtre et regarde comment ça évolue jusqu'au crash.
Ca te donnera une bonne indication pour voir s'il y a des fuites mémoires.
Hors ligne
Bonjour,
Je n'avais pas vu en première lecture dans l'événement dragdrop => this.Drag(End!).
C'est la source a qui l'on doit signifier la fin du drag en drop et non la cible => dwc_ac.Drag(End!).
De plus ce qui me gêne, c'est le Drag(Begin!) sur l'événement pbm_mousemove. Si tu cliques sur plusieurs onglets en passant la souris sur la dw (sans faire réellement de drag en drop), tu as plusieurs datawindows en mode Begin!.
Je pense qu'il vaut mieux faire un drag(End!) entre les changements d'onglets de la datawindow préalablement visualisée.
Hors ligne
Ok, tout cela a été changé sans succés.
Mon collègue est parti sur un autre principe.
Il a gardé les boutons pour simuler le tabcontrol.
Plutôt que de faire un flip flop entre des différentes dws avec dw_xx.show(), il n'y a plus qu'une dw object à laquelle on affecte une dw source avec dw_source.dataobject = "dw_horaire" par exemple.
Là tout fonctionne?
Il semblerait donc que ce soit le nombre trop élevé de dws dans la window qui pose problème. mais je n'en suis pas sûr.
C'est dommage de passer par cette solution plutôt que par le tabcontrol
Hors ligne
Bonjour,
Je pense pas que le nombre élevé de datawindow soit le problème. Je pense plutôt qu'il s'agit d'une anomalie dans le code qui pose problème.
J'ai des fenêtres bien plus complexe que ça dans mon appli avec des datawindows qui récupère plusieurs milliers de lignes avec des drag en drop ....
S'il n'y a rien de confidentiel, je suis curieux de voir ça par moi même. Tu peux m'envoyer le code et la db ?
Je suis également sous PB 11.2.8542 et ASA.
Hors ligne
Problème résolu
J'ai repris l'exemple de PDdemo.
J'ai créé 2 user events à partir du pbm_lbuttondown afin de savoir si j'ai clické ou pas sur le bouton gauche
Dans le mousemove event je détecte le l'object sur lequel je suis par GetObjectAtPointer(). Et je fais Drag(Begin!) si j'ai clické sur le bouton gauche.
Dans le dragdrop, je récupère l'object détecté par le GetObjectAtPointer() dans le mousemove.
Plus de problème.
Merci à tous
A+
Hors ligne
Pages: 1