ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Ouvrir et fermer le Class Designer par programme   



L'auteur

FoxInCloud (Th. Nivelet)
France France
Membre Simple
# 0000000014
enregistré le 13/10/2004

http://www.foxincloud.com/
Nivelet Thierry
75016 Paris
de la société Abaque
Fiche personnelle


Note des membres
pas de note

Contributions > 06 - VCX - Bibliothèque de classes visuelles

Ouvrir et fermer le Class Designer par programme
# 0000000713
ajouté le 21/08/2009 12:34:34 et modifié le 22/08/2009
consulté 34589 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0

Description

Une classe visuelle est entièrement modifiable par programmation, grâce aux méthodes et fonctions :

 

.ReadMethod() & .WriteMethod()

.ReadExpression() & .WriteExpression()

.addProperty()

 

AddProperty()

RemoveProperty()

 

etc.

 

Le plus délicat est de piloter le Class Designer par programme

 

La classe 'acClassDesigner' peut vous y aider

Code source :
o = createObject('acClassDesigner''monVCX''maClasse'&& ouvre le designer
o.oClass.WriteMethod('maMéthode''monCode', ...) && écrit une méthode (par exemple)
o = null && referme le designer en enregistrant la classe

  * ========================================
  DEFINE CLASS acClassDesigner AS Relation && Ouvre une classe dans le designer
  * ========================================

  oClass = NULL && Référence à l'objet ouvert par le designer

  HIDDEN cVCX, cClass

  * -----------------------------
  PROCEDURE Init && Ouvre le designer
  LPARAMETERS ;
    tcVCX,; && Fichier VCX
    tcClass,; && Classe à modifier
    tlProps && [.F.] Laisser la fenêtre de propriétés ouverte
  tlProps = Vartype(m.tlProps) == 'L' AND m.tlProps
  LOCAL laSelObj[1], llResult

  llResult = Vartype(m.tcVCX) == 'C';
   AND File(m.tcVCX);
   AND Vartype(m.tcClass) == 'C';
   AND NOT Empty(m.tcClass)
  ASSERT m.llResult MESSAGE Textmerge([<<Program()>> - Au moins un paramètre est invalide])
  IF m.llResult

    MODIFY CLASS (m.tcClass) OF (m.tcVCX) NOWAIT
    IF NOT m.tlProps AND Wexist('Properties')
      HIDE WINDOW Properties
    ENDIF
    ASelObj(laSelObj, 1)
    this.oClass = laSelObj[1]
    this.cVCX = Lower(JustFname(m.tcVCX))
    this.cClass = Lower(m.tcClass)
  ENDIF

  RETURN m.llResult

  * -----------------------------
  PROCEDURE Destroy && Ferme le designer
  this.oClass = NULL

  LOCAL lcWindow
  lcWindow = Textmerge([Class Designer - <<m.this.cVCX>> (<<m.this.cClass>>)])
  IF Wexist(m.lcWindow)
    ACTIVATE WINDOW (m.lcWindow)
    KEYBOARD '{CTRL+E}' PLAIN && enregistre et compile la classe, ferme le designer
    DOEVENTS
    DO WHILE Wexist(m.lcWindow)
      Inkey(.05) && vérifie toutes les 50 ms
    ENDDO
  ENDIF

  * ========================================
  ENDDEFINE && CLASS acClassDesigner
  * ========================================

Commentaires
le 22/08/2009, eddymaue a écrit :
Salut Thierry,

2 p'tite choses à ajouter à ta classe

1 - il faut compiler avec la la commande Compile Class ....
si non je crois que les modifs ne seront pas enregistrées

2 - pour effacer une méthode il faut
1 la vider avec WriteMethode()
o.oClass.WriteMethod('maMéthode',' ')
2 avec RemoveProperty on peut l'effacer
RemovePropert(('maMéthode)

ce qui devrait completer cette jolie classe

a+ eddy

le 22/08/2009, FoxInCloud (Th. Nivelet) a écrit :
Salut Eddy
1- CTRL+E enregistre et compile
2- avec VFP, seule l'imagination peut limiter nos possibilités
bon WE
thn

le 24/08/2009, eddymaue a écrit :
ok je n'avais pas vu CTRL+E dans le code et effectivement ca compile et ferme l'objet de la librairie en cours de modif, ce que j'emplois depuis des lustres sauf qu'ici c'est employé en mode Run Time et donc malheureusement ca ne fonctionne pas. C'est l'un des nombreux problèmes auquels j'ai été confrontés durant le développement de mon formbrowser

voilà une base de ce que je ferais et le chemin à suivre mais vfp nous offres d'infinies voies et d'infinies solutions.

#define CR Chr(13)
#define LF Chr(10)
#define CrLf CR+LF
Set Step On


lcVcx = 'E:\OWNER\EDDY\VFPMESPRJETS\COMMUN\IBASE.VCX'
lcClasse = "iicommandgroup"
lcProcName = "cmd_rightclick"

Text TO lcMethodeBody TEXTMERGE NOSHOW
Parameters tcP1
Return

EndText


lcMethodeCode = "PROCEDURE "+lcProcName+CRLF+lcMethodeBody+CRLF +"ENDPROC"


If Not Used(Juststem(lcVcx))
Use (lcVcx) In 0 Shared
Endif
Select (juststem(lcVcx))
Locate For Alltrim(objname)==Lower(lcClasse)

Assert Found(Juststem(lcVcx)) Message "Classe non définie"
Local lcDoCurrExact As Character
m.lcDoCurrExact = "set Exact "+Set("Exact")
Set Exact Off

Local laMeth(1),lnMeth
lnMeth = Alines(laMeth,methods)
Create Cursor crsMthName ( procname c(127))
Declare laMeth(lnMeth,1)
Append From Array laMeth For procname = "PROCEDURE "

Locate For Lower(procname) = "procedure "+ Lower(lcProcName)
Select (Juststem(lcVcx))
Do Case
Case Found("crsMthName")
If Messagebox("Cette procedure existe, voulez-vous l'écraser",4+32)=7 && non
Return
Endif

* oui on écrase

* LF+methods) pour la premiere méthode et le +1 pour éliminer LF
lnDebutMethod = At(Lower(LF+"procedure "+Alltrim(lcProcName)),LF+Lower(methods))
* récupère la balance du texte et ne reste qu'à trouver EndProc
lcTexteDebut = Left(methods,lnDebutMethod-1)
lcTexteFin = Substr(methods,lnDebutMethod)
lnFinMethod = At(LF+"ENDPROC",lcTexteFin )+lnDebutMethod
lcTexteFin = Substr(methods,lnFinMethod+Len("endproc")+2)

replace methods with ;
lcTexteDebut ;
+ iif(CrLf=Right(lcTexteDebut,2),"",CrLf);
+ lcMethodeCode + CrLf ;
+ lcTexteFin


Otherwise
replace methods with methods + lcMethodeCode + CrLf

EndCase

Use in (Juststem(lcVcx))
Compile classlib (lcVcx)


&lcDoCurrExact

le 25/08/2009, FoxInCloud (Th. Nivelet) a écrit :
Eddy,
Avec USE mon.vcx et REPLACE METHODS, COMPILE obligatoire
Avec MODIFY CLASS, le class designer se charge de tout
@ +
thn

le 02/09/2009, eddymaue a écrit :
Salut Thierry

ton talon d'Achilde c'est ACTIVATE WINDOW (m.lcWindow)

si tu as un autre fenêtre d'ouverte et qui a le même titre et c'est celle là qui s'activera par ce que Active Widow ou Show Window vont afficher la premiere ouverte du titre ciblé

a+ Eddy et en plus dans mon exemple, il n'y a pas de fenêtre qui flash

bonne soirée


Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3