Dans le processus de développement de logiciels, il existe des problèmes apparemment simples, mais ils sont facilement ignorés par les développeurs ordinaires. L'existence de ces « bugs » affecte la commercialisation de nos logiciels. Vous trouverez ci-dessous plusieurs problèmes rencontrés par l'auteur lors de l'utilisation de Visual Basic pour développer des logiciels. Les solutions sont données ici pour que chacun puisse en discuter et échanger.
1. Empêcher l'application de se charger deux fois
Lorsque notre application s'exécute sous Windows, pendant l'opération, nous la réduisons et la masquons parfois, ou passons au gestionnaire de programme pour d'autres opérations, et souhaitons ensuite accéder à l'application d'origine. Si nous oublions Si vous redémarrez l'application que vous venez de démarrer, deux copies de la même application seront chargées dans la mémoire en même temps. Cela occupe non seulement de l'espace mémoire, mais entraîne également facilement des dysfonctionnements et des pertes de données. Afin d'éviter que cela ne se produise, le programme doit être capable de donner une invite "déjà chargé" ou d'entrer directement dans l'application chargée pour la première fois. Ce problème semble difficile à résoudre. En fait, tant que nous comprenons le mécanisme des applications de gestion Windows, il peut être facilement résolu.
Nous savons que pour chaque application en cours d'exécution, Windows attribue un « Handle » unique et un code de module (Module). Lorsque deux copies du même programme sont exécutées en même temps, les codes de module des deux programmes sont les mêmes. Par conséquent, tant que nous trouvons deux codes de module identiques dans la mémoire, nous savons que deux copies du programme sont en cours d'exécution. et peut le contrôler. Les deux fonctions d'interface GetModuleHandle et GetModuleUsage fournies par Windows peuvent accomplir cette tâche. La méthode spécifique est la suivante. Tout d'abord, déclarez la fonction API dans un nouveau fichier de module (*.Bas).
DeclareFunctionGetModuleHandleLibKernel(ByVallpPRogName$)
DeclareFunctionGetModuleUsageLibKernel(ByValhModule)
En même temps, créez un sous-processus nommé main. Le code du sous-processus est le suivant :
Sous-Main()
Gestion des erreurs OnErrorGoToerrMain
Poignée du module DimhModule
DimAppCount'Le nombre de candidatures
appPath$=app.Path /'chemin de démarrage de l'application
hModule=GetModuleHandle(appPath$ app.EXEName .exe)'Obtenir le handle du programme.
AppCount=GetModuleUsage(hModule)'Obtient le code du module, c'est-à-dire le nombre d'applications en cours d'exécution.
lfAppCount>1Then'Le numéro de la même application est supérieur à 1
Le programme MsgBox a été chargé, 64
Fin' termine l'application actuellement démarrée
Elsc
mainForm.Show'mainForm est le formulaire principal du programme
Fin
QuitterSub
erreurMain :
lfErr<>0Alors
MsgBox Une erreur s'est produite lors du démarrage du programme, 64
QuitterSub
Fin
FinSub
Une fois le processus terminé, dans le menu principal VB3.0 [options], sélectionnez l'élément de menu [Projet] et définissez l'élément [StartupFrom] sur Sous-main, c'est-à-dire que lorsque le programme s'exécute, il démarre d'abord à partir du sous-programme Sous-main. Cela garantit que le code ci-dessus sera exécuté. Submain est le nom du sous-processus convenu dans VB3.0 et ne peut pas être remplacé par d'autres noms.
Régénérez le fichier EXE, démarrez l'application sous le gestionnaire de programme, puis réduisez le formulaire généré, puis exécutez-le à partir du gestionnaire de programme. L'utilisateur verra une boîte de message indiquant que l'application a été chargée. Après le chargement, le deuxième programme se termine. exécution. Le programme ci-dessus est uniquement utilisé pour empêcher le chargement du deuxième programme, mais il n'entre pas automatiquement dans le premier programme lorsque le deuxième programme ne peut pas être démarré. Pour y parvenir, les procédures mises en œuvre sont relativement complexes et ne seront pas présentées en détail ici.
2. Déterminez le chemin d'installation de Windows
Dans les logiciels que nous développons, nous appelons parfois directement de petites applications fournies par Windows, comme des calculatrices, des planificateurs, etc. ou nous devons mettre des fichiers spéciaux dans le chemin Windows ou SYSTEM. Habituellement, Windows est installé dans le répertoire C:WINDOWS, mais les utilisateurs peuvent modifier le nom du répertoire personnel de Windows à volonté. Par conséquent, dans notre logiciel, nous devons déterminer le chemin d'installation de Windows. Pour ce problème, Windows propose deux fonctions API : GetWindowsDirectory et GetSystemDirectory, qui peuvent renvoyer les noms du répertoire Windows et du répertoire SYSTEM.
Pour cela, préparez une fonction générale GetWinDir, qui renvoie le nom du répertoire d'installation de Windows. De même, vous pouvez écrire GetSysDir, omis.
Déclarez les fonctions API dans les fichiers du module *.BAS
DeclareFunctionGetWindowsDirectoryLibKernel(ByValipBufferAsString,ByValnSizeAsInteger)asIntegerFunctionGetWinDir()AsStringDimWindir$Windir$=Space$(144)'144 est la longueur maximale théorique du nom du répertoire WINDOWS.
lfGetWindowsDirectory(Windir$,144)=0Puis
MsgBox ne peut pas déterminer le chemin d'installation de WINDOWS, 16
GetWinDir=
Autre
Windir$=ALLTrim$(Windir$)
ifRight$(Windir$,1)<>«/»thenWindir$=Windir$ «/»
'Ajouter une barre oblique inverse
GetWinDir=Windir$
Fin
FinFonction
ALLTRIM est une fonction utilisée pour supprimer les caractères nuls dans une chaîne.
FonctionALLTrim(FatStr$)AsString
'thisFunctiondeleteSpacecharinstringofFatStr$
DimSlimStr$,I
SlimStr$=FatStr$
I=lnStr(SlimStr$,Chr$(0))'La position de l'espace
IfIThenSlimStr$=Gauche$(SlimStr$,I-1)
SlimStr$=Ltrim$(Rtrim$)(SlimStr$))
AIITrim$=SlimStr$
FinFonction
3. Invite à enregistrer les données avant de fermer le formulaire
De manière générale, il existe généralement 5 façons de fermer une application :
1. L'utilisateur sélectionne la commande [Fermer] dans la ControlBox du formulaire actuel.
2. Stimulez le code de commande de fin dans le programme (tel que End, Unload)
3. Quittez Windows
4. Fermez l'application dans la liste des tâches Windows.
5. Lors d'une opération multi-documents, la fermeture du formulaire MDI principal entraînera la fermeture du formulaire sous-MDI.
Avant de fermer une application, nous devons donner à l'utilisateur la possibilité de demander « Voulez-vous enregistrer des données ? ou annuler l'opération de « fermeture ». En VB, la fermeture du formulaire déclenche l'événement Form_Unload. On peut programmer cet événement pour contrôler l'opération de "fermeture". En supposant qu'il existe déjà une procédure FileSave utilisée pour enregistrer les fichiers, vous pouvez écrire le programme comme ceci.
SubForm_Unload (AnnulerAslnteger)
selectcastMsagbox("Enregistrer les données ?", 3 32)
'Oui, non, Cnacel trois options
case6'OUI
FileSave' enregistre les données
case2'annuler
Cancel=TRUE'Annuler l'opération de fermeture
caseelse'NO' n'enregistre pas, effectuez une opération d'arrêt
Fin de sélection
FinSub
La variable Cancel dans le code ci-dessus est une variable sortante inhérente à l'événement Form_unload lui-même. Elle transmet des messages au processus de contrôle Windows pour contrôler la direction du programme.
Les trois exemples ci-dessus ne sont que quelques problèmes mineurs dans le processus d'amélioration du logiciel. Pour rendre le logiciel stable et fiable, un travail minutieux et minutieux doit être effectué. Certains problèmes peuvent être résolus en explorant le potentiel de VB lui-même et en maîtrisant profondément les compétences opérationnelles de certains processus ; tandis que certains problèmes plus complexes impliquent les opérations sous-jacentes de Windows et peuvent être facilement réalisés à l'aide des fonctions de l'API Windows. Bien entendu, cela nécessite une certaine compréhension des fonctions et des mécanismes de Windows. Au fur et à mesure que le niveau de programmation Windows s'améliore, nous apprendrons et aimerons progressivement utiliser les fonctions API pour nous aider à terminer le codage du programme. ->