Quoi, tu ne connais pas PB ? Va falloir parcourir tout le forum alors !

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

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 31-03-2009 11:11:44

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

[RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#2 31-03-2009 11:23:07

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2487
Pépites: 88
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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.


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#3 31-03-2009 12:48:55

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#4 31-03-2009 13:31:03

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2487
Pépites: 88
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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.


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#5 31-03-2009 13:56:42

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

Je n'utilise pas le dragauto.

Open event de la window

Code: pb

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
         
         

Code: pb

If Message.WordParm = 1 Then
               this.Drag(Begin!)
          End If


Dans le clicked event de chaque dw source, une variable d'instance

         

Code: pb

 is_col_source = dwo.name


Dans le itemchanged de la dw_activite

Code: pb

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

Code: pb

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

 

#6 02-04-2009 15:19:05

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#7 02-04-2009 15:45:36

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#8 03-04-2009 08:17:04

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#9 03-04-2009 08:56:02

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#10 03-04-2009 10:21:59

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2487
Pépites: 88
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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.


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#11 03-04-2009 10:51:06

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#12 03-04-2009 13:50:39

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#13 03-04-2009 14:03:58

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

#14 14-04-2009 08:30:52

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] PB crash pendant un drag and drop. erreur sur msvcr71.dll

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

 

Pied de page des forums

Propulsé par FluxBB 1.2.22