Date: prev next · Thread: first prev next last
2018 Archives by date, by thread · List index


Hi,

I'm using Libreoffice :

Version: 5.2.7.2
Build ID: 1:5.2.7-1
Threads CPU : 2; Version de l'OS :Linux 4.12; UI Render : par défaut; VCL : gtk3;
Locale : fr-FR (fr_FR.UTF-8); Calc: group

Below is a complet macro to manage Vectors of variants (With french coments) . I've got a problem with unitary test (Cf. Sub Main) because call to procedure 'v.Ajouter(duolet)' use always passage by reference instead of a passage by value (ByVal) ! For all that, I delicately manage a passage by value in my function...

I tested with a call to New operator in order to build specifics instances at each call, like this :

        duolet = new __TDuolet
        duolet.key = "MONTAGNE"
        duolet.Item = 3 
        v.Ajouter(duolet)

And it's fine, the duolet variable is a new one instance. But I don't want the caller do all this stuff. I would like easier way to do ...

I'm asking myself if it's a specific bug to my LibreOffice versin, or with Variants and Struct type (__TDuolet) ?

What do you think about that ? What can I do to copy by val the parameter into my function v.Ajouter(duolet) ?

Think you for your help...

Patrick

PS: Macro is below, it's a draft ...

---------------------------------------

REM  *****  BASIC  *****
Option Compatible
Option ClassModule

Option Explicit

Type __TDuolet
        key As String   'l'etiquette de l'objet
        item As Variant 'un objet quelconque
End Type

Private _Items As Variant
Private _n As Long
Private _Titre As String
Private _StepSize As Long

' #PROCEDURE# ==================================================================
' Name...........: Class_Initialize
' Description ...:
' Parameters ....:
' Syntax ........: Class_Initialize
' Return values .: Success - void
'                  Failure - sets @error
' Author ........: Patrick GELIN
' Modified.......:
' Remarks .......:
' Related .......:
' Link ..........:
' Example .......:
Private Sub Class_Initialize()
        _n = 0
        _Titre = Name
        _StepSize = 30
        _Items = DimArray(_StepSize+1)  
End Sub

' #PROCEDURE# ==================================================================
' Name...........: Class_Terminate
' Description ...:
' Parameters ....:
' Syntax ........: Class_Terminate
' Return values .: Success - void
'                  Failure - sets @error
' Author ........: Patrick GELIN
' Modified.......:
' Remarks .......:
' Related .......:
' Link ..........:
' Example .......:
Private Sub Class_Terminate()
End Sub

Rem ***************************************************************************
Rem
Rem PROPRIETES
Rem
Rem ***************************************************************************
Public Property Let Titre(unTitre As String)
        _Titre  = unTitre
End Property

Public Property Get Titre As String
        Titre  = _Titre
End Property

Public Property Get AllItems As Variant
        AllItems = _Items
End Property

Public Property Let StepSize(ByVal delta As Long)
        _StepSize  = delta
End Property

Public Property Get StepSize As Long
        StepSize = _StepSize
End Property

Public Property Get NbElements As Long
        NbElements = _n
End Property

Public Property Get Taille As Long
        Taille = UBound(_Items) - LBound(_Items) + 1
End Property

Public Property Get UBound As Long
        UBound(_Items)
End Property

Public Property Get LBound As Long
        LBound(_Items)
End Property

Rem ***************************************************************************
Rem
Rem METHODES PRIVEES
Rem
Rem ***************************************************************************
Public Sub _Expend(Optional StepSize As Long, Optional isPresserved As Boolean = True)
        
        Dim IndexMax As Long
        
        If IsMissing(StepSize) Then StepSize = _StepSize
        IndexMax = UBound(_Items()) + StepSize
        If isPresserved Then
                Redim Preserve _Items(IndexMax) As Variant
        Else
                Redim _Items(IndexMax) As Variant
        EndIf
End Sub


Rem ***************************************************************************
Rem
Rem METHODES PUBLIQUES
Rem
Rem ***************************************************************************
' #PROCEDURE# ==================================================================
' Name...........: Ajouter
' Description ...: Ajouter un variant au vecteur.
' Parameters ....: Item (variant) : Un variant au vecteur.
' Syntax ........: Ajouter(Item)
' Return values .: N/A
' Author ........: Patrick GELIN
' Modified.......: 06/01/2018
' Remarks .......: ATTENTION : L'attribut ByVal ne fonctionne pas !
                                        'Le parametre Item doit donc avoir une instance spécifique,
                                        'sans réutiliser l'instance d'un autre Item déjà ajouté au 
vecteur
                                        'sinon ce premier aura la valeur de la dernière 
modification !
' Related .......:
' Link ..........:
' Example .......:
Public Sub Ajouter(ByVal Item As Variant)
        
        If (_n + 1) >= UBound(_Items) Then _Expend()         
        _Items(_n) = Item
        _n = _n + 1
End Sub

' #PROCEDURE# ==================================================================
' Name...........: Execute
' Description ...:
' Parameters ....:
' Syntax ........: Execute()
' Return values .: Success - void
'                  Failure - sets @error
' Author ........: Patrick GELIN
' Modified.......:
' Remarks .......:
' Related .......:
' Link ..........:
' Example .......:
Public Sub Retirer(idx As Long)
        Dim i As Long
        
        if idx < 0 Then Exit Sub
        
        for i = idx to (_n - 1) step 1
                _Items(i) = _items(i+1)
        Next
        _n = _n -1
End Sub

Public Sub Inserer(idx As Long, ByVal Item As Variant)
        Dim i As Long
        
        if (idx < 0) OR (idx >= _n) Then Exit Sub
        If (_n + 1) >= UBound(_Items) Then _Expend()
        
        for i = _n to (idx + 1) step -1
                _Items(i) = _items(i-1)
        Next
        _Items(idx) = Item
        _n = _n + 1
End Sub


Public Sub Trace(oDebug As Object, Optional VisiteurTrace As Object)
        Dim i As Long
        Dim sIdx As String
        
        oDebug.Trace(Name, "==================================================")
        oDebug.Trace(Name, "Vecteur : " & Titre)
        oDebug.Trace(Name, "NbElements : " & NbElements)
        oDebug.Trace(Name, "Taille : " & Taille)
        oDebug.Trace(Name, "StepSize : " & StepSize)
        oDebug.Trace(Name, "..................................................")
        for i = LBound(_Items) to _n step 1
                sIdx = format(idx, "0000")
                If IsMissing(VisiteurTrace) Then
                        oDebug.Trace(Name, sIdx & " : " & _Items(i) + Chr(10))
                Else
                        oDebug.Trace(Name, sIdx & " : " & VisiteurTrace.Execute(_Items(i)) + 
Chr(10))
                EndIf
        Next
        oDebug.Trace(Name, "==================================================")
End Sub


Rem ********************************************
Rem Unitary tests
Rem ********************************************
Sub Main
        Dim duolet As __TDuolet
        Dim v As TVecteur
        Dim taille, NbElements As Long
        
        v = New TVecteur
        v.StepSize = 10
        
        taille = v.Taille
        NbElements = v.NbElements
        
        'duolet = new __TDuolet
        duolet.key = "MAISON"
        duolet.Item = 1 
        v.Ajouter(ByVal duolet)
        
        'duolet = new __TDuolet
        duolet.key = "BATEAU"
        duolet.Item = 2
        v.Ajouter(ByVal duolet)

        duolet = new __TDuolet
        duolet.key = "MONTAGNE"
        duolet.Item = 3 
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "FLEUR"
        duolet.Item = 4         
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "SCOTCH"
        duolet.Item = 5 
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "STYLO"
        duolet.Item = 6 
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "ETOILE"
        duolet.Item = 7 
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "INSERE"
        duolet.Item = 8 
        v.Inserer(3, duolet)
        
        v.Retirer(3) 'MAISON
        
        taille = v.Taille
        NbElements = v.NbElements
        
        duolet = new __TDuolet
        duolet.key = "MAISON"
        duolet.Item = 9
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "BATEAU"
        duolet.Item = 10
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "MONTAGNE"
        duolet.Item = 11        
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "FLEUR"
        duolet.Item = 12        
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "SCOTCH"
        duolet.Item = 13        
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "STYLO"
        duolet.Item = 14        
        v.Ajouter(duolet)
        
        duolet = new __TDuolet
        duolet.key = "ETOILE"
        duolet.Item = 15        
        v.Ajouter(duolet)
        
        taille = v.Taille
        NbElements = v.NbElements
        
        Erase v
End Sub


--
To unsubscribe e-mail to: users+unsubscribe@global.libreoffice.org
Problems? https://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
Posting guidelines + more: https://wiki.documentfoundation.org/Netiquette
List archive: https://listarchives.libreoffice.org/global/users/
All messages sent to this list will be publicly archived and cannot be deleted

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.