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

Modifie les caractéristiques d'un formulaire proportionnellement   



L'auteur

fecarabos
France France
Membre Simple
# 0000003237
enregistré le 28/12/2011

Fiche personnelle


Note des membres
pas de note

Contributions > 02 - SCX : Formulaires

Modifie les caractéristiques d'un formulaire proportionnellement
# 0000000809
ajouté le 02/01/2012 21:26:53 et modifié le 01/03/2012
consulté 5549 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0

Description
Modifie les caractéristiques d'un formulaire avec un ratio en X et en Y
Exemple : pour passer d'un formulaire développé pour écran 800 X 600 à un 1280 X 1024

=taille_ecranxy ("form1", 1280/800, 1024/600, "form2")

Ouvre le source et modifie dans les champs "properties" des objets les caractéristiques dimensionnelles

Remarque : certains objets ont des caractéristiques qui sont définies par défaut (on le remarque rapidement) :
Il faut revenir dans les propriétés de l'objet du source pour le saisir "en dur", et hop !
Code source :
** Modifie les caractéristiques d'un formulaire, proportionnellement Hauteur, Largeur, Police, Colonne...
** Créé un nouveau formulaire (form_cib) avec les nouvelles caractéristiques
** Exemple : pour passer d'un formulaire développé pour écran 800 X 600 à un 1280 X 1024
*taille_ecranxy ("form1", 1280/800, 1024/600, "form_tmp")
PROCEDURE taille_ecranxy (form_src, proportionx, proportiony, form_cib)
  IF TYPE('path_form')="U"
    path_form ="."
  ENDIF
  ERASE form_tmp.DBF
  ** les polices prennent la plus petites des 2 proportions
  proportionf = MIN(proportionx, proportiony)
  SELECT 0
  USE (ADDBS(path_form) + FORCEEXT(form_src, "scx")) ALIAS form_src

  SELECT * FROM form_src INTO DBF form_tmp
  SELECT form_src
  USE
  SELECT form_tmp

  * récupère la taille par défaut des polices
  LOCATE FOR 'form' $ LOWER(form_tmp.BASECLASS)
  =dans_tb(form_tmp.properties)
  LOCATE FOR 'fontsize' $ LOWER(objet)
  std_font = IIF(FOUND(), donnee, "9")
  SELECT form_tmp
  SCAN FOR !EMPTY(properties) AND NOT ( ;
      'dataenvironment' $ LOWER(form_tmp.BASECLASSOR ;
      'cursor' $ LOWER(form_tmp.BASECLASS) ;
      )

    =dans_tb(form_tmp.properties)
    ch0=""
    SELECT prop0
    SCAN FOR !EMPTY(objet)
      DO CASE
        CASE ;
            ALLTRIM(objet) = "FontSize" OR ;
            ".fontsize" $ LOWER(objet)
          ch0=ch0 + ALLTRIM(objet) + " = " + ;
            TRANSFORM(ROUND(VAL(donnee) * proportionf, 0))
        CASE ;
            ALLTRIM(objet) = "Width" OR ;
            ALLTRIM(objet) = "Left" OR ;
            ".width" $ LOWER(objet) OR ;
            ".left" $ LOWER(objet)
          ch0=ch0 + ALLTRIM(objet) + " = " + ;
            TRANSFORM(ROUND(VAL(donnee) * proportionx, 2))
        CASE ;
            ALLTRIM(objet) = "Height" OR ;
            ALLTRIM(objet) = "Top" OR ;
            ALLTRIM(objet) = "HeaderHeight" OR ;
            ALLTRIM(objet) = "RowHeight" OR ;
            ".fontsize" $ LOWER(objet) OR ;
            ".top" $ LOWER(objet)
          ch0=ch0 + ALLTRIM(objet) + " = " + ;
            TRANSFORM(ROUND(VAL(donnee) * proportiony, 2))
        OTHERWISE
          ch0=ch0 + ALLTRIM(objet) + " = " + ALLTRIM(donnee)
      ENDCASE
      ch0=ch0 + CHR(13)+ CHR(10)
      SELECT prop0
    ENDSCAN
    SELECT form_tmp
    REPLACE properties WITH ch0
  ENDSCAN
  USE
  ERASE (ADDBS(path_form) + FORCEEXT(form_cib,"scx"))
  ERASE (ADDBS(path_form) + FORCEEXT(form_cib,"sct"))
  RENAME form_tmp.DBF TO (ADDBS(path_form) + FORCEEXT(form_cib,"scx"))
  RENAME form_tmp.fpt TO (ADDBS(path_form) + FORCEEXT(form_cib,"sct"))
  ERASE form_tmp.DBF
  ERASE form_tmp.fpt
ENDPROC

** Extrait toutes les propriétés de l'objet dans un curseur
** et ajoute des propriétés si elles sont définies par défaut
** set library to foxtools.fll && pour les fonctions words() et wordnum()
PROCEDURE dans_tb
  PARAMETER chp
  CREATE CURSOR prop0 (objet c(250), donnee c(250))
  chaine=""
  ch_obj=""
  val_chp = (chp)
  FOR i = 1 TO LEN(val_chp)
    x = SUBSTR(val_chp, i, 1)
    DO CASE
      CASE x = "=" AND EMPTY(ch_obj)
        ch_obj = ALLTRIM(chaine)
        chaine = ""
      CASE x = CHR(13) AND !EMPTY(ch_obj)
        INSERT INTO prop0 (objet, donnee) VALUES (ch_obj, ALLTRIM(chaine))
        IF USED("prop1")
          INSERT INTO prop1 (ID, classe, obj, pere ,objet, donnee) VALUES ;
            (form_tmp.uniqueid, form_tmp.CLASS, form_tmp.objname, form_tmp.PARENT, ch_obj, ALLTRIM(chaine))
        ENDIF
        ch_obj = ""
        chaine = ""
      CASE x != CHR(13) OR x != CHR(10)
        chaine=chaine + x
    ENDCASE
  ENDFOR
  ** Pour les polices de taille par défaut créé la propriété FontSize par defaut du formulaire
  SELECT COUNT(*) FROM prop0 WHERE "FONTSIZE" $ UPPER(ALLTRIM(objet)) INTO ARRAY xx
  IF xx = 0 AND ( ;
      LOWER(ALLTRIM(form_tmp.BASECLASS)) $ "checkbox,combobox,commandbutton,editbox,grid,header,label,spinner,textbox" ;
      )
    INSERT INTO prop0 (objet, donnee) VALUES ("FontSize", std_font)
  ENDIF
  IF ;
      'optiongroup' $ LOWER(form_tmp.BASECLASS)
    SELECT DISTINCT PADR(wordnum(ALLTRIM(objet), 1, "."), 60) AS ob FROM prop0 WHERE '.' $ wordnum(objet, 1, "="INTO CURSOR prop1
    SCAN FOR !EMPTY(ob)
      ob0 = LOWER(ALLTRIM(prop1.ob) + ".fontsize")
      SELECT prop0
      GO TOP
      LOCATE FOR  ob0 $ LOWER(prop0.objet)
      IF NOT FOUND()
        INSERT INTO prop0 (objet, donnee) VALUES (ob0, std_font)
      ENDIF
      SELECT prop1
    ENDSCAN
    USE
  ENDIF
ENDPROC

Commentaires
le 01/03/2012, Philippe m a écrit :
=dans_tb(form_tmp.properties)
Est-ce plutôt la procèdure dans_tbPour passer ?

Par ailleurs "wordnum" n'est pas trouvé dans la ligne

"SELECT DISTINCT PADR(wordnum(ALLTRIM(objet), 1, "."), 60) AS ob FROM prop0 WHERE '.' $ wordnum(objet, 1, "=") INTO CURSOR prop1"

Cordialement


le 01/03/2012, fecarabos a écrit :
Merci, un parasite c'était glissé !! Corrigé.

WORDNUM est une fonction de la bibliothèque "FOXTOOLS.FLL", installée avec VFP. Il faut indiquer dans le programme :
SET LIBRARY TO FOXTOOLS.FLL
je la préfère à GETWORDNUM (native à VFP).
tu peux aussi trouver une fonction qui la rend équivalente ici :
http://fox.wikis.com/wc.dll?Wiki~GetWordNum
il suffit de remplacer syGetWordNum par wordnum

pour info sur le même lien la fonction WORDS de FOXTOOLS est syGetWordCount



le 19/11/2015, benothmanchiheb a écrit :
dans_tb introuvable ????


Publicité

Les pubs en cours :

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