Comportements différents entre form et class

Résolu
mike_vk Messages postés 30 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 13 septembre 2013 - 10 mai 2010 à 15:00
mike_vk Messages postés 30 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 13 septembre 2013 - 24 mai 2010 à 19:01
Bonjour,

J'avais l'habitude de créer mes formulaires foxpro en faisant un simple *.scx, que j'appelais via des DO FORM.
Récemment, j'ai commencé à créer des classes pour mes forms, et je les instancie via:

oForm = CEATEOBJECT(..)
oForm.Show()

Ce matin, un comportement étrange m'est apparu: j'ai créé un grid dans la classe de ma form, paramétré les colonnes tel que la première comporte un checkbox et un header avec un Caption vide. Les autres colonnes importent peu.

Le problème est apparu en alimentant mon grid "at run time" via:

thisform.grid1.recordsourcetype = 1
thisform.grid1.recordsource = "moncurseur"

Cette dernière ligne assigne tout à coup au Caption vides des header du grid, le nom du champ correspondant du curseur! Je me suis creusé la tête pour savoir d'où ça venait, en vérfiant mes propriétés etc... Rien à faire. J'ai alors refait un simple scx avec un tout simple grid et un bouton pour le remplir, et là pas de problème. Le Caption reste vide. En sauvegardant cette même form comme classe (File > Save as class...), le problème apparaît !
Je sais, il suffit de rechanger le Caption après modification du recordsource, mais bon... Je voudrais savoir d'où vient cette différence de comportement ! Quelqu'un a-t-il une idée ?

Merci d'avance!
Michael.

6 réponses

michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
23 mai 2010 à 17:29
Bonjour,

dès que tu modifies le recordsource d'un grid au runtime, tu peux t'attendre .... à de l'inattendu .

est-ce que les colonnes et les headers de cette classe de grid sont issus de classes que tu as toi-même créées, ou bien utilises-tu les classes de vfp par défaut pour ces objets contenus? Dès que tu crées une classe de grid, tu as tout intéret à créer également tes classes de colonnes et de header, sinon tu vas sans arrêt être embêté par ce type de problème.
3
mike_vk Messages postés 30 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 13 septembre 2013
24 mai 2010 à 16:03
Bonjour,

Merci pour ta réponse. Il m'est effectivement arrivé régulièrement de me dire "Mais !?" en changeant le recordsource au runtime. Le plus flagrant est la perte des tailles de colonnes. La solution que j'ai trouvée et qui fonctionne très bien (pour l'instant en tous cas) est d'assigner d'abord le recordsource à SPACE(0), et ensuite de le réattribuer.

Ici j'ai résolu mon problème en assignant aux Caption des header que je voulais vides, la valeur SPACE(1). Disons que cela contourne le problème.

Enfin, pour te répondre, le problème que je décris apparait également avec un grid issu des classes par défaut.
Le comportement form <-> class est vraiment totalement différent, c'est cela que je voudrais comprendre. Peut-être que ce n'est pas possible...
3
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
24 mai 2010 à 16:48
Non, c'est juste pour les grid que le comportement est différent

Quelques questions quand même:
pour quoi crées-tu tes classes avec SaveAsClass, plutot que de le faire directement en design visuel ou dans un prog en non visuel?
et une fois que tes classes sont créées, pourquoi changes-tu ta façon d'instancier un form (plutot que de créer tes forms en visuels en les dérivant d'une classe, et en les instanciant ensuite par le traditionnel DO FORM)?
0
mike_vk Messages postés 30 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 13 septembre 2013
24 mai 2010 à 17:31
Je te rassure : je ne crée pas mes class en faisant Save as class...
C'était juste une manière de m'assurer que la classe et la form fussent identiques !!!
Précision: il s'agissait bien du point de menu File>Save as class... et non de la méthode (que je n'ai jamais utilisée d'ailleurs)

Pourquoi je ne crée pas une form basée sur ma classe ? Parce que je n'ai pas trouvé d'intérêt... je n'ajouterais rien de plus que ce que contient la classe... Je n'aurais jamais qu'une form par classe dans les projets que je fais pour l'instant, donc, je mets tout mon code directement dans la classe. Au fond, je suis passé de l'utilisation de simples scx à l'utilisation de simples vcx, mais n'y ai pas encore trouvé grand intérêt. Peut-être que j'ai loupé qqch?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
24 mai 2010 à 18:57
Tes explications sont parfaitement claires.

Savoir si tu as loupé quelques chose? à première vue, j'aurais tendance à penser que si chaque classe de form ne définit qu'une seule form, alors c'est peut-être ton arborescence de classes qui est à revoir, mais ce n'est qu'une supposition de ma part, basée uniquement sur ma façon de construire mes bibliothèques de classes et mes objets.
Simplement un point de vue différent.
0
mike_vk Messages postés 30 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 13 septembre 2013
24 mai 2010 à 19:01
ok :)

Merci de ton aide en tous cas.
0
Rejoignez-nous