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é 34912 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
* ======================================== DEFINECLASS acClassDesigner ASRelation&& Ouvre une classe dans le designer * ========================================
oClass = NULL&& Référence à l'objet ouvert par le designer
HIDDEN cVCX, cClass
* ----------------------------- PROCEDUREInit&& 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 LOCALlaSelObj[1], llResult
llResult = Vartype(m.tcVCX) == 'C'; ANDFile(m.tcVCX); ANDVartype(m.tcClass) == 'C'; ANDNOTEmpty(m.tcClass) ASSERT m.llResult MESSAGETextmerge([<<Program()>> - Au moins un paramètre est invalide]) IF m.llResult
* ----------------------------- PROCEDUREDestroy&& Ferme le designer this.oClass = NULL
LOCAL lcWindow
lcWindow = Textmerge([Class Designer - <<m.this.cVCX>> (<<m.this.cClass>>)]) IFWexist(m.lcWindow) ACTIVATEWINDOW (m.lcWindow) KEYBOARD'{CTRL+E}'PLAIN&& enregistre et compile la classe, ferme le designer DOEVENTS DOWHILEWexist(m.lcWindow) Inkey(.05) && vérifie toutes les 50 ms ENDDO ENDIF
* ======================================== ENDDEFINE&& CLASS acClassDesigner * ========================================
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
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)
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
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
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