IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Auteur : Shwin
Version : 27/08/2004
Création d'un thread dans access
Versions : 2000 et supérieures

Même si VB n'est pas fait pour cela, il peut être utile parfois de créer un ou plusieurs thread. Ceci doit bien entendu être limité car VB n'est pas du tout à l'aise dans la gestion des threads (pas plus de 2 ou 3). De plus la gestion de ces derniers étant directement confiée à windows, cela peut rendre votre système instable.

Formulaire:

Private Sub Commande0_Click() hThread = CreateThread(ByVal 0&, ByVal 0&, AddrOf("CallBackFunc"), _ ByVal 0&, ByVal 0&, hThreadID) hThread2 = CreateThread(ByVal 0&, ByVal 0&, AddrOf("CallBackFunc2"), _ ByVal 0&, ByVal 0&, hThreadID2) CloseHandle hThread 'ferme le handle CloseHandle hThread2 Dim e As Long e = TerminateThread(hThread, 0) 'ferme le thread e = TerminateThread(hThread2, 0) End Sub
Module:

Option Compare Database Option Explicit Public i, i2 As Integer Public hThread As Long, hThreadID As Long Public hThread2 As Long, hThreadID2 As Long Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Public Declare Function IsWindowVisible Lib "user32" _ (ByVal hwnd As Long) As Long Public Declare Function GetCurrentVbaProject _ Lib "vba332.dll" Alias "EbGetExecutingProj" _ (hProject As Long) As Long Public Declare Function GetFuncID _ Lib "vba332.dll" Alias "TipGetFunctionId" _ (ByVal hProject As Long, ByVal strFunctionName As String, _ ByRef strFunctionId As String) As Long Public Declare Function GetAddr _ Lib "vba332.dll" Alias "TipGetLpfnOfFunctionId" _ (ByVal hProject As Long, ByVal strFunctionId As String, _ ByRef lpfn As Long) As Long Public Declare Function CreateThread Lib "kernel32" _ (lpThreadAttributes As Any, ByVal dwStackSize As Long, _ ByVal lpStartAddress As Long, lpParameter As Any, _ ByVal dwCreationFlags As Long, lpThreadID As Long) As Long Public Declare Function TerminateThread Lib "kernel32" _ (ByVal hThread As Long, ByVal dwExitCode As Long) As Long Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Function CallBackFunc() As Long i = i + 1 End Function Public Function CallBackFunc2() As Long i2 = i2 + 2 End Function Public Function AddrOf(strFuncName As String) As Long Dim hProject As Long Dim lngResult As Long Dim strID As String Dim lpfn As Long Dim strFuncNameUnicode As String Const NO_ERROR = 0 strFuncNameUnicode = StrConv(strFuncName, vbUnicode) Call GetCurrentVbaProject(hProject) If hProject <> 0 Then lngResult = GetFuncID( _ hProject, strFuncNameUnicode, strID) If lngResult = NO_ERROR Then lngResult = GetAddr(hProject, strID, lpfn) If lngResult = NO_ERROR Then AddrOf = lpfn End If End If End If End Function
Noter que addrof sert uniquement dans access97, depuis access2000 addressof est pris en compte. Comment le prouver ?: Placez un point d'arrêt sur callbackfunc ensuite exécuter le code via le bouton et regardez la valeur de i2, celle-ci est incrémentée de 2 alors que normalement sans thread, il aurait fallu attendre la fin de l'instruction avant de passer à une autre ligne de commande, c'est ce qu'on appelle la programmation séquentielle. Ici l'appel de callbackfunc et callbackfunc2 se font en même temps. Maintenant essayez ceci:

Private Sub Commande0_Click() Dim e As Long e = CallBackFunc e = CallBackFunc2 End Sub
Remarque : I2 n'est pas incrémenté quand on exécute la procédure callbackfunc. Normal puisque ce code est séquentiel.


Auteur : Tofalu
Version : 28/01/2005
Page de l'auteur
Définir les options de démarrage en VBA
Versions : 2000 et supérieures

Tout d'abord, ajouter une référence Microsoft DAO à votre projet (sous VBA, outils, références)
Dans un module :

Public Enum Demarrage AutoriserMenuContextuel NomTitreApplication AutoriserMenuComplet AutoriserTouchesSpeciales AfficherFenetreBD AfficherBarreEtat AfficherBarreOutils AutoriserModificationBarreOutils NomIcone NomFormualireDemarrage NomMenuContextuel NomBarreMenu End Enum Public Sub ChangerPropriete(Nom As Demarrage, Valeur) Dim db As DAO.Database Set db = CurrentDb Dim NomProp As String NomProp = NomPropriete(Nom) If testProperty(db, NomProp) Then db.Properties(NomProp).Value = Valeur Else db.Properties.Append db.CreateProperty(NomProp, TypePropriete(Nom), _ Valeur, False) End If 'Si on modifie le titre, alors prendre la modification ' en compte immédiatement If NomProp=1 then Application.RefreshTitleBar End Sub Private Function testProperty(Objet As Object, Nom As String) As Boolean On Error GoTo err Dim Prop As DAO.Property Set Prop = Objet.Properties(Nom) testProperty = True err: End Function Private Function NomPropriete(Valeur As Demarrage) As String Select Case Valeur Case 0 NomPropriete = "AllowShortcutMenus" Case 1 NomPropriete = "AppTitle" Case 2 NomPropriete = "AllowFullMenu" Case 3 NomPropriete = "AllowBypassKey" Case 4 NomPropriete = "StartupShowDBWindow" Case 5 NomPropriete = "StartupShowStatusBar" Case 6 NomPropriete = "AllowBuiltInToolbars" Case 7 NomPropriete = "AllowToolbarChanges" Case 8 NomPropriete = "AppIcon" Case 9 NomPropriete = "StartupForm" Case 10 NomPropriete = "StartupShortcutMenuBar" Case 11 NomPropriete = "StartupMenuBar" End Select End Function Private Function TypePropriete(Valeur As Demarrage) As Integer Select Case Valeur Case 1, 8, 9, 10, 11 TypePropriete = dbText Case Else TypePropriete = dbBoolean End Select End Function
Voici un exemple d'utilisation :

'choisir l'icone ChangerPropriete NomIcone, "c:\fich.ico" 'Choisir la barre de menu ChangerPropriete NomBarreMenu, "MaBarre" 'Choisir le nom de l'application ChangerPropriete NomTitreApplication, "MonApplication" 'masquer le fenêtre de BD au démarrage ChangerPropriete AfficherFenetreBD, False 'interdire la modification des barres d'outils ChangerPropriete AutoriserModificationBarreOutils, False

Même si les informations sont enregistrées à la fin de ce traitement, celles-ci ne prendront effet qu'au prochain démarrage de l'application. Exception : la modification du titre de la fenêtre Access peut être prise en compte immédiatement grâce à la méthode RefreshTitleBar.


Auteur : Thogal
Version : 27/08/2004
Désactiver/Activer le bouton fermeture du menu système de la fenêtre Access.
Versions : 97 et supérieures

Pour désactiver
Déclarer dans un module indépendant :

Private Declare Function GetSystemMenu Lib "user32" _ (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Public Const SC_CLOSE = &HF060& Public Const MF_BYCOMMAND = &H0& Public Sub DesacFermeture() Dim hSysMenu As Long hSysMenu = GetSystemMenu(Application.hWndAccessApp, False) RemoveMenu hSysMenu, SC_CLOSE, MF_BYCOMMAND End Sub
Ensuite, utiliser par exemple sur chargement d'un formulaire (idéalement le menu général) :

DesacFermeture
Pour activer

Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long Public Sub ReactiveFermeture() Dim hSysMenu As Long hSysMenu = GetSystemMenu(Application.hWndAccessApp, True) DrawMenuBar hSysMenu End Sub

Auteur : Tofalu
Version : 05/03/2005
Page de l'auteur
Téléchargez le zip
Importer des données depuis un fichier texte qui ne possède pas de délimiteur
Cet exemple de code permet d'importer des données depuis un fichier texte. La caractéristique de ce fichier texte est que les enregistrements sont mis les uns à la suite des autres sans séparateur. Nous ne connaissons que la taille des différents champs.

Un exemple de fichier texte :

0001WARIN Christophe0002BALTAZARD Marie 0004DUPONT Jacques 0005PIERRE Louis 0006HUGUES Hugo 0007PARQ Patrice
Pour importer un tel fichier, nous allons créer une table correspondante avec les mêmes champs, à savoir :

  • Un champ Numero de type entier.
  • Un champ Nom de type texte.
  • Un champ Prénom de type texte

Puis dans un module, nous allons créer un type Enregistrement qui correspondra à une occurence dans notre fichier texte.

Private Type enregistrement Num As String * 4 'Numero sur 4 caractères Nom As String * 10 'Nom sur 10 caractères Prenom As String * 10 'prenom sur 10 caractères End Type
Puis une procédure pour lire le fichier en accés direct :

Public Sub lireFichier(chemin As String) On Error GoTo err Dim Fichier As Integer, numenr As Long Dim Client As enregistrement Dim NbErreur As Long Dim Stopper as boolean stopper = False 'recupere un numero de fichier libre Fichier = FreeFile 'Ouvre le fichier Open chemin For Random As Fichier Len = Len(Client) numenr = 1 'parcours le fichier While Not EOF(Fichier) And Not stopper Get 1, numenr, Client 'si l'enregistrement n'est pas vide With Client If .Nom <> "" Then 'inserer dans la table NbErreur = NbErreur + Insererdanstable(CLng(.Num), _ .Nom, .Prenom, stopper) End If End With 'augmente le numero de l'enregistrement à lire numenr = numenr + 1 Wend 'Affiche le resume MsgBox "Insertion terminée avec : " & _ NbErreur & " erreur(s)", vbInformation, _ "Insertion..." GoTo fin err: 'si erreur avertit l'utilisateur MsgBox "Echec" & vbCrLf & vbCrLf & _ err.Description, vbCritical, "Insertion..." fin: 'Ferme le fichier Close Fichier End Sub
L'ouverture se fait en mode direct grâce à l'instruction Open for random. Ensuite, il faut passer à la même instruction la longueur en octet d'un enregistrement. Cela correspond à la longueur de la variable Client. Enfin, il faut lire chaque enregistrement grâce à l'instruction Get en passant le numéro de l'enregsitrement en question (NumEnr), jusqu'à atteindre la fin du fichier (fonction EOF).

Dans l'instruction Get, le premier paramètre correspond à l'octet de l'enregistrement concerné à lire. En général, on s'interresse à la globalité des données. La lecture commence donc à l'octet 1. Le second est, comme nous l'avons dit plus haut, le numéro de l'enregistrement. Enfin le troisième est une variable qui va recevoir les données.

Il faut ensuite rajouter une procédure qui enregistrera les données dans notre base de données :

Private Function Insererdanstable(VNumero As Long, _ VNom As String, VPrenom As String,ByRef Stopper as Boolean ) As Long On Error GoTo err Dim SQL As String 'Créer la requête d'insertion SQL = "INSERT INTO Tbl_Client (Numero,nom,prenom) VALUES " & _ "(" & VNumero & "," & AjouterQuote(VNom) & "," & _ AjouterQuote(VPrenom) & ")" CurrentDb.Execute SQL Exit Function err: Insererdanstable = 1 MsgBox "impossible d'insérer : " & vbcrl & _ VNumero & vbCrLf & _ VNom & vbCrLf & _ VPrenom & vbCrLf & vbCrLf & _ err.Description, vbCritical, "Insertion" If MsgBox("voulez vous continuer ?", vbQuestion + vbYesNo, _ "Insertion") = vbNo Then stopper = True End Function Private Function AjouterQuote(Chaine As String) As String 'enleve les caractère nuls Chaine = Replace(Chaine, Chr(0), "") 'Ajoute " de chaque coté de la chaine et 'double les guillemets à l'intérieur de 'la chaine et elimine les espaces AjouterQuote = Chr(34) & Trim$(Replace(Chaine, Chr(34), _ Chr(34) & Chr(34))) & Chr(34) End Function
En cas d'erreur d'insertion, un message demande à l'utilisateur s'il veut continuer. Si il répond Non, le booléen Stopper est fixé à true ce qui aura pour effet de faire sortir le programme de la boucle de lecture ici :

While Not EOF(Fichier) And Not stopper
Pour comprendre d'avantage le fonctionnement, je vous invite à télecharger le fichier zip qui contient l'ensemble de l'application.


Auteur : extros
Version : 27/08/2004
Supprimer le menu systeme de la barre de titre access
Versions : 97 et supérieures

Dans un module :

'Declaration de l'API Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long) As Long ' Déclare les constantes Global Const GWL_STYLE = (-16) Global Const WS_SYSMENU = &H80000 ' Structure Rect utilisée par l'api Type RECT Left As Long top As Long Right As Long Bottom As Long End Type Function RemoveSystemMenu(hwnd As Long) Dim OldStyle As Long, NewStyle As Long On Error Resume Next ' Recupere le style de la fenêtre OldStyle = GetWindowLong(hwnd, GWL_STYLE) ' Créer le style l'identique sans la croix NewStyle = OldStyle And Not WS_SYSMENU 'Affecte le nouveau style OldStyle = SetWindowLong(hwnd, GWL_STYLE, NewStyle) End Function
Appel de la procédure pour supprimer la menu système de la barre de titre access:

RemoveSystemMenu(Application.hWndAccessApp)


Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004-2005 Maxence Hubiche Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.