Appeler une procédure
Accueil Remonter Appeler une procédure Mémoire vive et objets

 

 

  dBulletin n°18

Appeler une Procédure
par Gerald Lightsey

 

Traduction approximative. Source originale

Techniquement une procédure/fonction, qui appartient à un objet, (comme un formulaire), s'appelle une MÉTHODE de cet objet. Une procédure qui est en dehors de l'objet est juste nommée une procédure, comme toujours.

Nous parlons d'une MÉTHODE pour un formulaire. Ouvrez un nouveau formulaire, et faites un glisser-lâcher pour placer un « Pusbutton » sur le formulaire en cours de création. Dans l'inspecteur, cliquez sur l'onglet « Properties » (propriétés) et changez la propriété Name par « pbQuit ». Si vous voulez créer une méthode qui réponde au bouton-poussoir quand vous cliquez dessus, dans le concepteur de formulaire, choisissez le bouton-poussoir et dans l'inspecteur de propriété , cliquez l'onglet des événements (events), placez vous sur l'événement appelé onClick et cliquez l'icône de la clé anglaise du côté droit. Cela crée le squelette d'une méthode dans l'éditeur de code source nommée automatiquement PBQUIT_onClick dans lequel vous pouvez écrire votre code d'exécution. De plus, en même temps, la référence suivante est aussi automatiquement écrite dans le code de constructeur du bouton-poussoir pbQuit (1).
 


onClick = class::PBQUIT_ONCLICK

C'est ce code qui indique à l'objet de commande de pbQuit où trouver la fonction, (comme pour les procédures dans les versions de Windows de dBASE), qui doit être exécutée quand l'objet est cliqué. Le symbole :: s'appelle un opérateur de résolution et indique, dans ce cas-ci, à l'objet que la fonction est dans la même classe qui définit l'objet. Si la classe est un formulaire, alors une référence automatique est produite pour FORM de type this.<objectName >, exemple this.onClose = class::FORM_ONCLOSE.

Maintenant, comment manipuler une seule méthode qui agira pour plusieurs objects ? Un exemple classique est un ensemble de trois boutons-radio. L'événement déclenchant est onChange. Chaque fois que vous cliquez sur un des boutons-radio, son événement onChange se déclenche, mais aussi l'événement onChange du bouton-radio précédemment sélectionné! Ainsi ce que vous voudriez avoir est un traiteur d'événement, (la méthode), où vous pouvez coder ce que vous voulez exécuter quand n'importe lequel d'entre-eux est cliqué. Avec le formulaire ouvert en mode de conception et 3 boutons-radio déjà placés, cliquez sur l'option Method du menu principal (sous la barre de titre de la fenêtre de dBase) puis sélectionnez New Method (nouvelle méthode) . L'éditeur de code créera le squellete d'une méthode appelée fonction Method . Changez immédiatement le nom de la fonction en quelque chose qui signifie quelque chose comme radiobutton_Change. Cette fonction doit être exécutée si les boutons- radio changent de valeur. Écrivez le code correspondant aux actions à exécuter selon le nouveau bouton-radio choisi.
 


if this.value  // seul le bouton-radio cliqué a pour valeur true
   do case
      case this.name == "RADIOBUTTON1"
      // action
      case this.name == "RADIOBUTTON2"
      // action
      case this.name == "RADIOBUTTON3"
      // action
   endcase
endif
return

This est une référence automatiquement crée par chaque objet qui s'identifie ainsi lui-même en appelant une méthode, (semblable à Sender employé par plusieurs autres langues).

Après l'installation de la méthode comme décrit ci-dessus, et tandis que le curseur est toujours dans la méthode de l'éditeur de code, cliquez à nouveau sur le choix Method du menu et cliquez alors sur le choix «link evenement » . Une boite de dialogue s'ouvre alors et vous pouvez choisir l'objet et l'événement de l'objet qui appelleront la méthode. Dans cet exemple choisissez l'objet radiobutton1 et son événement(event) onChange . Recommencez pour les objets radiobutton2 et radiobutton3 et leur événement onChange. Cette boîte de dialogue écrit le code approprié dans CHAQUE code constructeur d'objet pour appeler votre méthode commune. Juste comme précédemment pour l'objet bouton-poussoir qui appelle sa méthode onClick(). Tout se passe comme si vous aviez écrit vous-même ce code dans chaque événement onChange de chaque bouton-radio. Avouez que c'est plus facile, tant à écrire qu'à maintenir.

En outre, vous pouvez écrire une procédure, (c'est à dire qui n'est pas une méthode de la classe) de la même façon. Voici un exemple que vous pouvez créer et tester. Dans le concepteur de formulaire (Menu File, New, designer) placez un bouton-poussoir et nommez-le « pbTestWrite ». Dans l'éditeur de code (F12) , descendez en bas et placez-vous sur « bottom », et cliquez sur l'icône « Bottom » dans la partie gauche du treeview. A droite, au-dessous du mot endclass écrivez la fonction suivante:
 


Function writeTest
msgbox("Appel d'une fonction extérieure à la classe" , "Test")
return

Sélectionnez le bouton-poussoir « pbTestWrite » et choisissez l'icône de la clé anglaise pour l 'événement onClick dans l'inspecteur de propriété . Complétez le squelette automatique ainsi
 


Fonction PBTESTWRITE_onClick
writeTest()
return

Les parenthèses() qui suivent writeTest correspondent à l'opérateur d'Appel de procédure/fonction. Maintenant lancez le formulaire et cliquez sur le bouton que vous venez de placer : la boite de dialogue s'affiche. Bien sûr ceci est un exemple, en réalité ce serait moins de travail de saisir directement dans la méthode PBTestWrite_onClick(): msgbox("Appel d'une fonction extérieure à la classe" , "Test").

En conclusion, si vous avez un procédure/fonction que vous vous voulez appeler à partir d'un autre dossier tel que .PRG , .CC , .WFM Vous devez simplement devez créer une référence à elle. Par exemple, dans l'événement onOpen d'un formulaire vous pouvez écrire...
 


set procedure to Stringex.cc additive

Stingex.cc est un fichier comprenant de nombreuses fonctions et se trouve dans le répertoire dUflp. Ensuite, de n'importe où vous pouvez appeler la fonction appelée AllTrim() de Stringex.cc et votre code travaillera ainsi:
 


aString = " un certain texte "
aTrimmedString = AllTrim(aString)
? aTrimmedString // affichage "un certain texte" dans le panneau de contrôle

Notez que le mot additive dans la ligne de commande set procedure to a été ajouté dans les versions de Windows afin que dBase sache qu'il ne faut pas effacer les autres procédures déjà chargée en mémoire. L'absence du mot additive est une des raisons les plus fréquentes de l'échec du code dans les versions de Windows parce qu'il détruit alors tous les liens vers les fichiers de procédures précédemment lancés. Depuis dBase Plus 2.5 , l'option additive est automatiquement incluse. C'est cependant une bonne habitude de continuer à le préciser. Pour plus de d'informations consulter Set Procedure dans l'aide.

En espérant que ceci vous aide

Si vous êtes pressés, vous pouvez copier/coller ce code dans un fichier .wfm et le lancer ou le télécharger.

 

** END HEADER -- do not remove this line

//

// Generated on 01/11/2005

parameter bModal local f

f = new test_dbulletin18_proceduresForm()
if (bModal) f.mdi = false // ensure not MDI
  f.readModal()
else
   f.open()
endif


class test_dbulletin18_proceduresForm of FORM with (this)
onClose = class::FORM_ONCLOSE
height = 16.0
left = 53.0
top = 0.0
width = 40.0
text = "" endwith


this.PBQUIT = new PUSHBUTTON(this) with (this.PBQUIT)
onClick = class::PBQUIT_ONCLICK
height = 1.0909
left = 12.0
top = 2.0 width = 15.2857
text = "Test méthode"
endwith


this.RADIOBUTTON1 = new RADIOBUTTON(this) with (this.RADIOBUTTON1)
onChange = class::RADIOBUTTON_CHANGE
height = 1.0909
left = 12.0
top = 5.0
width = 15.7143
text = "Radiobutton1"
group = true
value = true
endwith


this.RADIOBUTTON2 = new RADIOBUTTON(this) with (this.RADIOBUTTON2)
onChange = class::RADIOBUTTON_CHANGE
height = 1.0909
left = 12.0
top = 8.0
width = 15.7143
text = "Radiobutton2"
endwith


this.RADIOBUTTON3 = new RADIOBUTTON(this) with (this.RADIOBUTTON3)
onChange = class::RADIOBUTTON_CHANGE
height = 1.0909
left = 12.0
top = 11.0
width = 15.7143
text = "Radiobutton3"
endwith


this.PBTESTWRITE = new PUSHBUTTON(this) with (this.PBTESTWRITE)
onClick = class::PBTESTWRITE_ONCLICK
height = 2.5
left = 7.0
top = 13.0
width = 25.0
text = "Teste l'appel d'une fonction hors de la classe"
endwith



function PBQUIT_onClick // Code a exécuter lorsque l'on clique sur le bouton
msgbox("Bouton pbQuit actionné","Test")
return


function PBTESTWRITE_onClick
writeTest()
return


function form_onClose // code des actions à effectuer après la fermeture du formulaire
return


function Radiobutton_Change
if this.value // seul le dernier bouton sélectionné a pour valeur(value): true      do case
    case this.name == "RADIOBUTTON1" // action code
      msgbox("Boutonradio1 selectionné", "Test")
    case this.name == "RADIOBUTTON2" // action code
      msgbox("Boutonradio2 selectionné", "Test")
    case this.name == "RADIOBUTTON3" // action code
      msgbox("Boutonradio3 selectionné", "Test")
    endcase
endif
return
return
endclass


Function writeTest
msgbox("Appel d'une fonction extérieure à la classe" , "Test")
return