[Basic] Gestion dynamique de dialogue

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

[Basic] Gestion dynamique de dialogue

Messagepar Dude » 14 Sep 2008 15:49

Voici une base de départ pour fabriquer dynamiquement une boîte de dialogue et quelques contrôles (boutons, liste ou case à cocher) :

_no_problemo.png

Bien que ce code ait l'air très pratique, il est cependant beaucoup plus simple de créer vos dialogues à l'aide de l'EDI (facilité pour le placement des contrôles ou gestion des évènements). Car avec un dialogue dynamique, vous allez devoir tout gérer vous-même. Cela risque de faire des scripts d'une longueur non négligeable et donc, du code difficilement maintenable.

Bien que la balise indiquée (Basic) indique que ce code est général, il est recommandé de mentionner avec quel module (Writer, Calc, etc) vous l'utilisez. Notamment pour l'interface entre le dialogue et l'application qui l'appelle.

Copier / coller le code ci-dessous dans un module Basic de votre choix et exécuter la macro Main
Code : Tout sélectionner   AgrandirRéduire
'************************************************************
'   Ce code vous est fourni sous licence CECILL
'   Support depuis le forum officiel francophone
'   http://forum.openoffice.org/fr
'   Version 1.2 du 15/03/2016
'************************************************************

Private oDlgModele As object
Private oDlgControle As object
Private nNbControles As Long
Private nbreOrdi As Long
Private nbreImpr As Long
Private nbreServ As Long
Private bOK As Boolean

Sub Main
   nbreOrdi = 0
   nbreImpr = 0
   nbreServ = 0
   bOK = False
   
   ' Création du dialogue :
   ' + Position X et Y
   ' + Largeur et hauteur
   ' + Titre
   Dlg_Creation( 60, 50, 200, 120, "Compteur du parc" )
   
   ' Un libellé
   Dlg_Libelle( 5, 10, 100, 14, "lbl1", "Ajoutez un matériel dans le parc :" )
   
   ' Boutons OK et Annule
   ' + Position X et Y
   ' + Largeur et hauteur
   ' + Nom logique, titre et nom du listener (optionnel)
   Dlg_Bouton(  90, 100, 50, 14, "dlgValide", "OK", "ValideOuAnnule" )
   Dlg_Bouton( 145, 100, 50, 14, "dlgAnnule", "Annuler", "ValideOuAnnule" )
   ' Boutons classiques avec une procédure dédiée
   Dlg_Bouton( 5, 30, 50, 14, "actionOrdi", "Ordinateur" )
   Dlg_Bouton( 5, 50, 50, 14, "actionImpr", "Imprimante" )   
   
   ' Une case à cocher
   ' + Position X et Y
   ' + Largeur et hauteur
   ' + Nom logique, titre et nom du listener (optionnel)
   Dlg_Coche( 60, 32, 60, 14, "cocheWin", "Système Windows", True )
   
   ' Une zone de texte   
   ' + Position X et Y
   ' + Largeur et hauteur
   ' + Nom logique, contenu (optionnel)
   ' + nom du listener (optionnel)
   Dlg_Texte( 118, 30, 60, 14, "txtOS", "Vista")
     
   ' Une liste déroulante
   ' + Position X et Y
   ' + Largeur et hauteur
   ' + Nom logique, contenu
   ' + Déroulante (vrai) ou fixe (false)
   ' + nom du listener (optionnel)
    contenu = Array ("Jet d'encre","Laser","Aiguille")
   Dlg_Liste( 60, 50, 60, 34, "lstImpr", contenu, 0)
   
   ' Un hyperlien
   ' + Position X/Y
   ' + largeur / hauteur
   ' + nom affiché
   ' + URL
   Dlg_hyperlien( 10, 102, 60, 80, "Propulsé par Dude", "http://forum.openoffice.org/fr")
   
   ' Affichage du dialogue une fois construit
   Dlg_Affiche()
   
   ' Affichage du résultat si bOK
   if bOK then
       MsgBox ("Le parc se compose de "& nbreOrdi &" ordinateur(s) "& _
                                  nbreImpr &" imprimante(s) ")
   end if
End Sub


'************************************************************
'   Description des contrôles
'************************************************************
Sub Dlg_Creation( x As Long, y As Long, larg As Long, haut As Long, cTitre As String )
   oDlgModele = createUnoService( "com.sun.star.awt.UnoControlDialogModel" )
   
   oDlgModele.PositionX = x
   oDlgModele.PositionY = y
   oDlgModele.Width = larg
   oDlgModele.Height = haut
   oDlgModele.Title = cTitre

   oDlgControle = createUnoService( "com.sun.star.awt.UnoControlDialog" )
   oDlgControle.setModel( oDlgModele )

   nNbControles = 0
   
End Sub

Sub Dlg_Bouton( x As Long, y As Long, larg As Long, haut As Long, cNom As String, cLib As String,_
                  Optional cNomListener As String )
     
   oBoutonModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlButtonModel" )

   oBoutonModele.PositionX = x
   oBoutonModele.PositionY = y
   oBoutonModele.Width = larg
   oBoutonModele.Height = haut
   oBoutonModele.Name = cNom
   oBoutonModele.TabIndex = nNbControles
   oBoutonModele.Label = cLib
   
   oDlgModele.insertByName( cNom, oBoutonModele )
   oBoutonControle = oDlgControle.getControl( cNom )

   ' Création du listener
   If IsMissing( cNomListener ) Then
      cNomListener = cNom
   EndIf
   oActionListener = CreateUnoListener( cNomListener + "_", "com.sun.star.awt.XActionListener" )
   oBoutonControle.addActionListener( oActionListener )
     
   nNbControles = nNbControles + 1
End Sub

Sub Dlg_Texte( x As Long, y As Long, larg As Long, haut As Long, cNom As String, _
            Optional cTexte As String, _
                Optional cNomListener As String )
     
   oTexteModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlEditModel" )

   oTexteModele.PositionX = x
   oTexteModele.PositionY = y
   oTexteModele.Width = larg
   oTexteModele.Height = haut
   oTexteModele.Name = cNom
   oTexteModele.TabIndex = nNbControles
   oTexteModele.Text = cTexte
   
   oDlgModele.insertByName( cNom, oTexteModele )
   oTexteControle = oDlgControle.getControl( cNom )

   ' Création du listener
   If IsMissing( cNomListener ) Then cNomListener = cNom
   oActionListener = CreateUnoListener( cNomListener + "_", "com.sun.star.awt.XFocusListener" )
   oTexteControle.addFocusListener( oActionListener )
     
   nNbControles = nNbControles + 1
End Sub

Sub Dlg_Liste( x As Long, y As Long, larg As Long, haut As Long, cNom As String, _
                  contenu As Array, _
                  Optional bDeroule As Boolean, _
                  Optional cNomListener As String )
     
   oListeModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlListBoxModel" )

   oListeModele.PositionX = x
   oListeModele.PositionY = y
   oListeModele.Width = larg
   oListeModele.Height = haut
   oListeModele.Name = cNom
   oListeModele.TabIndex = nNbControles
   oListeModele.DropDown = False
   If bDeroule Then
      oListeModele.DropDown = 1
   EndIf
   
   oDlgModele.insertByName( cNom, oListeModele )
   oListeControle = oDlgControle.getControl( cNom )
   
   oListeControle.addItems( contenu(), 0)
   ' Nombre d'éléments affichable dans la liste : maximum 5
   If ( UBound(contenu) > 5 ) Then
         nbElements = UBound(contenu)+1
   Else
         nbElements = 5
   EndIf
   oListeControle.setDropDownLineCount(nbElements)

   ' Création du listener
   If IsMissing( cNomListener ) Then
      cNomListener = cNom
   EndIf
   oActionListener = CreateUnoListener( cNomListener + "_", "com.sun.star.awt.XActionListener" )
   oListeControle.addActionListener( oActionListener )

   nNbControles = nNbControles + 1
End Sub

Sub Dlg_Coche( x As Long, y As Long, larg As Long, haut As Long, cNom As String, cLib As String,_
                  Optional bCoche As Boolean,_
                  Optional cNomListener As String )
   
   oCocheModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlCheckBoxModel" )
   ' Initialize the button model's properties.
   oCocheModele.PositionX = x
   oCocheModele.PositionY = y
   oCocheModele.Width = larg
   oCocheModele.Height = haut
   oCocheModele.Name = cNom
   oCocheModele.TabIndex = nNbControles
   oCocheModele.Label = cLib
   oCocheModele.State = 0
   If bCoche Then
      oCocheModele.State = 1
   EndIf
   
   oDlgModele.insertByName( cNom, oCocheModele )
   oCocheControle = oDlgControle.getControl( cNom )

   ' Les boutons doivent avoir une écoute
   ' Création d'une procédure pour recevoir l'événement
   If IsMissing( cNomListener ) Then
      cNomListener = cNom
   EndIf
   oActionListener = CreateUnoListener( cNomListener + "_", "com.sun.star.awt.XActionListener" )
   oCocheControle.addActionListener( oActionListener )
     
   nNbControles = nNbControles + 1
End Sub

Sub Dlg_Libelle( x As Long, y As Long, larg As Long, haut As Long, cNom As String, cLib As String )
     
   oLibModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlFixedTextModel" )

   oLibModele.PositionX = x
   oLibModele.PositionY = y
   oLibModele.Width = larg
   oLibModele.Height = haut
   oLibModele.Name = cNom
   oLibModele.TabIndex = nNbControles
   oLibModele.Label = cLib
   
   oDlgModele.insertByName( cNom, oLibModele )
   oLibControle = oDlgControle.getControl( cNom )
     
   nNbControles = nNbControles + 1
End Sub

Sub Dlg_Hyperlien( x As Long, y As Long, larg As Long, haut As Long, cNom As String, cURL As String )
   oModele = oDlgModele.createInstance("com.sun.star.awt.UnoControlFixedHyperlinkModel")

   oModele.Name = "Hyperlien"
   oModele.TabIndex = nNbControles
   oModele.PositionX = x
   oModele.PositionY = y
   oModele.Width = larg
   oModele.Height = haut
   oModele.Label = cNom
   oModele.URL = cURL
   oModele.Align = 1   ' 0 : Gauche / 1 : Centre / 2 : Droite
   oModele.Border = 0
   oModele.TextColor = RGB(0,0,255) ' Bleu   
   oModele.Enabled = true
   
   nNbControles = nNbControles + 1
   
   oDlgModele.insertByName("Hyperlien", oModele)
End Sub

'************************************************************
'   Description des procédures
'************************************************************
Sub Dlg_Affiche()
   oDlgControle.setVisible( True )
   oDlgControle.execute()
End Sub

Sub Dlg_Ferme()
   oDlgControle.endExecute()
   oDlgControle.setVisible( False )
End Sub

' Voici maintenant les listeners
Sub actionOrdi_actionPerformed()
   nbreOrdi = nbreOrdi + 1
End Sub

Sub actionImpr_actionPerformed()
   nbreImpr = nbreImpr + 1
End Sub

' Listener unique pour OK ou Annuler
Sub ValideOuAnnule_actionPerformed(oEve)
   If oEve.Source.getModel().Name = "dlgValide" Then
      bOK = True
   EndIf
  ' On ferme le dialogue de toute façon
   Dlg_Ferme()
End Sub

Sub lstImpr_actionPerformed()
  ' On ne fait rien mais on pourrait
End Sub

Sub cocheWin_actionPerformed( oEve )
   MoiMeme = oEve.Source.getModel()
   ' On récupère l'objet txtOS
   Cible = oDlgControle.getControl("txtOS").getModel()
   ' Si case cochée, on change le contenu
   If MoiMeme.State Then
      Cible.Text = "Vista"
   Else
      Cible.Text = ""
   EndIf
End Sub

Sub txtOS_focusLost( oEve )
' Perte du focus de la zone de texte
  MoiMeme = oEve.Source.getModel()
  'Retour couleur de fond en blanc
  MoiMeme.Backgroundcolor = RGB(255, 255, 255)
End Sub

Sub txtOS_focusGained( oEve )
' Prise du focus
  MoiMeme = oEve.Source.getModel()
  ' couleur de fond en jaune pâle
  MoiMeme.Backgroundcolor = RGB(255, 255, 204)
End Sub 


Historique :
  • 1.0 : contrôles bouton, case à cocher et liste / évènement clic bouton
  • 1.1 : contrôle zone de texte / évènement coche, focus texte
  • 1.2 : hyperlien

8)
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 19558
Inscrit le : 03 Mars 2006 09:45
Localisation : 127.0.0.1

[Basic] Gestion dynamique de dialogue : contrôle table

Messagepar Dude » 21 Fév 2014 16:42

Suite du fil avec cette fois, le contrôle de table :

controle_table.png
controle_table.png (10.7 Kio) Consulté 4675 fois

Ce contrôle est pour l'instant, absent de l'EDI permettant de construire les dialogues.
Vous pouvez d'ailleurs voter pour la demande d'amélioration 120066.

Copier / coller le code ci-dessous dans un module Basic de votre choix et exécuter la macro Main
Code : Tout sélectionner   AgrandirRéduire
'************************************************************
'   Ce code vous est fourni sous licence CECILL
'   Support depuis le forum officiel francophone
'   https://forum.openoffice.org/fr
'   Version 1.0 du 21/02/2014
'   Attention : version 3.3 minimum
'************************************************************
Private oDlgModele As object
Private oDlgControle As object
Private oDlgTable As object
Private nTableLigne As integer

Sub Main

   ' Création du dialogue :
   ' + Position X et Y
   ' + Largeur et hauteur
   ' + Titre   
   Dlg_Creation( 60, 50, 180, 120, "Récapitulatif du parc" )
   
   ' Création de la table (grille) :
   ' + Position X et Y
   ' + Largeur et hauteur
   ' + Type de sélection   
   ' + Nom logique et si besoin listener
   Dlg_Table( 10, 10, 150, 100, 1, "zeTable", True)
   
   ' Ajout de deux colonnes (titre + largeur)
   Dlg_Table_Col("Nom", 100)
   Dlg_Table_Col("Valeur", 50)
   
   ' Remplir la table (sous la forme d'un tableau)
   Dlg_Table_Ajout(Array("Ordinateur fixe", 350))
   Dlg_Table_Ajout(Array("Ordinateur portable", 120))
   Dlg_Table_Ajout(Array("Imprimante laser", 40))
   Dlg_Table_Ajout(Array("Imprimante jet d'encre", 70))
   Dlg_Table_Ajout(Array("Serveur", 15))

   Dlg_Affiche()
   
End Sub

Sub Dlg_Creation( x As Long, y As Long, larg As Long, haut As Long, cTitre As String )
   oDlgModele = createUnoService( "com.sun.star.awt.UnoControlDialogModel" )
   with oDlgModele
        .PositionX = x
        .PositionY = y
        .Width = larg
        .Height = haut
        .Title = cTitre
   End with
   oDlgControle = createUnoService( "com.sun.star.awt.UnoControlDialog" )
   oDlgControle.setModel( oDlgModele )
End Sub

Sub Dlg_Table( x As Long, y As Long, larg As Long, haut As Long, _
                  nType As integer, cNom As String, Ecoute As Boolean )
   oDlgTable = oDlgModele.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
   with oDlgTable
      .PositionX = x
      .PositionY = y
      .Width = larg
      .Height = haut
      ' www.openoffice.org/api/docs/common/ref/com/sun/star/view/SelectionType.html
      ' + Aucune = 0
      ' + Unique = 1
      ' + Multiple = 2
      ' + Plage = 3
      .SelectionModel = nType
   End with
   oDlgModele.insertByName( cNom, oDlgTable)
   oTableControle = oDlgControle.getControl( cNom )
   nTableLigne = 0
   
   ' Création du listener
   If Ecoute Then
      oAction = CreateUnoListener( cNom & "_", "com.sun.star.awt.grid.XGridSelectionListener" )
        oTableControle.AddSelectionListener( oAction )
   Endif
End Sub

Sub Dlg_Table_Col( cCol As String, nCol As integer )
   oColModele = oDlgTable.ColumnModel
   oCol = oColModele.createColumn()
   oCol.Title = cCol
   oCol.ColumnWidth = nCol
   oColModele.addColumn(oCol)
End Sub

Sub Dlg_Table_Ajout( Ligne As Array)
   oLigne = oDlgTable.GridDataModel
   nTableLigne = nTableLigne + 1
   oLigne.addRow(nTableLigne, Ligne)
End Sub

Sub Dlg_Affiche()
   oDlgControle.setVisible( True )
   oDlgControle.execute()
End Sub

' ****************************************************************************
' Module d'écoute
' ****************************************************************************
Sub zeTable_selectionChanged(oEve)
   ' Affiche le contenu d'une ligne
   sRes$ = ""
   oSource = oEve.Source
   oLigne = oSource.getSelectedRows()
   oTable = oSource.Model.GridDataModel
   oContenu = oTable.getRowData(oLigne(0))
   For i = 0 to UBound(oContenu) Step 1
      sRes = sRes & CStr(oContenu(i)) & Chr(10)
   Next
   msgBox sRes
End Sub

Sub zeTable_disposing(oEve)
   ' RAS   
End Sub
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 19558
Inscrit le : 03 Mars 2006 09:45
Localisation : 127.0.0.1

[Basic] Gestion dynamique de dialogue : graphique

Messagepar Dude » 01 Oct 2014 16:55

Possibilité d'afficher un graphique dans un dialogue :

dialog_avec_graphique.png

Copier / coller le code ci-dessous dans un module Basic de votre choix et exécuter la macro Main
Code : Tout sélectionner   AgrandirRéduire
'************************************************************
'   Ce code vous est fourni sous licence CECILL
'   Support depuis le forum officiel francophone
'   https://forum.openoffice.org/fr
'   Version 1.0 du 01/10/2014
'************************************************************
Private oDlgModele As object
Private oDlgControle As object
Private aArgs(0) As new com.sun.star.beans.PropertyValue
Private oDude As object

Sub Main
   ' Ouvrir Calc de manière cachée
   Dim Args(0) as new com.sun.star.beans.PropertyValue
   Args(0).Name = "Hidden"
   Args(0).Value = true
   ' Création d'un classeur mais possibilité d'utiliser un existant
   oDoc = StarDesktop.LoadComponentFromUrl("private:factory/scalc","_default",0,Args())
   oFeuille = oDoc.Sheets.getByIndex(0)
   ' avec quelques données
   oFeuille.getCellByPosition(0,1).String = "Ordinateur"
   oFeuille.getCellByPosition(0,2).String = "Imprimante"
   oFeuille.getCellByPosition(0,3).String = "Serveur"
   oFeuille.getCellByPosition(1,1).Value = 43
   oFeuille.getCellByPosition(1,2).Value = 23
   oFeuille.getCellByPosition(1,3).Value = 12
   
   oCell = oFeuille.getCellRangeByPosition(0,0,1,3)
   
   ' Création d'un graphique
   Dim aRect as new com.sun.star.awt.Rectangle
   With aRect
      .X = 0 : .Y = 0 : .Width = 8000 : .Height = 6000
   End with
   oFeuille.Charts.addNewByName("graph", aRect, Array(oCell.RangeAddress), true, true)
   oGraph = oFeuille.Charts.getByName("graph").EmbeddedObject
   ' de type Camembert avec quelques propriétés...
   With oGraph
     .Diagram = oGraph.createInstance("com.sun.star.chart.PieDiagram")
     .DataSourceLabelsInFirstColumn = True
     .DataSourceLabelsInFirstRow = True
     .Title.String = "Parc informatique"
     .Title.CharColor = RGB (200,0,0)
   End With

   ' Création du dialogue puis affichage
   Dlg_Creation( 60, 50, 300, 280, "Graphique" )
   oDlgControle.setVisible( True )
   
   ' Préparer le rendu pour GraphicExportFilter
   oRendu = createUnoService("com.sun.star.graphic.GraphicRendererVCL")
   With aRect
      .X = 0 : .Y = 0 : .Width = 600 : .Height = 500
   End with
   oRendu.setPropertyValue("DestinationRect", aRect)
   oRendu.setPropertyValue("Device", oDlgControle.Peer.createGraphics.Device)   
   aArgs(0).Name  = "GraphicRenderer"
   aArgs(0).Value = oRendu
   
   oDude = createUnoService("com.sun.star.drawing.GraphicExportFilter")
   oDude.setSourceDocument( oFeuille.DrawPage.getByIndex(0) )
   
   oPaintListener = CreateUnoListener("Dlg_", "com.sun.star.awt.XPaintListener")
   oDlgControle.Peer.addPaintListener( oPaintListener )
   
   oDlgControle.execute
   oDoc.close(true)   
End Sub

Sub Dlg_Creation( x As Long, y As Long, larg As Long, haut As Long, cTitre As String )
   oDlgModele = createUnoService("com.sun.star.awt.UnoControlDialogModel")
   With oDlgModele
      .PositionX = x : .PositionY = y : .Width = larg : .Height = haut : .Title = cTitre
   End With
   oDlgControle = createUnoService("com.sun.star.awt.UnoControlDialog")
   oDlgControle.setModel(oDlgModele)
End Sub

Sub Dlg_WindowPaint(oEvt)
   if oEvt.count > 0 then exit sub
   oDude.filter(aArgs())
End sub
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 19558
Inscrit le : 03 Mars 2006 09:45
Localisation : 127.0.0.1

[Basic] Gestion dynamique de dialogue : image animée

Messagepar Dude » 04 Déc 2014 12:08

Depuis la 3.4, possibilité d'utiliser le contrôle SpinningProgressControlModel couplé à AnimatedImagesControlModel
Cette image animée permet de montrer par exemple que l'application est occupée :
toupie.gif
toupie.gif (16.56 Kio) Consulté 3828 fois

Copier / coller le code ci-dessous dans un module Basic de votre choix et exécuter la macro Main
Code : Tout sélectionner   AgrandirRéduire
'************************************************************
'   Ce code vous est fourni sous licence CECILL
'   Support depuis le forum officiel francophone
'   https://forum.openoffice.org/fr
'   Version 1.0 du 04/12/2014
'   Attention : version 3.4 minimum
'************************************************************

Private oDlgControle As object

Sub Main
   ' Création du dialogue puis affichage
   Dlg_Creation( 60, 50, 50, 50, "Toupie" )
   oDlgControle.setVisible( True )
   
   InsereToupie(10, 10, 64, 64)
   
   oDlgControle.execute
End Sub

Sub Dlg_Creation( x As Long, y As Long, larg As Long, haut As Long, cTitre As String )
   oDlgModele = createUnoService("com.sun.star.awt.UnoControlDialogModel")
   With oDlgModele
      .PositionX = x : .PositionY = y : .Width = larg : .Height = haut : .Title = cTitre
   End With
   oDlgControle = createUnoService("com.sun.star.awt.UnoControlDialog")
   oDlgControle.setModel(oDlgModele)
End Sub

Sub InsereToupie( x As Long, y As Long, larg As Long, haut As Long)
   oAnim = CreateUnoService("com.sun.star.awt.AnimatedImagesControl")
   oToupie = CreateUnoService("com.sun.star.awt.SpinningProgressControlModel")
   oAnim.setModel(oToupie)
   
   oAnim.setPosSize(x, y, larg, haut, com.sun.star.awt.PosSize.POSSIZE)
   oDlgControle.addControl("toupie", oAnim)
   oAnim.startAnimation()
End Sub
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 19558
Inscrit le : 03 Mars 2006 09:45
Localisation : 127.0.0.1

[Basic] Dialogue message étendu

Messagepar Dude » 04 Déc 2014 16:33

Toujours depuis la 3.4, on a désormais l'interface XMessageBoxFactory qui permet d'avoir des boîtes de dialogue étendues comme par exemple :
oui_non_annuler.png
oui_non_annuler.png (8.74 Kio) Consulté 3809 fois
stop_essaye_ignore.png
stop_essaye_ignore.png (9.15 Kio) Consulté 3809 fois


Code : Tout sélectionner   AgrandirRéduire
Sub Main
   '************************************************************
   '   Ce code vous est fourni sous licence CECILL
   '   Support depuis le forum officiel francophone
   '   https://forum.openoffice.org/fr
   '   Version 1.0 du 04/12/2014
   '   Attention : version 3.4 minimum
   '************************************************************

   oApp = StarDesktop().getFrames().getByIndex(0)
   oDude = oApp.getContainerWindow()
   oKit = oDude.getToolkit()
   
   oType = com.sun.star.awt.MessageBoxType.QUERYBOX
   ' Pour les autres types de logo de message, consulter :
   ' https://api.openoffice.org/docs/common/ref/com/sun/star/awt/MessageBoxType.html
   oBtn = com.sun.star.awt.MessageBoxButtons.BUTTONS_ABORT_IGNORE_RETRY
   ' Pour les autres combinaisons de boutons, consulter :
   ' https://api.openoffice.org/docs/common/ref/com/sun/star/awt/MessageBoxButtons.html
   
   oMsgBox = oKit.createMessageBox(oDude, oType, oBtn, "Alors", "Cet exemple vous a t-il aidé ?")
   
   nSel = oMsgbox.execute() ' renvoie la constante du bouton sélectionné

   oMsgbox.dispose()
End Sub
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 19558
Inscrit le : 03 Mars 2006 09:45
Localisation : 127.0.0.1

[Basic] Gestion dynamique de dialogue : contrôle Compteur

Messagepar Dude » 30 Mars 2015 11:03

Le contrôle Compteur n'est pas disponible directement dans une boîte de dialogue.
Vous pouvez en profiter pour voter la demande 38900

_compteur.png
_compteur.png (6.88 Kio) Consulté 3367 fois

Voici un exemple pour le créer de manière dynamique.
Copier / coller le code ci-dessous dans un module Basic de votre choix et exécuter la macro Main
Code : Tout sélectionner   AgrandirRéduire
Private oDlgControle As object
Private oDlgModele As object

Sub Main
   '************************************************************
   '   Ce code vous est fourni sous licence CECILL
   '   Support depuis le forum officiel francophone
   '   https://forum.openoffice.org/fr
   '   Version 1.0 du 30/03/2015
   '************************************************************
   ' Création du dialogue puis affichage
   Dlg_Creation( 60, 50, 100, 80, "Contrôle compteur" )
   oDlgControle.setVisible( True )

   Dlg_Compteur(75, 10, 20, 14, "compteur1", 0, 0, 100, 50, 5) 
   Dlg_Compteur(78, 40, 14, 20, "compteur2", 1, 0, 100, 50, 5) 
   Dlg_Libelle(5, 12, 100, 14, "lbl1", "Compteur 1 : 50" )
   Dlg_Libelle(5, 46, 100, 14, "lbl2", "Compteur 2 : 50" )
   
   oDlgControle.execute
End Sub

Sub Dlg_Creation( x As Long, y As Long, larg As Long, haut As Long, cTitre As String )
   oDlgModele = createUnoService("com.sun.star.awt.UnoControlDialogModel")
   With oDlgModele
      .PositionX = x : .PositionY = y : .Width = larg : .Height = haut : .Title = cTitre
   End With
   oDlgControle = createUnoService("com.sun.star.awt.UnoControlDialog")
   oDlgControle.setModel(oDlgModele)
End Sub

Sub Dlg_Libelle( x As Long, y As Long, larg As Long, haut As Long, cNom As String, cLib As String )
   oLibModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlFixedTextModel" )
   With oLibModele   
      .PositionX = x
      .PositionY = y
      .Width = larg
      .Height = haut
      .Name = cNom
      .Label = cLib
   End With
   oDlgModele.insertByName( cNom, oLibModele )
   oLibControle = oDlgControle.getControl( cNom )
End Sub

Sub Dlg_Compteur(x As Long, y As Long, larg As Long, haut As Long, _
      cNom As String, bType As Boolean, min As long, max As long, _
      val As Long, pas As long)
   Dlg_Libelle(x, y, larg, haut, cNom, "" )
   oDude = oDlgControle.getControl(cNom)
   oSpinModele = CreateUnoService("com.sun.star.awt.UnoControlSpinButtonModel")
   oSpin = CreateUnoService("com.sun.star.awt.UnoControlSpinButton")
   With oSpinModele
      .Orientation = bType  ' Horizontal = 0 / Vertical = 1
      .SpinValueMin = min
      .SpinValueMax = max
      .SpinValue = val
      .SpinIncrement = pas
      .HelpText = "Changer la valeur de " & cNom
   End With
   oSpin.setModel(oSpinModele)
   oSpin.createPeer(oDude.Peer.Toolkit, oDude.Peer)
   oSpin.setPosSize( 0, 0, oDude.PosSize.Width, _
                           oDude.PosSize.Height, _
                           com.sun.star.awt.PosSize.POSSIZE )
                                      
   oAction = CreateUnoListener(cNom + "_", "com.sun.star.awt.XAdjustmentListener")
   oSPin.addAdjustmentListener(oAction)
End Sub

Sub compteur1_adjustmentValueChanged( oEve )
   oDlgControle.getControl("lbl1").setText("Compteur 1 : " & oEve.value)
End Sub

Sub compteur2_adjustmentValueChanged( oEve )
   oDlgControle.getControl("lbl2").setText("Compteur 2 : " & oEve.value)
End Sub
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 19558
Inscrit le : 03 Mars 2006 09:45
Localisation : 127.0.0.1


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)