[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.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25144
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

[Basic] Gestion dynamique de dialogue

Message par Dude »

Voici une base de départ pour fabriquer dynamiquement une boîte de dialogue et quelques contrôles (boutons, liste ou case à cocher) :
Capture-1.png
Capture-1.png (8.7 Kio) Consulté 8654 fois
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

'************************************************************
'   Ce code vous est fourni sous licence CECILL
'   Support depuis le forum officiel francophone
'   http://forum.openoffice.org/fr
'   Version 1.3 du 17/08/2018
'************************************************************

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, 140, "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, 120, 50, 14, "dlgValide", "OK", "ValideOuAnnule" )
   Dlg_Bouton( 145, 120, 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, 78, 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 contrôle fichier
   ' + Position X/Y
   ' + largeur / hauteur
   ' + infobulle
   Dlg_fichier( 5, 90, 180, 14, "Sélectionnez un fichier à joindre")
      
   ' Un hyperlien
   ' + Position X/Y
   ' + largeur / hauteur
   ' + nom affiché
   ' + URL
   Dlg_hyperlien( 10, 122, 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

Sub Dlg_Fichier( x As Long, y As Long, larg As Long, haut As Long, cInfoBulle As String )
   oModele = oDlgModele.createInstance("com.sun.star.awt.UnoControlFileControlModel")

   oModele.Name = "FichierJoint"
   oModele.TabIndex = nNbControles
   oModele.PositionX = x
   oModele.PositionY = y
   oModele.Width = larg
   oModele.Height = haut
   oModele.HelpText = cInfoBulle
   oModele.Border = 1
   
   nNbControles = nNbControles + 1
   
   oDlgModele.insertByName("FichierJoint", 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
  • 1.3 : contrôle chemin vers fichier
8)
Dernière modification par Dude le 17 août 2018 16:44, modifié 2 fois.
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25144
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

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

Message par Dude »

Suite du fil avec cette fois, le contrôle de table :
controle_table.png
controle_table.png (10.7 Kio) Consulté 14983 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

'************************************************************
'   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
IdOOle de la suite
IdOOle de la suite
Messages : 25144
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

[Basic] Gestion dynamique de dialogue : graphique

Message par Dude »

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

'************************************************************
'   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
IdOOle de la suite
IdOOle de la suite
Messages : 25144
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

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

Message par Dude »

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é 14136 fois
Copier / coller le code ci-dessous dans un module Basic de votre choix et exécuter la macro Main

Code : Tout sélectionner

'************************************************************
'   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
IdOOle de la suite
IdOOle de la suite
Messages : 25144
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

[Basic] Dialogue message étendu

Message par Dude »

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é 14117 fois
stop_essaye_ignore.png
stop_essaye_ignore.png (9.15 Kio) Consulté 14117 fois

Code : Tout sélectionner

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
IdOOle de la suite
IdOOle de la suite
Messages : 25144
Inscription : 03 mars 2006 08:45
Localisation : 127.0.0.1
Contact :

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

Message par Dude »

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é 13675 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

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 
Suricate-1946
NOOuvel adepte
NOOuvel adepte
Messages : 18
Inscription : 21 juil. 2018 14:09

Re: [Basic] Gestion dynamique de dialogue

Message par Suricate-1946 »

Bonjour Dude

Un grand MERCI à vous pour toutes les informations et explications que vous avez mises à ma disposition.
J’espère qu’avec tout cela je parviendrai à faire ce que je souhaite. Il est vrai que nouveau dans l’utilisation du Basic d’OpenOffice, je suis un peu dérouté par rapport aux langages que j’utilisais il y a trente ans et plus ; à savoir macros de Multiplan, Clipper 5 et Nantucket, puis Windev.
Je vais donc m’y atteler et je ne manquerai pas de vous informer lorsque j’aurai terminé.
Encore merci.
Cordialement
Suricate-1946


Dernière remontée par Dude le 17 août 2018 16:44.
AOO 4.1.11 - Windows 10 - 64 bits
Verrouillé