CHAPITRE 1 LA POO LA PROGRAMMATION ORIENTEE OBJET

Documents pareils
CHAPITRE 1 CREER UN EXECUTABLE

1 INTRODUCTION. PowerBuilder - Introduction. Pascal Buguet Imprimé le 19 août 2004 Page 1

Uniformiser la mise en forme du document. Accélère les mises à jour. Permets de générer des tables de matières automatiquement.

MS SQL Express 2005 Sauvegarde des données

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Formation VBA 3 Interagir

1. Structure d'un programme FORTRAN 95

Configurer la supervision pour une base MS SQL Server Viadéis Services

Cours Informatique Master STEP

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Reporting Services - Administration

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Modélisation et Gestion des bases de données avec mysql workbench

Cours 420-KEG-LG, Gestion de réseaux et support technique. Atelier No2 :

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

LES ACCES ODBC AVEC LE SYSTEME SAS

Examen Médian - 1 heure 30

Visual Basic for Applications

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Installation FollowMe Q server

Création d installateurs pour Windows avec InnoSetup

Chapitre 5 : Les procédures stockées PL/SQL

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Q-Checker pour V6 Release 2.1

Procédure d installation des logiciels EBP sous environnement MAGRET

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Bases de données avancées

supérieure Vous ne connaissez pas le numéro de version de votre application?

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Présentation du langage et premières fonctions

Business Sharepoint Contenu

MEDIAplus elearning. version 6.6

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Manuel d'utilisation: Gestion commerciale - CRM

Sql Server 2005 Reporting Services

Utilisation de l outil lié à MBKSTR 9

Once the installation is complete, you can delete the temporary Zip files..

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

PROGRAMMATION EVENEMENTIELLE sur EXCEL

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Préconisations Portail clients SIGMA

WINDOWS NT 2000: Travaux Pratiques. -Boîtier partage d'imprimante- Michel Cabaré Janvier 2002 ver 1.0

Gestion de stock pour un magasin

Configuration de Microsoft Internet Explorer pour l'installation des fichiers.cab AppliDis

Les Utilisateurs dans SharePoint

Utilitaires méconnus de StrataFrame

Installation et configuration du logiciel BauBit

Programmer en JAVA. par Tama

Stockage du fichier dans une table mysql:

Tutoriel Adobe Acrobat Pro (version 9.0.0) Créer les fichiers PDF de la thèse. Service Commun de la Documentation Service des thèses

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Oracle Learning Library Tutoriel Database 12c Installer le logiciel Oracle Database et créer une Database

Modernisation, développement d applications et DB2 sous IBM i Technologies, outils et nouveautés Volubis.fr

Rapport de Mini-Projet en ArcGIS Engine

Paginer les données côté serveur, mettre en cache côté client

Cours d algorithmique pour la classe de 2nde

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

La Clé informatique. Formation Internet Explorer Aide-mémoire

Diagramme de classes

.NET - Classe de Log

Introduction à Eclipse

1. Aménagements technologiques 2. Installation de Microsoft SQL Server 2012

Documentation module hosting


Java Licence Professionnelle CISII,

TP Contraintes - Triggers

Service Systèmes et Réseaux

Sophos Endpoint Security and Control Guide de configuration pour réseaux étendus. Enterprise Console, version 3.1 EM Library, version 1.

Manuel d'utilisation: Gestion commerciale - CRM

Page Paragraphe Modification Mise en page du document Le bouton "Format de page" est maintenant "Page"

CREATION WEB DYNAMIQUE

Note Technique. 1. Objectif. 2. Prérequis. 3. Installation

Fiche n 14 : Import / Export avec PlanningPME

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Onglet sécurité de Windows XP Pro et XP Home

Notions fondamentales du langage C# Version 1.0

Cours de Génie Logiciel

Introduction à Business Objects. J. Akoka I. Wattiau

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Apps Sage : les 10 étapes pour publier vos données dans le Cloud.

Créer un fichier PDF/A DÉPÔT ÉLECTRONIQUE

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Compilation (INF 564)

MODE OPERATOIRE OPENOFFICE BASE

Connexion sur REDLION G-308 avec le modem GSM GDW-11 pour envoi de SMS

Déploiement de SAS Foundation

TeamViewer 7 Manuel Manager

Sage CRM. Sage CRM 7.3 Guide du portable

TrueCrypt : installation et paramétrage

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Transcription:

CHAPITRE 1 LA POO LA PROGRAMMATION ORIENTEE OBJET Chapitre 1 LA POO LA PROGRAMMATION ORIENTEE OBJET 2 1.1 Introduction 4 1.2 Création d' un objet 5 1.2.1 Résumé de la Démarche 5 1.2.2 Démarche 5 1.2.3 Pour utiliser un objet 7 1.3 L'héritage 8 1.3.1 L'héritage simple 8 1.4 Les Visual Standard 10 1.4.1 Un premier exemple : un Command Button 10 1.4.2 Un deuxième exemple : Une Listbox + une Méthode 11 1.5 Les Visual Custom 12 1.5.1 Premier exemple : Une ComboBox 12 1.5.2 Une deuxième exemple : Un Bloc DataWindow 13 1.5.3 Côté Utilisateur de la classe 13 1.5.4 Côté Classe 14 1.6 Les Classes non visuelles 16 1.7 Les Non-Visuelles Standards 16 1.8 Le polymorphisme 16 1.9 Le paramétrage optionnel 18 1.10 Les Services de classe 19 1.10.1 Le schéma de la Uo_Dw 20 1.10.2 Les scripts de la Uo_Dw 21 1.10.3 Le schéma de N_cst_dw_mono_select 23 1.10.4 Le script 23 1.10.5 Le schéma de N_cst_dw_multi_select 24 1.10.6 Le script 24 1.10.7 Le schéma de N_cst_dw_mono_export 24 1.10.8 Le script 24 1.10.9 Le schéma de N_cst_dw_multi_export 25 1.10.10 Le script 25 1.10.11 L'interface 26 1.10.12 Les scripts 26 1.11 La création dynamique de contrôles 27 1.12 Annexes 30 1.12.1 Service de classe : un exemple une liste en mono ou multi sélection et transfert 30

1.12.2 Service de classe : un autre exemple une dw en mono ou multi sélection - un seul service de classe. 33 Pascal Buguet Imprimé le 19 août 2004 Page 3

1.1 INTRODUCTION La Programmation Orientée Objet nous permet d enrichir des classes de PowerBuilder. Elle permet de créer des classes (ou objets) qui accéléreront le développement d application. Il faut donc désormais distinguer : Les classes (User objects) objets du chapitre actuel Les objets (ou contrôles) que l on "posent" sur les fenêtres en phase de conception. Les instances qui sont en mémoire pendant l exécution de l application. Exemple : jusqu à présent dans la boîte à outils nous avons choisi une classe (CommandButton par exemple) pour créer un objet CommandButton (cb_suivant par exemple) et à l exécution nous avions sous les yeux une instance de ce bouton. Les "User Objects" sont de plusieurs types : - Class : - Custom : Classes nouvelles (pour des services de classe par exemple) - Standard : Connection, Datastore, DynamicDescriptionArea, Error, Message, OleObject, OleStorage, OleStream, Pipeline, Transaction, etc. - Visual : - Custom : combinaison de classes visuelles - External : dll, exe, - Standard : CommandButton, DataWindow,... - OCX : Cmdialog, Grid, Msole2,... Pascal Buguet Imprimé le 19 août 2004 Page 4

1.2 CREATION D' UN OBJET 1.2.1 Résumé de la Démarche Cliquez sur le bouton New Choisissez la catégorie Choisissez le type Changez les propriétés Ajoutez des variables d'instance (Attributs) Codez le ou les scripts (Méthodes) Ajoutez des fonctions publiques (Méthodes) 1.2.2 Démarche Dans ce paragraphe nous allons créer une classe CommandButton cb_fermer pour avoir un bouton de commande qui ferme une fenêtre. Cliquez sur New Cliquez sur l'onglet PB OBject Choix de la catégorie d'objet Custom Class Standard Class Custom Visual External Visual Standard Visual Pascal Buguet Imprimé le 19 août 2004 Page 5

Double-cliquez sur la catégorie. Ici Standard Visual Choix du type de la classe d'objet Ici CommandButton L'interface de programmation d'une classe visuelle Changez les propriétés de votre classe Text Font Default Cancel &Fermer False True Codez le(s) script(s) Ici Close(Parent) Enregistrez la classe Ici Uo_cb_fermer Pascal Buguet Imprimé le 19 août 2004 Page 6

1.2.3 Pour utiliser un objet 1.2.3.1 Objet Graphique Dans la liste déroulante des contrôles cliquer sur "User Object" Sélectionnez votre classe dans la liste et cliquez sur OK. Posez-la sur la fenêtre et testez. 1.2.3.2 Objet non graphique Déclarez dans le code une variable de type de votre UserObject Utilisez l'instruction Create Utilisez l'instruction Destroy Pour un exemple cf plus loin dans ce chapitre. Pascal Buguet Imprimé le 19 août 2004 Page 7

1.3 L'HERITAGE 1.3.1 L'héritage simple Une classe peut hériter d'une autre classe Pour la créer vous avez deux possibilités : o Fichier / Inherit / Target / Librairies / User Objet o Vous sélectionnez le user object parent, vous cliquez droit et vous cliquez sur Inherit. Le code événementiel du parent est exécuté avant le code du descendant 1.3.1.1 Inhiber l'héritage Si le code du parent ne doit pas être exécuté vous cliquez droit dans le script et vous désélectionnez Extend Ancestor Script qui l'option par défaut. 1.3.1.2 Exécuter le script d'un parent Du parent direct : Du parent indirect : Parent Super::EVENT Clicked() Call uo_cb_parent::clicked // par exemple du grand Pascal Buguet Imprimé le 19 août 2004 Page 8

1.3.1.3 Exemples d'héritages Le schéma Uo_cb_parent Clicked : Messagebox('','Parent') Uo_cb_enfant Uo_cb_enfant_déshé rité Uo_enfant_Inversé Clicked : Msg(Enfant) Clicked : Msg(Désh) Clicked : Msg(inversé) Uo_cb_petit_enfant Clicked : Msg(Petit Enfant) La fenêtre Pascal Buguet Imprimé le 19 août 2004 Page 9

1.4 LES VISUAL STANDARD 1.4.1 Un premier exemple : un Command Button Boutons de commande pour manipuler une DataWindow : 3 niveaux Variable d'instance au premier niveau, méthodes au deuxième niveau, affectation au niveau "instance" Uo_cb_navig DataWindow idw Uo_cb_precedent Idw.scrollPriorRow() Uo_cb_suivant idw.scrolltonext() Cb_premier Idw=dw_clients Cb_suivant idw=dw_clients Pascal Buguet Imprimé le 19 août 2004 Page 10

1.4.2 Un deuxième exemple : Une Listbox + une Méthode Une liste à remplir avec un ordre Select via une fonction (of_remplir) ou bien via un message utilisateur (user-event ue_remplir) Uo_liste String is_chaine of_remplir SelectionChanged : is_chaine = This.selectedItem() Lb_nomsclients Constructor : of_remplir("select..") Function : of_remplir(as_select) // Remplir une liste ; paramètre chaine select = as_select string lschaine // déclaration du curseur dynamique declare lc_liste dynamic cursor for sqlsa; // Compilation prepare sqlsa from :as_select using sqlca; open dynamic lc_liste; fetch lc_liste into :lschaine; do while sqlca.sqlcode = 0 this.additem(lschaine) fetch lc_liste into :lschaine; loop close lc_liste; Pascal Buguet Imprimé le 19 août 2004 Page 11

1.5 LES VISUAL CUSTOM 1.5.1 Premier exemple : Une ComboBox Cet objet est une combinaison d'un SingleLineEdit et d'une ListBox. Pour le créer sur la fenêtre de conception il faut "poser" les deux éléments. Un SingleLineEdit nommé Sle_Combo et une ListBox nommée Lb_Combo // Event SelectionChanged for lb_combo de UO_Combo dans oodyn.pbl sle_combo.text = lb_combo.selecteditem ( ) // Event ue_sur_touche (pbm_keyup) pour sle_combo de UO_Combo long ll_index // -------------------------------- ll_index = lb_combo.finditem(this.text,0) lb_combo.selectitem ( ll_index ) Pascal Buguet Imprimé le 19 août 2004 Page 12

1.5.2 Une deuxième exemple : Un Bloc DataWindow Objectif Cet objet permet de gérer des données au travers d'une DW. L'utilisateur de la classe ne doit spécifier que le code SQL source de la DataWindow et la transaction. L'écran utilisateur Scripts 1.5.3 Côté Utilisateur de la classe // Event Constructor for uo_dw_bloc_villes inherited from uo_dw_tot of_init("dwo_villes_ff", sqlca) Pascal Buguet Imprimé le 19 août 2004 Page 13

1.5.4 Côté Classe // of_init for uo_dw_bloc dans oodyn.pbl // Arguments : as_dwo (type string) et atrans_sql (type transaction) dw_generique.dataobject = as_dwo dw_generique.settransobject(atrans_sql) dw_generique.retrieve() // Event clicked for cb_suivant dw_generique.scrollnextrow() // Event RowFocusChanged pour dw_generique de uo_dw_bloc long ll_count long ll_position ll_count = dw_generique.rowcount() ll_position = dw_generique.getrow() cb_premier.enabled = true cb_precedent.enabled = true Pascal Buguet Imprimé le 19 août 2004 Page 14

cb_suivant.enabled = true cb_dernier.enabled = true CHOOSE CASE ll_position CASE 1 cb_premier.enabled = false cb_precedent.enabled = false CASE ll_count cb_suivant.enabled = false cb_dernier.enabled = false END CHOOSE Pascal Buguet Imprimé le 19 août 2004 Page 15

1.6 LES CLASSES NON VISUELLES Les objets non visuels permettent : D enrichir les classes non visuelles standards de PowerBuilder Par exemple de type Transaction ou de type Pipeline ( cf le chapitre sur les Pipelines, celui sur les DataStores et celui sur les procédures stockées) De gérer le polymorphisme pour les fonctions De gérer le paramétrage optionnel de fonctions De créer des services de classe Les objets non visuels doivent être instanciés avec un ordre Create et détruit avec l instruction Destroy. Leur validité est testée avec la fonction IsValid() 1.7 LES NON-VISUELLES STANDARDS Cette catégorie sera détaillée par la suite dans plusieurs chapitres ( Pour les connexions multiples, pour les procédures stockées, pour des Pipelines, pour les DataStores). 1.8 LE POLYMORPHISME La hiérarchie est à lire à l envers Admettons la nécessité d avoir la même fonction pour des opérations quelque peu différentes ( le calcul d une surface,.). Pour l utilisateur le nom de la fonction est toujours le même; ce sont les paramètres qui vont être différents en nombre ou en type. Dans l exemple suivant la «même» fonction permet de faire soit une addition soit une concaténation. La classe n_cst_op est vide Elle est utilisée comme niveau racine La classe n_cst_op_num contient une fonction Pascal Buguet Imprimé le 19 août 2004 Page 16

Of_add ( ai_x, ai_y ) qui fait la somme des deux nombres et renvoie le résultat La classe n_cst_op_string contient une fonction Of_add ( as_x, as_y ) qui fait la concaténation des deux chaînes et renvoie le résultat La classe n_cst_op_user est vide Elle est utilisée comme interface inv_op_user est déclarée comme variable d instance Open de w_fct_polymorphes inv_op_user = Create n_cst_op_user Close de w_fct_polymorphes If isvalid(inv_op_user) then Destroy inv_op_user SetNull(inv_op_user) End if Clicked de cb_add_num integer li_result li_result = inv_op_user.of_add(3,10) sle_num.text = string(li_result) Clicked de cb_add_string string ls_concat ls_concat = inv_op_user.of_add("bon","jo") sle_string.text = ls_concat Pascal Buguet Imprimé le 19 août 2004 Page 17

1.9 LE PARAMETRAGE OPTIONNEL La hiérarchie est à lire à l envers Admettons la nécéssité d avoir la même fonction avec des paramètres optionnels. Pour l utilisateur de cette fonction il ne devra passer que le nombre nécessaire de paramètres. Dans l exemple suivant la «même» fonction permet de faire soit une addition de deux nombres soit de trois nombres La classe n_cst_optionnel est vide Elle est utilisée comme niveau racine La classe n_cst_optionnel_3 contient une fonction Of_add ( ai_x, ai_y, ai_z ) qui fait la somme des trois nombres et renvoie le résultat La classe n_cst_optionnel_2 contient une fonction Of_add ( ai_x, ai_y ) qui fait la somme des deux nombres et renvoie le résultat La classe n_cst_optionnel_user est vide Elle est utilisée comme interface Open de w_fct_parm_optionnels inv_optionnel_user = create n_cst_optionnel_user Close de w_fct_parm_optionnels if isvalid(inv_optionnel_user) then destroy(inv_optionnel_user) Clicked de cb_optionnel2 integer li_result li_result = inv_optionnel_user.of_add(3,10) sle_num2.text = string(li_result) Clicked de cb_optionnel3 integer li_result li_result = inv_optionnel_user.of_add(3,10,10) sle_num3.text = string(li_result) Pascal Buguet Imprimé le 19 août 2004 Page 18

1.10 LES SERVICES DE CLASSE Les services de classe utilisés dans les PFC (cf le chapitre correspondant) permettent «d externaliser» des fonctions et aussi de les généraliser. Plutôt que de créer une fonction - méthode d un objet visuel la fonction devient une méthode d un objet non-visuel Les services de classe permettent de pallier l'absence d'héritage multiple. Dans l exemple présenté graphiquement ci-dessus cinq user objects sont créés : un user object de type visual standard DataWindow quatre user object de type class custom Deux classes vont permettre soit la mono sélection soit la multi sélection. Deux autres classes vont permettre l'export en mono ou en multi sélection. Pascal Buguet Imprimé le 19 août 2004 Page 19

1.10.1 Le schéma de la Uo_Dw Uo_dw Inv_multi_select Inv_mono_select Inv_multi_export Inv_mono_export Of_activer_export_mono() Of_activer_export_multi() Of_desactiver_export_mono() Of_desactiver_export_multi() Of_multi_select(ab_multi_select) Of_init(a_trans) Of_export_mono(adw_destination) Of_export_multi(adw_destination) Clicked Destructor RowFocusChanging Pascal Buguet Imprimé le 19 août 2004 Page 20

1.10.2 Les scripts de la Uo_Dw Uo_dw type variables n_cst_dw_multi_select n_cst_dw_mono_select n_cst_dw_mono_export n_cst_dw_multi_export transaction long long inv_multi_select inv_mono_select inv_mono_export inv_multi_export i_trans il_current_row il_new_row public subroutine of_multi_select (boolean ab_multi_select) if ab_multi_select then // Multi Select if isvalid(inv_mono_select) then destroy inv_mono_select inv_multi_select = create n_cst_dw_multi_select inv_multi_select.idw = this else // Mono Select if isvalid(inv_multi_select) then destroy inv_multi_select inv_mono_select = create n_cst_dw_mono_select inv_mono_select.idw = this public subroutine of_init (transaction a_trans) i_trans = a_trans this.settransobject(i_trans) this.retrieve() public subroutine of_activer_export_multi () // Activation du multi export this.inv_multi_export = create n_cst_dw_multi_export inv_multi_export.idw = this public subroutine of_desactiver_export_multi () if IsValid(inv_multi_export) then destroy inv_multi_export SetNull(inv_multi_export) public subroutine of_activer_export_mono () this.inv_mono_export = create n_cst_dw_mono_export inv_mono_export.idw = this public subroutine of_desactiver_export_mono () if IsValid(inv_mono_export) then Pascal Buguet Imprimé le 19 août 2004 Page 21

destroy inv_mono_export SetNull(inv_mono_export) public subroutine of_export_mono (datawindow adw_destination) if isvalid(inv_mono_export) then this.inv_mono_export.of_export_mono(adw_destination) else messagebox("alerte","service non Disponible") end subroutine public subroutine of_export_multi (datawindow adw_destination) if isvalid(inv_multi_export) then this.inv_multi_export.of_export_multi(adw_destination) else messagebox("alerte","service non Disponible") event destructor // Service Mono_select if isvalid(inv_mono_select) then destroy inv_mono_select SetNull(inv_mono_select) // Service Multi_select if isvalid(inv_multi_select) then destroy inv_multi_select SetNull(inv_multi_select) // Service Mono_export if isvalid(inv_mono_export) then destroy inv_mono_export SetNull(inv_mono_export) // Service Multi_export if isvalid(inv_multi_export) then destroy inv_multi_export SetNull(inv_multi_export) event clicked if isvalid(this.inv_multi_select) then this.inv_multi_select.of_select_rows(row) event rowfocuschanging if isvalid(this.inv_mono_select) then this.inv_mono_select.of_select_row(currentrow,newrow) Pascal Buguet Imprimé le 19 août 2004 Page 22

1.10.3 Le schéma de N_cst_dw_mono_select N_cst_dw_mono_select Idw Of_select_row ( al_current_row, al_new_row ) 1.10.4 Le script N_cst_dw_mono_select type variables uo_dw idw public subroutine of_select_row (long al_current_row, long al_new_row) idw.selectrow ( al_current_row, FALSE ) idw.selectrow ( al_new_row, TRUE ) Pascal Buguet Imprimé le 19 août 2004 Page 23

1.10.5 Le schéma de N_cst_dw_multi_select N_cst_dw_multi_select Idw Of_select_rows ( al_current_row ) 1.10.6 Le script N_cst_dw_multi_select type variables uo_dw idw public subroutine of_select_rows (long al_current_row);// Multi select if idw.isselected (al_current_row ) then idw.selectrow(al_current_row,false) else idw.selectrow(al_current_row,true) 1.10.7 Le schéma de N_cst_dw_mono_export N_cst_dw_mono_export Idw Of_export_mono ( adw_destination ) 1.10.8 Le script N_cst_dw_mono_export type variables uo_dw idw public subroutine of_export_mono (datawindow adw_destination) idw.rowsmove( idw.getselectedrow (0),idw.getselectedrow (0), primary!, adw_destination, adw_destination.rowcount()+1, primary! ) Pascal Buguet Imprimé le 19 août 2004 Page 24

1.10.9 Le schéma de N_cst_dw_multi_export N_cst_dw_multi_export Idw Of_export_multi ( adw_destination ) 1.10.10 Le script N_cst_dw_multi_export type variables uo_dw idw public subroutine of_export_multi (datawindow adw_destination);// exportation des n lignes sélectionnées long ll_ctr, ll_count ll_count = idw.rowcount() for ll_ctr = ll_count to 1 step -1 if idw.isselected(ll_ctr) then idw.rowsmove ( ll_ctr, ll_ctr, primary!, adw_destination, adw_destination.rowcount()+1, primary! ) next Pascal Buguet Imprimé le 19 août 2004 Page 25

1.10.11 L'interface 1.10.12 Les scripts Dw_1.Constructor() this.of_init(sqlca) this.of_multi_select(false) Cb_Activer_Export_Mono.Clicked() if this.text = "&Activer Export Mono" then this.text = "&Désactiver Export Mono" dw_clients_1.of_activer_export_mono() else this.text = "&Activer Export Mono" dw_clients_1.of_desactiver_export_mono() Cb_ Export_Mono.Clicked() dw_1.of_export_mono(dw_clients_3) Pascal Buguet Imprimé le 19 août 2004 Page 26

1.11 LA CREATION DYNAMIQUE DE CONTROLES PowerBuilder permet de créer dynamiquement des contrôles (SingleLineEdit, StaticText, ) sur une fenêtre (comme l'on peut créer dynamiquement des pages d'onglet dans un onglet- cf le chapitre correspondant). Il faut pour cela passer par des UserObjects. La création dynamique à partir de classes non visuelles standards ne fonctionne pas. C'est la méthode OpenUserObject qui permet de créer dynamiquement un contrôle. Syntaxe : windowname.openuserobject ( userobjectvar, userobjecttype {, x, y } ) où windowname : est le nom de la fenêtre parent userobjectvar : est une variable du type du userobject à créer userobjecttype : est une chaîne de caractère qui contient le nom de votre classe d'objet x et y : les positions x et y de votre contrôle dynamique. Dans l'exemple qui suit nous allons créer trois sle puis leur affecter des valeurs. Le UserObjet a été créé sans aucune propriété ni méthode spécifique. Pascal Buguet Imprimé le 19 août 2004 Page 27

Fenêtres d'exécution A la création de la fenêtre Après la création des sle Après l'affectation des valeurs Pascal Buguet Imprimé le 19 août 2004 Page 28

Scripts Du bouton Créer contrôles int li_ctr for li_ctr = 1 to 3 parent.openuserobject ( isle_perso[li_ctr], "uo_sle",100, 100 * li_ctr ) next Du bouton Affecter Valeurs int li_ctr for li_ctr = 1 to upperbound(isle_perso) isle_perso[li_ctr].text = string(li_ctr) next Pascal Buguet Imprimé le 19 août 2004 Page 29

1.12 ANNEXES 1.12.1 Service de classe : un exemple une liste en mono ou multi sélection et transfert 1.12.1.1 Le schéma de la liste mono Uo_list_multi_mono Inv_list_multi_mono Of_destroy() Of_init(as_type_selection) 1.12.1.2 Le script Uo_list_multi_mono type variables n_cst_list_multi_mono inv_list_multi_mono public subroutine of_init (string as_type_selection) inv_list_multi_mono = create n_cst_list_multi_mono inv_list_multi_mono.of_init(this) if as_type_selection = "Multi" then inv_list_multi_mono.of_multi() if as_type_selection = "Mono" then inv_list_multi_mono.of_mono() public subroutine of_destroy () if isvalid(inv_list_multi_mono) then destroy(inv_list_multi_mono) setnull(inv_list_multi_mono) Pascal Buguet Imprimé le 19 août 2004 Page 30

1.12.1.3 Le schéma de la liste Multi-Mono N_cst_list_multi_mono Iuo_lmm Ib_select_mono Ias_items[] Of_init(auo_list) Of_mono() Of_multi() Of_recup() integer 1.12.1.4 Le script N_cst_list_multi_mono type variables uo_list_multi_mono boolean string iuo_lmm ib_select_mono ias_items[] public subroutine of_mono () ib_select_mono = true iuo_lmm.multiselect = false public subroutine of_multi () ib_select_mono = false iuo_lmm.multiselect = true public function integer of_recup () integer li, li_items li_items = 0 IF ib_select_mono THEN ias_items[1] = iuo_lmm.selecteditem ( ) return 1 ELSE for li = 1 to iuo_lmm.totalitems() if iuo_lmm.state(li) = 1 then li_items++ ias_items[li_items] = iuo_lmm.text(li) Pascal Buguet Imprimé le 19 août 2004 Page 31

next return li_items END IF end function public subroutine of_init (any auo_list) iuo_lmm = auo_list end function 1.12.1.5 L'interface utilisatrice 1.12.1.6 Les scripts Cb_mono_clicked lb_multi_mono.uof_init ("Mono") Cb_multi_clicked lb_multi_mono.uof_init("multi") Cb_transferer_clicked int li_retour,li_ctr lb_resultat.reset() if isvalid(lb_multi_mono.inv_list_multi_mono) then li_retour = lb_multi_mono.inv_list_multi_mono.of_recup() for li_ctr = 1 to li_retour lb_resultat.additem(lb_multi_mono.inv_list_multi_mono.ias_ items[li_ctr]) next else messagebox("","instance invalide") lb_multi_mono.uof_destroy() Pascal Buguet Imprimé le 19 août 2004 Page 32

1.12.2 Service de classe : un autre exemple une dw en mono ou multi sélection - un seul service de classe. 1.12.2.1 Les schémas Uo_dw n_cst_dw_select N_cst_dw_select Inv_select Uo_dw idw Boolean Ib_mono Boolean Ib_multi Of_select(ab_select) Of_select_mono(ab_mon o) Of_select_multi(ab_multi ) RowFocusChanging Destructor 1.12.2.2 Les scripts Uo_dw type variables n_cst_dw_select inv_select boolean ib_mono = false boolean ib_multi = false public subroutine of_select (boolean ab_select) inv_select = create n_cst_dw_select inv_select.idw = this event rowfocuschanging IF ib_mono THEN this.selectrow(currentrow,false) this.selectrow(newrow,true) END IF IF ib_multi THEN if isselected(newrow) then this.selectrow(newrow,false) else this.selectrow(newrow,true) Pascal Buguet Imprimé le 19 août 2004 Page 33

END IF event destructor IF isvalid(inv_select) THEN destroy(inv_select) END IF N_cst_dw_Select type variables uo_dw idw public subroutine of_select_mono (boolean ab_mono) if ab_mono then idw.ib_mono = true else idw.ib_mono = false public subroutine of_select_multi (boolean ab_multi) if ab_multi then idw.ib_multi = true else idw.ib_multi = false Pascal Buguet Imprimé le 19 août 2004 Page 34

1.12.2.3 L'interface utilisatrice 1.12.2.4 Les scripts cb_activer_select event clicked dw_clients.of_select(true) cb_desactiver_select event clicked dw_clients.of_select(false) cb_mono_on event clicked IF isvalid(dw_clients.inv_select) THEN dw_clients.inv_select.of_select_mono(true) cb_mono_off event clicked IF isvalid(dw_clients.inv_select) THEN dw_clients.inv_select.of_select_mono(false) cb_multi_on event clicked IF isvalid(dw_clients.inv_select) THEN dw_clients.inv_select.of_select_multi(true) cb_multi_off event clicked IF isvalid(dw_clients.inv_select) Pascal Buguet Imprimé le 19 août 2004 Page 35

THEN dw_clients.inv_select.of_select_multi(false) dw_clients event constructor SettransObject(sqlca) Pascal Buguet Imprimé le 19 août 2004 Page 36