Gestion dynamique des items - bien plus interessant que les tableaux dynamiques

Soyez le premier à donner votre avis sur cette source.

Vue 6 054 fois - Téléchargée 713 fois

Description

Tout le monde a recours dans la programmation à des tableaux dynamiques, besoin de validation de valeurs/paramètres et pourquoi pas faire du rangement dans ses variables.

Cette DLL que je viens de coder pour mes besoins personnels je me demande bien comment je pourrais encore programmer sans elle, tellement elle a des possibilités infinies et comme toujours je l'ai conçu en prenant compte de beaucoup de considérations dont les exigences sont la simplicité, l'efficacité et l'interactivité.

Le principe est simple.
Les Items sont stockés en 4 variables (Catégorie, Nom, Type, Valeur)
Ce qui signifie que les Items peuvent avoir le même nom mais dans 2 catégories différentes. Le système contrôlera que la valeur envoyé est conforme au Type (Texte, Numérique, Date/Heure, Booléen)
Pour toute opération sur un item il faut associer le couple (Nom, Catégorie).
Toute affectation sur une catégorie existante entraine la modification, meme si AddItem est invoqué.

Il est possibles de supprimer un item comme toute sa catégorie, il est possible de réinitialiser un item ou toute sa catégorie.

La méthode ItemsValues s'applique à une catégorie et permet de recevoir la liste des Items initialisés, on peut au besoin recevoir les informations sur les noms, les types et les valeurs.

on peut bien évidemment lire simplement un item, savoir s'il a été initialisé.

La méthode ValidateItems permet de faire valider une liste de variables par l'utilisateur. On peut décider si l'utilisateur peut valider la liste s'il existe des items vides ou pas.

NB : Pour mon développement personnel, l'utilisateur choisit les couleurs de ses interfaces, et ne travaillant qu'avec des composants personnalisés, j'adapte mes objets à mes besoins, ce qui signifie que le paramètre BackColor ne sera probablement pas utile pour vous.

Je m'arrêtes là, je vous laisse le soin de parcourir et de me faire vos commentaires surtout sur les limites de cet objet.

Il pourrait avoir quelques manquements dans le code, je sais avoir la mauvaise habitude de ne pas revenir sur mes sources mais en général je m'en rend compte en utilisant des petites omissions. Mais je serai très ravis d'avoir le retour de vos tests afin de pouvoir l'optimiser.

Source / Exemple :


'Je vais juste lister les propriétés et méthodes et parleront d'elles même.

'Types
'-----
Public Enum EnumItemDataType
    meTexte = 1
    meNumeric = 2
    meDateTime = 3
    meBoolean = 4
    meUnknown = -1
End Enum

'Propriétés
'-----------
Public Property Get DefaultItemType() As EnumItemDataType

Public Property Let DefaultItemType(ByVal peDefaultItemType As EnumItemDataType)

Public Property Get Item(ByVal psItemName As String, Optional ByVal psCategory As String) As Variant

Public Property Let Item(ByVal psItemName As String, Optional ByVal psCategory As String, ByVal pvItemValue As Variant)

Public Property Get ItemsCount(Optional ByVal psCategory As String) As Long

Public Property Get ItemIndex(ByVal psItemName As String, Optional ByVal psCategory As String) As Long

'Méthodes
'--------
Public Sub AddItem(ByVal psItemName As String, Optional ByVal psCategory As String, Optional ByVal pvItemValue As Variant, Optional peItemType As EnumItemDataType = meTexte)

Public Function IsItemInitialized(ByVal psItemName As String, Optional ByVal psCategory As String) As Boolean

Public Sub ValidateItems(Optional ByVal psCategory As String, Optional ByVal plCaptionWidth As Long = m_def_CaptionWidth, Optional ByVal pnBackColor As OLE_COLOR = &H8000000F, Optional ByVal pbItemNullAllow As Boolean = True)

Public Property Get ItemsValues(Optional ByVal psCategory As String, Optional ByRef paItemsNames As Variant, Optional ByRef paItemsTypes As Variant) As Variant

Public Sub ClearValues(Optional ByVal psCategory As String, Optional ByVal psItemName As String)

Public Sub RemoveItems(Optional ByVal psCategory As String, Optional ByVal psItemName As String)

Conclusion :


J'ai inclut la DLL cette fois pour ceux qui n'ont pas VB.

Je pense devoir beaucoup à ce site pour avoir aider de passer de Access à VB, alors quand je suis trop absent je pense à ajouter des sources utiles venant de mes plus recents travaux, mais pas tous, c sûr, lol.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009
-
Je prends le cas de tables de references dans une applis, en général pour ce cas on a besoin que Ajouter/Modifier/Supprimer/Visualiser, de ce fait on peut aisement penser le faire avec des forms dynamiques.

Les informations des champs de tables sont etockes dans une table ainsi que le comportement de chaque (caption, required, rowsource, AutoIncrement, LimitToList, InputMask, ....). Soit au départ on charge tous les champs avec instruction du genre moClsItems("<Nom propriete>", "<Nom Table>/<Nom Champ>") = ..., soit on le fais a la demande de lutilisateur.

Mais pour ne pas recharger une table 2 fois, il suffit de stocker moClsItems.AddItem "<Nom Table>","DEJA LU", True, meBoolean et apres il suffira de il suffira de tester if moClsItems(<Nom Table>, "DEJA LU") Then Call InitTable (<Nom Table>).

Comme je disais il y'a des possibiliés infinie d'utilisation.

De même supposons que pour un logiciel de cotation (voir facturation, mais pas tout a fait) par exemple, on a des rubriques qui dependent des fonctions voir une petite illustration dans ma source http://www.vbfrance.com/codes/DLL-EXECUTER-FONCTIONS-PROCEDURES-EXTERNES-TON-APPLI-MEME_47010.aspx on peut utiliser cette DLL pour faire valider les valeurs par l'utilisateur.
De ce fait pour chaque rubrique de cotation ou de facturation (les 2 sont possibles) d'associer dans leur table un champs formule de calcul qui sera quelque du genre "[%_Poids]*[%_Taux]" ou encore plus complexe une vrai fonction en language de script. Il suffit d'analyser le texte pour rechercher les paramètres, dans mon cas tous les mots entre "[%_" et "]" rien de plus simple qu'une petite fonction Public Function SplitSNA(ByVal psText As String, ByVal psLeftSeparator As String, ByVal psRightSeparator As String) As Variant, tous les parametres sont passes controles dans moClsItems pour voir si elles sont déjà initialisées sinon utiliser ValidateItems pour que l'utilsateur les renseigne.Apres il suffit d'utiliser une boucle elementaire pour remplacer les variables dans le texte par les valeurs. Reste plus qu'à utiliser la fonction Public Function EvalExpression(ByVal psExpression As String, Optional ByVal psLanguage "VBScript", Optional ByVal peType As EnumDataTypeSimplified meTexte) As Variant
se trouvant dans cette source pour faire le calcul.

La fonction SplitSNA est aussi simple que ceci:
Public Function SplitSNA(ByVal psText As String, ByVal psLeftSeparator As String, ByVal psRightSeparator As String) As Variant
Dim lPosDebut As Long, lPosFin As Long, sArray As String

lPosDebut = InStr(psText, psLeftSeparator)
Do While lPosDebut > 0
psText = Mid(psText, lPosDebut + Len(psLeftSeparator))
lPosFin = InStr(psText, psRightSeparator)
If lPosFin <> 0 Then
sArray = sArray & psLeftSeparator & psRightSeparator & Left(psText, lPosFin - 1)
lPosDebut = InStr(lPosFin + 1, psText, psLeftSeparator)
Else
Exit Do
End If
Loop
SplitSNA = Split(Mid(sArray, Len(psLeftSeparator & psRightSeparator) + 1), psLeftSeparator & psRightSeparator)
End Function

Voila assez expliqué pour être bien clair sur les possibilités d'aide de celle DLL et les grands de son utilisation chez moi.

A+
ASIMENGO
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009
-
Je ne suis pas toujours tres complet pour expliquer mes sources, mais il faut noter que je traite également de facon tres simple et aise le probleme de form avec contrôles dynamiques. Les contrôles sont construits en fonction du nombre d'items dans le form et le dimensionnement de la form est consequent. Le resize automatique de toute la form y est traité y est traité et il montre une des méthodes simples pour le faire. Il n'est pas important pour le resize de se lancer dans des calculs vectorielles, il faut delimiter la form en secteur en utilisant soit des picturebox, soit des frames, ... et avoir une vue d'ensemble pour le resize plutot qu'un resize vectoriel sur chaque contrôle.

Pour mon usage personnel je n'utilise que des form à contrôles dynamiques, toute la structure de la form se trouve dans une table, et on peut indiquer le nombre de colonnes, scroll auto.

C'est important de le préciser afin d'y jeter un coup d'oeil si ca peut être utile.

A+
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009
-
J'allais oublier un élément plutôt très utile. L'utilisateur peut saisir des expressions directement dans les textbox si le cas se presente et le système fera le calcul il suffit de précéder le texte par "=".
Par exemple =Now() donne la date/heure de l'instant, =Date() la date du jour, toute autre forme de calcul est possible, =15 + sin(34) + .....

J'ai donc un petit bout de code qui permet d'évaluer toute forme d'expressions en utilisant le language de script.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.