Listing 3.1 : Une procédure événementielle qui s'exécute lorsque l'utilisateur double-clique sur le bouton de commande Private Sub cmdExit_DblClick ( ) lblTitle.Caption = "Nouvelle page" intTotal = intCustNum + 1 End Sub Listing PB1.1 : Ce code active la feuille de mot de passe Private Sub cmdExit_Click() End End Sub Private Sub cmdTest_Click() ' Cette procédure événementielle s'exécute dès que ' l'utilisateur décide de tester le mot de passe saisi If txtPassword.Text = "SSM" Then ' Mot de passe correct Beep Beep ' Affiche l'image imgPassword.Picture = LoadPicture("C:\Program Files\" _ & "Microsoft Visual Studio\Common\Graphics\MetaFile\" _ & "Business\coins.wmf") lblPrompt.Caption = "Aboule le fric !" Else lblPrompt.Caption = "Mot de passe incorrect - Essayez encore " txtPassword.Text = "" ' Efface le mauvais mot de passe txtPassword.SetFocus ' Met le focus sur la zone de texte End If End Sub Listing 4.1 : Le code du menu contrôle la couleur et le contenu du label Private Sub mnuColorBlue_Click() ' Colore le label en bleu et coche l'option de menu ' Bleu. S'assure que les options Vert ' et Rouge sont toutes les deux décochées. lblMenu.BackColor = vbBlue mnuColorBlue.Checked = True mnuColorGreen.Checked = False mnuColorRed.Checked = False End Sub Private Sub mnuColorGreen_Click() ' Colore le label en vert et coche l'option de menu ' Vert. S'assure que les options Bleu ' et Rouge sont toutes les deux décochées. lblMenu.BackColor = vbGreen mnuColorBlue.Checked = False mnuColorGreen.Checked = True mnuColorRed.Checked = False End Sub Private Sub mnuColorRed_Click() ' Colore le label en rouge et coche l'option de menu ' Rouge. S'assure que les options Bleu ' et Vert sont toutes les deux décochées. lblMenu.BackColor = vbRed mnuColorBlue.Checked = Fasle mnuColorGreen.Checked = False mnuColorRed.Checked = True End Sub Private Sub mnuFileExit_Click() ' Termine le programme End End Sub Private Sub mnuMessageInitial_Click() ' Restaure le texte initial du label et ' coche l'option de menu correspondante. ' S'assure que les autres options sont décochées. lblMenu.Caption = "Sélectionnez une option de menu" mnuMessageInitial.Checked = True mnuMessageProgramming.Checked = False mnuMessageSimple.Checked = False End Sub Private Sub mnuMessageProgramming_Click() ' Change le texte du label et coche ' l'option de menu correspondante. ' S'assure que les autres options sont décochées. lblMenu.Caption = "La programmation, c'est le pied !" mnuMessageInitial.Checked = False mnuMessageProgramming.Checked = True mnuMessageSimple.Checked = False End Sub Private Sub mnuMessageSimple_Click() ' Change le texte du label et coche ' l'option de menu correspondante. ' S'assure que les autres options sont décochées. lblMenu.Caption = "VB, c'est simple !" mnuMessageInitial.Checked = False mnuMessageProgramming.Checked = False mnuMessageSimple.Checked = True End Sub Listing PB2.1 : Ce code met en œuvre des variables et des instructions d'affectation Private Sub cmdCalcPay_Click() ' Calcule les trois variables de la paye. Dim intHoursWorked As Integer Dim sngRate As Single, sngTaxRate As Single Dim curTaxes As Currency, curGrossPay As Currency Dim curNetPay As Currency ' Initialise les variables ' (En réalité, ces données viendraient de ' l'utilisateur ou d'un fichier). intHoursWorked = 40 ' Total des heures travaillées. sngRate = 7.8 ' Paye par heure. sngTaxRate = 0.42 ' Pourcentage de prélèvements. ' Calcule les sommes curGrossPay = intHoursWorked * sngRate curTaxes = sngTaxRate * curGrossPay curNetPay = curGrossPay - curTaxes ' Affiche les résultats dans les labels lblGrossPay.Caption = curGrossPay lblTaxes.Caption = curTaxes lblNetPay.Caption = curNetPay End Sub Listing 6.1 : Comparaison de données avec instruction If If (curSales > curSalesGoal) Then ' Ce commercial explose ses objectifs curSalaryBonus = 10000.00 lblSalesNote.Caption = "Objectifs explosés !" lblSalesNote.BackColor = Red lblSalesNote.FontBold = True End If ' Le code continue ici Listing 6.2 : Test du mot de passe par une instruction If If txtPassword.Text = "SSM" Then ' Mot de passe correct Beep Beep ' Afficher l'image imgPassword.Picture = LoadPicture("C:\Program Files\" & "Microsoft Visual Studio\Common\Graphics\MetaFile\" & "Business\coins.wmf") lblPrompt.Caption = "Aboule le fric !" Else lblPrompt.Caption = "Mot de passe incorrect - Essayer encore " txtPassword.Text = "" ' Efface le mauvais mot de passe txtPassword.SetFocus ' Met le focus sur la zone de texte End If Listing 6.3 : Les instructions If imbriquées permettent des comparaisons plus poussées If (curSales > 100000.00) Then If (intHrsWorked > 40) Then curBonus = 7500.00 Else curBonus = 5000.00 End If lblBonus.Caption = "Bon boulot !" End If Listing 6.4 : L'instruction Exit Sub permet d'interrompre une procédure Private Sub cmdCalc () If (txtSales.Text < 50000.00) Then Exit Sub ' Interrompt la procédure Else ' Si le chiffre de vente est au moins ' de 50 000 F, exécute l'instruction ' suivante, qui affiche le bonus comme ' pourcentage des ventes. lblBonus.Caption = txtSales.Text * .05 End If End Sub Listing 6.5 : Le mot clé ElseIf permet de combiner les instructions If... Else If (intHours <= 40) Then curOverTime = 0.0 ' Interroge les heures entre 40 et 50, ' et paye les 50 % d'heures sup. ElseIf (intHours <= 50) Then curOverTime = (intHours - 40) * 1.5 * sngRate Else ' Au-delà de 50, les heures doivent être payées ' doubles ; entre 40 et 50 heures, la prime ' est de 50 %. curOverTime = ((intHours - 50) * 2 + (10 * 1.5)) * sngRate End If Listing 6.6 : Les instructions Select Case comparent des valeurs multiples ' Interrogation d'une note scolaire Select Case txtGrade.Text Case "A" lblAnnounce.Caption = "Très bien" Case "B" lblAnnounce.Caption = "Bien" Case "C" lblAnnounce.Caption = "Peut mieux faire" Case "D" lblAnnounce.Caption = "Médiocre" Case "E" lblAnnounce.Caption = "Mauvais" Case Else lblAnnounce.Caption = "Note non validée" End Select Listing 6.7 : Comparaisons conditionnelles dans Select Case ' Test d'une note scolaire Select Case txtGrade.Text Case Is >= 18 lblAnnounce.Caption = "Très bien" Case Is >= 15 lblAnnounce.Caption = "Bien" Case Is >= 12 lblAnnounce.Caption = "Peut mieux faire" Case Is >= 10 lblAnnounce.Caption = "Médiocre" Case Else lblAnnounce.Caption = "Mauvais" End Select Listing 6.8 : Comparaisons de valeurs séquentielles dans Select Case ' Interrogation d'une note scolaire Select Case txtGrade.Text Case 0 To 9 lblAnnounce.Caption = "Mauvais" Case 10 To 11 lblAnnounce.Caption = "Médiocre" Case 12 To 14 lblAnnounce.Caption = "Peut mieux faire" Case 15 To 17 lblAnnounce.Caption = "Bien" Case Else lblAnnounce.Caption = "Très bien" End Select Listing 6.9 : L'instruction Do existe en plusieurs formats Do While intCtr <= 10 ' Cette boucle fait la même chose ' que celle de la Figure 6.2 lblOut.Caption = intCtr intCtr = intCtr + 1 Loop Listing 6.10 : L'utilisateur n'entre pas toujours des données valides du premier coup Dim strAns As String ' ' L'utilisateur doit répondre par Oui ou Non. lblPrompt.Caption = "Continuer ? (Oui ou Non)" ' ' Stockage de la réponse dans la ' variable chaîne nommée strAns. ' Test de la réponse et réitération ' de la question si nécessaire. Do While (strAns <> "Oui" And strAns <> "Non") Beep ' Avertissement lblError.Caption = "Merci de répondre par Oui ou Non" ' Stockage de la réponse dans la ' variable chaîne nommée strAns (rebelote). Loop ' Effacement du message d'erreur. lblError.Caption = Null Listing 6.11 : Les boucles For permettent d'incrémenter une variable compteur For intCtr = 1 to 10 lblOut.Caption = intCtr Next Listing 6.12 : Boucle For avec valeur de Step positive (incrémentation) For intCtr = 10 to 100 Step 5 lblOut.Caption = intCtr Next Listing 6.13 : Boucle For avec valeur de Step négative (décrémentation) For intCtr = 1000 to 0 Step -100 lblOut.Caption = intCtr Next Listing 7.1 : Code pour tester l'état de shift Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Dim intShiftState As Integer intShiftState = Shift And 7 ' "And" binaire Select Case intShiftState Case 1 ' Code pour les combinaisons Maj Case 2 ' Code pour les combinaisons Ctrl Case 3 ' Code pour les combinaisons Alt Case 4 ' Code pour les combinaisons Maj-Ctrl Case 5 ' Code pour les combinaisons Maj-Alt Case 6 ' Code pour les combinaisons Ctrl-Alt Case 7 ' Code pour les combinaisons Maj-Ctrl-Alt End Select End Sub Listing PB3.1 : Réception du choix de l'utilisateur par les boutons d'option Private Sub cmdSelect_Click() ' Vérifier l'absence d'erreur puis afficher ' la feuille selon les choix de l'utilisateur. Dim strMsg As String ' Valeur renvoyée par la boîte de message If ((optCheck.Value = False) And (optOption.Value = False)) Then strMsg = MsgBox("Vous devez sélectionner une option", vbCritical, "Erreur !") ElseIf (optCheck.Value = True) Then frmFlagsCheck.Show ' Option cases à cocher. Else frmFlagsOpt.Show ' Option boutons d'option. End If End Sub Private Sub Form_Load() ' Désélectionner tous les boutons d'option. optCheck.Value = False optOption.Value = False End Sub Private Sub cmdExit_Click() ' fermer le programme. End End Sub Listing PB3.2 : Affichage des drapeaux pour chaque case cochée Private Sub chkEngland_Click() ' Case cochée = drapeau affiché. If chkEngland.Value = 1 Then imgEngland.Visible = True Else imgEngland.Visible = False End If End Sub Private Sub chkItaly_Click() ' Case cochée = drapeau affiché. If chkItaly.Value = 1 Then imgItaly.Visible = True Else imgItaly.Visible = False End If End Sub Private Sub chkSpain_Click() ' Case cochée = drapeau affiché. If chkSpain.Value = 1 Then imgSpain.Visible = True Else imgSpain.Visible = False End If End Sub Private Sub chkMexico_Click() ' Case cochée = drapeau affiché. If chkMexico.Value = 1 Then imgMexico.Visible = True Else imgMexico.Visible = False End If End Sub Private Sub chkFrance_Click() ' Case cochée = drapeau affiché. If chkFrance.Value = 1 Then imgFrance.Visible = True Else imgFrance.Visible = False End If End Sub Private Sub chkUSA_Click() ' Case cochée = drapeau affiché. If chkUSA.Value = 1 Then imgUSA.Visible = True Else imgUSA.Visible = False End If End Sub Private Sub cmdReturn_Click() ' Retour à la feuille de sélection. frmFlagsCheck.Hide frmSelect.Show End Sub Listing PB3.3 : Affichage du drapeau selon le bouton d'option sélectionné Private Sub optEngland_Click() ' Bouton sélectionné = drapeau affiché. If optSmall.Value = True Then imgEngland.Height = 480 imgEngland.Width = 480 Else ' Grande taille. imgEngland.Height = 2800 imgEngland.Width = 2800 End If imgEngland.Visible = True ' Masquer les autres drapeaux. imgItaly.Visible = False imgSpain.Visible = False imgMexico.Visible = False imgFrance.Visible = False imgUSA.Visible = False End Sub Private Sub optItaly_Click() ' Bouton sélectionné = drapeau affiché. If optSmall.Value = True Then imgItaly.Height = 480 imgItaly.Width = 480 Else ' Grande taille. imgItaly.Height = 2800 imgItaly.Width = 2800 End If imgItaly.Visible = True ' Masquer les autres drapeaux. imgEngland.Visible = False imgSpain.Visible = False imgMexico.Visible = False imgFrance.Visible = False imgUSA.Visible = False End Sub Private Sub optSpain_Click() ' Bouton sélectionné = drapeau affiché. If optSmall.Value = True Then imgSpain.Height = 480 imgSpain.Width = 480 Else ' Grande taille imgSpain.Height = 2800 imgSpain.Width = 2800 End If imgSpain.Visible = True ' Masquer les autres drapeaux. imgItaly.Visible = False imgEngland.Visible = False imgMexico.Visible = False Listing PB3.3. continued imgFrance.Visible = False imgUSA.Visible = False End Sub Private Sub optMexico_Click() ' Bouton sélectionné = drapeau affiché. If optSmall.Value = True Then imgMexico.Height = 480 imgMexico.Width = 480 Else ' Grande taille imgMexico.Height = 2800 imgMexico.Width = 2800 End If imgMexico.Visible = True ' Masquer les autres drapeaux. imgItaly.Visible = False imgSpain.Visible = False imgEngland.Visible = False imgFrance.Visible = False imgUSA.Visible = False End Sub Private Sub optFrance_Click() ' Bouton sélectionné = drapeau affiché. If optSmall.Value = True Then imgFrance.Height = 480 imgFrance.Width = 480 Else ' Grande taille imgFrance.Height = 2800 imgFrance.Width = 2800 End If imgFrance.Visible = True ' Masquer les autres drapeaux. imgItaly.Visible = False imgSpain.Visible = False imgMexico.Visible = False imgEngland.Visible = False imgUSA.Visible = False End Sub Private Sub optUSA_Click() ' Bouton sélectionné = drapeau affiché. If optSmall.Value = True Then imgUSA.Height = 480 imgUSA.Width = 480 Else ' Grande taille imgUSA.Height = 2800 imgUSA.Width = 2800 End If imgUSA.Visible = True ' Masquer les autres drapeaux. imgItaly.Visible = False imgSpain.Visible = False imgMexico.Visible = False imgFrance.Visible = False imgEngland.Visible = False End Sub Private Sub cmdReturn_Click() ' Retour à la feuille de sélection. frmFlagsOpt.Hide frmSelect.Show End Sub Private Sub optSmall_Click() ' Masquer tous les drapeaux affichés. ' Les drapeaux seront maintenant petits. imgEngland.Visible = False imgItaly.Visible = False imgSpain.Visible = False imgMexico.Visible = False imgFrance.Visible = False imgUSA.Visible = False ' Désélectionner tous les boutons d'option optEngland.Value = False optItaly.Value = False optSpain.Value = False optMexico.Value = False optFrance.Value = False optUSA.Value = False End Sub Private Sub optLarge_Click() ' Masquer tous les drapeaux affichés. ' Les drapeaux seront maintenant petits. imgEngland.Visible = False imgItaly.Visible = False imgSpain.Visible = False imgMexico.Visible = False imgFrance.Visible = False imgUSA.Visible = False ' Désélectionner tous les boutons d'option optEngland.Value = False optItaly.Value = False optSpain.Value = False optMexico.Value = False optFrance.Value = False optUSA.Value = False End Sub Listing 8.1 : La première procédure passe des arguments à la seconde Private Sub GetTotal() ' Cette procédure additionne les valeurs d'un ' formulaire, puis envoie le total et le pourcentage ' d'abattement à la procédure qui calcule la taxe. Dim curTotal As Currency Dim sngDisc As Single ' Special tax discount ' ' Calculer le total d'après le formulaire. curTotal = txtSale1.Text + txtSale2.Text + txtSale3.txt ' ' Envoyer le total à la procédure de taxation. Call SalesTax(curTotal, sngDisc) End Sub Public Sub SalesTax(curTotal As Currency, sngRateDisc As Single) ' Calculer la taxe et déduire l'abattement. Dim curSalesTax As Currency Dim intMsg As Integer ' For MsgBox() ' ' Calcul de la taxe de vente ' à 3,5 % du total. curSalesTax = (curTotal * .035) ' ' Déduction du pourcentage d'abattement. curSalesTax = curSalesTax - (sngRateDisc * curTotal) ' ' Afficher le montant total de la taxation. intMsg = MsgBox("Taxation totale : " & curSalesTax) ' ' Après exécution, les procédures redonnent ' la main à la procédure appelante. End Sub Listing 8.2 : Les fonctions renvoient à la procédure appelante une valeur unique ' La procédure appelante commence ici. Private Sub CP() Dim varR As Variant ' Variables locales à l'origine Dim varV As Variant ' de la valeur renvoyée. Dim intI As Integer ' Contiendra la valeur renvoyée. varR = 32 ' Valeurs initiales. varV = 64 intI = RF(varR, varV) ' Passe varR et varV. ' intI reçoit la valeur renvoyée. MsgBox("Après renvoi, intI vaut " & intI) MsgBox("Après renvoi, varR vaut " & varR) MsgBox("Après renvoi, varV vaut " & varV) End Sub ' La fonction appelée commence ici. Public Function RF (varR As Variant, ByVal varV As Variant) As Integer ' varR est reçu par référence et varV par valeur. varR = 81 ' Modifie les deux arguments. varV = varV + 10 ' Définit la valeur de renvoi. RF = varR + varV End Function Listing 8.3 : Vérification de variables vides ' Interroge les fonctions Is(). Dim var1 As Variant, var2 As Variant, Dim var3 As Variant, var4 As Variant Dim intMsg As Integer ' valeur de renvoi de MsgBox ' Affectations de valeurs d'exemple. var1 = 0 ' Valeur zéro. var2 = Null ' Valeur Null. var3 = "" ' Chaîne Null. ' Appelle chaque fonction Is(). If IsEmpty(var1) Then intMsg = MsgBox("var1 est vide.", vbOKOnly) End If If IsEmpty(var2) Then intMsg = MsgBox("var2 est vide.", vbOKOnly) End If If IsEmpty(var3) Then intMsg = MsgBox("var3 est vide.", vbOKOnly) End If If IsEmpty(var4) Then intMsg = MsgBox("var4 est vide.", vbOKOnly) End If Listing 8.4 : VarType() permet de déterminer le type des données passées Private Sub PrntType(varA) ' Variant par défaut. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). Select Case VarType(varA) ' VarType() renvoie un entier. Case 0 intMsg = MsgBox("L'argument est de type Empty.") Case 1 intMsg = MsgBox("L'argument est de type Null.") Case 2 intMsg = MsgBox("L'argument est de type Integer.") Case 3 intMsg = MsgBox("L'argument est de type Long.") Case 4 intMsg = MsgBox("L'argument est de type Single.") Case 5 intMsg = MsgBox("L'argument est de type Double.") Case 6 intMsg = MsgBox("L'argument est de type Currency.") Case 7 intMsg = MsgBox("L'argument est de type Date.") Case 8 intMsg = MsgBox("L'argument est de type String.") Case 9 intMsg = MsgBox("L'argument est de type Object.") Case 10 intMsg = MsgBox("L'argument est de type Error.") Case 11 intMsg = MsgBox("L'argument est de type Boolean.") Case 12 intMsg = MsgBox("L'argument est de type tableau de Variant.") Case 13 intMsg = MsgBox("L'argument est de type objet d'accès aux données.") Case 14 intMsg = MsgBox("L'argument est de type Decimal.") Case 17 intMsg = MsgBox("L'argument est de type Byte.") Case Else intMsg = MsgBox("L'argument est de type Array (tableau).") End Select End Sub Listing 8.5 : Contrairement à CStr(), Str() fait précéder les nombres positifs d'un blanc Private Sub convStr () Dim str1 As String, s2 As String Dim intMsg As Integer ' Clic sur le bouton. str1 = CStr(12345) str2 = Str(12345) intMsg = MsgBox("***" & str1 & "***") intMsg = MsgBox("***" & str2 & "***") End Sub Listing 8.6 : Cette fonction se sert des fonctions de chaînes pour inverser une chaîne Public Function ReverseIt (strS As String, ByVal n As Integer) As String ' Attend une chaîne, ainsi qu'un entier indiquant ' le nombre de caractères à inverser. ' Inverse le nombre spécifié de ' caractères dans la chaîne spécifiée. ' Renvoie la chaîne inversée. ' ' Inverse les n premiers caractères de la chaîne. Dim strTemp As String, intI As Integer If n > Len(strS) Then n = Len(strS) For intI = n To 1 Step -1 strTemp = strTemp + Mid(strS, intI, 1) Next intI ReverseIt = strTemp + Right(strS, Len(strS) - n) End Function Listing 8.7 : Chronométrage du temps de réponse de l'utilisateur Public Sub CompTime () ' Cette procédure mesure le temps de réponse. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). Dim varBefore, varAfter, varTimeDiff As Variant Dim intMathAns As Integer varBefore = Timer ' Valeur au moment de la question. intMathAns = Inputbox("Combien font 150 + 235 ?") varAfter = Timer ' Valeur au moment de la réponse. ' La différence entre les deux valeurs représente ' le temps de réponse de l'utilisateur. varTimeDiff = varAfter - varBefore intMsg = MsgBox("Vous avez mis " + Str(varTimeDiff) & " secondes !") End Sub Listing 8.8 : Ce code calcule le prochain jour ouvrable après la date spécifiée Function DueDate (dteAnyDate) As Variant ' Attend une valeur date. ' Calcule le prochain jour ouvrable ' après la date spécifiée. ' Renvoie la date de ce jour-là. Dim varResult As Variant If Not IsNull(dteAnyDate) Then varResult = DateSerial(Year(dteAnyDate), Month(dteAnyDate) + 1, 1) If Weekday(varResult) = 1 Then ' Dimanche : ajouter un jour. DueDate = Result + 1 ElseIf Weekday(varResult) = 7 Then ' Samedi : ajouter deux jours. DueDate = varResult + 2 Else DueDate = varResult End If Else varResult = Null End If End Function Listing 8.9 : Format() appliqué aux nombres strS = Format(9146, "|######|") ' |9146| strS = Format(2652.2, "00000.00") ' 02652.20 strS = Format(2652.2, "#####.##") ' 2652.2 strS = Format(2652.216, "#####.##") ' 2652.22 strS = Format(45, "+###") ' +45 strS = Format(45, "-###") ' -45 strS = Format(45, "###-") ' 45- strS = Format(2445, "####.## FF") ' 2445. FF strS = Format(2445, "####.00 FF") ' 2445.00 FF strS = Format(2445, "00H00") ' 24H45 Listing 8.10 : Format() appliqué aux dates et heures Dim varD As Variant varD = Now ' Suppose comme date fictive ' le 21 mai 1999 à 12:30 précises. strND = Format(varD, "c") ' 21/5/99 12:30:00 strND = Format(varD, "w") ' 6 strND = Format(varD, "ww")' 22 strND = Format(varD, "dddd") ' vendredi strND = Format(varD, "q") ' 2 strND = Format(varD, "hh") ' 12 strND = Format(varD, "d mmmm h:nn:ss") ' "21 mai 12:30:00" Listing 9.1 : Gestion du bouton Annuler Private Sub mnuViewColor_Click() cdbColor.CancelError = True ' Un clic sur Annuler ' équivaut à une erreur. On Error Goto dbErrHandler ' Bascule vers l'étiquette en cas d'erreur. ' Définit la propriété Flags. cdbColor.Flags = cdlCCFullOpen + cdlCCHelpButton ' Affichage complet. Color DB ' Affiche la boîte de dialogue Couleur. cdbColor.ShowColor ' Définit la couleur d'arrière-plan de la ' feuille selon les choix de l'utilisateur. frmTitle.ForeColor = cdbColor.Color Exit Sub ' Fin de la procédure normale. dbErrHandler: ' L'utilisateur ayant cliqué sur Annuler, ' la procédure doit être ignorée. Exit Sub End Sub Listing 9.2 : Afficher la boîte de dialogue Police pour que vos utilisateurs choisissent dans une liste le style et la taille de la police ' Définir les valeurs de Flags. CdbFont.Flags = cdlCFBoth Or cdlCFEffects CdbFont.ShowFont ' Affiche la boîte de dialogue. ' Définit les propriétés du label qui ' reflétera les choix de l'utilisateur. LblMessage.Font.Name = CdbFont.FontName LblMessage.Font.Size = CdbFont.FontSize LblMessage.Font.Bold = CdbFont.FontBold LblMessage.Font.Italic = CdbFont.FontItalic LblMessage.Font.Underline = CdbFont.FontUnderline LblMessage.FontStrikethru = CdbFont.FontStrikethru LblMessage.ForeColor = CdbFont.Color Listing 9.3 : Gestion de la boîte de dialogue Imprimer Private mnuFilePrint_Click() Dim intBegin As Integer, intEnd As Integer Dim intNumCopies As Integer, intI As Integer ' Suppose que Cancel est définie comme True. On Error Goto dbErrHandler ' Affiche la boîte de dialogue Imprimer. cbdPrint.ShowPrinter ' Reçoit les valeurs sélectionnées par l'utilisateur. intBegin = cbdPrint.FromPage intEnd = cbdPrint.ToPage intNumCopies = cbdPrint.Copies ' ' Imprime le nombre de copies demandé. For intI = 1 To intNumCopies ' Ici, code chargé de gérer la sortie imprimante. Next intI Exit Sub dbErrHandler: ' L'utilisateur a appuyé sur Annuler. Exit Sub End Sub Listing 10.1 : Déterminer quelles touches ont été frappées conjointement à l'événement souris Private Sub imgMouse_MouseDown(intButton As Integer, intShift As Integer, sngX As Single, sngY As Single) Dim intShiftState As Integer intShiftState = intShift And 7 ' And binaire. Select Case intShiftState Case 1 ' Combinaisons Maj. Case 2 ' Combinaisons Ctrl. Case 3 ' Combinaisons Alt. Case 4 ' Combinaisons Maj-Ctrl. Case 5 ' Combinaisons Maj-Alt. Case 6 ' Combinaisons Ctrl-Alt. Case 7 ' Combinaisons Maj-Ctrl-Alt. End Select End Sub Listing 10.2 : La procédure événementielle initialise le contrôle ListBox Private Sub Form_Load() ' Initialise les valeurs du contrôle. lstColors.AddItem "Rouge" lstColors.AddItem "Bleu" lstColors.AddItem "Vert" lstColors.AddItem "Jaune" lstColors.AddItem "Orange" lstColors.AddItem "Blanc" End Sub Listing 10.3 : Les tableaux simplifient le stockage des données Private Sub association () ' Reçoit puis affiche les noms et les sommes dues. Dim strFamilyName(35) As String ' Réserve les éléments du tableau. Dim curFamilyDues(35) As Currency Dim intSub As Integer Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). ' Collecte les données. For intSub = 1 To 35 strFamilyName(intSub) = InputBox("Famille suivante ?") curFamilyDues(intSub) = InputBox("Cotisations dues ?") Next intSub ' Les données peuvent maintenant être affichées. ' (Cet exemple utilise à cette fin des boîtes ' de message pour simplifier les choses.) intSub = 1 ' Initialise le premier indice. Do intMsg = MsgBox("Famille numéro " & intSub & " : " & strFamilyName(intSub)) intMsg = MsgBox("Cotisations dues : " & curFamilyDues(intSub)) intSub = intSub + 1 Loop Until (intSub > 35) End Sub Listing 10.4 : On peut déclarer plus d'éléments que l'on n'a de données Private Sub varyNumb () ' Reçoit puis affiche les noms et les sommes dues. Dim strFamilyName(500) As String ' On vise large. Dim curFamilyDues(500) As Currency Dim intSub As Integer, intNumFam As Integer Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). intNumFam = 1 ' La boucle demande les noms et les sommes dues ' jusqu'à ce que l'utilisateur appuie sur Entrée ' sans avoir saisi d'information. Dès qu'une chaîne ' nulle est entrée, la boucle Do-Loop s'arrête ' après avoir stocké la dernière entrée. Do strFamilyName(intNumFam) = InputBox("Famille suivante ?") If (strFamilyName(intNumFam) = "") Then Exit Do ' Interruption. curFamilyDues(intNumFam) = InputBox("Cotisations dues ?") intNumFam = intNumFam + 1 ' Ajoute 1 Add à la variable indice. Loop Until (intNumFam > 500) ' Lorsque la dernière boucle se termine, intNumFam contient ' 1 de plus que le nombre réel d'entrées. ' Affiche toutes les données. For intSub = 1 To intNumFam - 1 intMsg = MsgBox("Famille numéro " & intSub & " : " & strFamilyName(intSub)) intMsg = MsgBox("Cotisations dues : " & curFamilyDues(intSub)) Next intSub End Sub Listing 10.5 : Programme de recherche de données Private Sub salary () ' Stocke 12 mois de salaires, puis affiche les mois sélectionnés. Dim curSal(1 To 12) As Currency ' Réserve des éléments pour 12 salaires. Dim intSub As Integer ' Indice de boucle. Dim intNum As Integer ' Mois sélectionné. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). Dim strAns As String For intSub = 1 To 12 curSal(intSub) = InputBox("Salaire pour le mois de " & Str(intSub) & " ?", 0.00) Next intSub ' Demande le numero du mois. Do intNum = InputBox("Quel mois voulez-vous consulter ? (1-12) ") intMsg = MsgBox("Salaires pour le mois de " & Str(intNum) & " : " & curSal(intNum)) strAns = InputBox("Autre consultation ? (O/N)") Loop While (strAns = "O" Or strAns = "o") End Sub Listing 10.6 : L'utilisateur indique au programme la fin de la série de données Private Sub tempAvg () ' Demande une liste de températures puis calcule la moyenne. Dim sngTemp(1 To 50) As Single ' Maximum = 50 Dim sngTotalTemp As Single ' Reçoit le total. Dim sngAvgTemp As Single Dim intSub As Integer ' Indice. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). ' Demande à l'utilisateur chaque température. For intSub = 1 To 50 ' Maximum. sngTemp(intSub) = InputBox("Température suivante ?(-99 pour terminer) ") ' Si l'utilisateur veut arrêter, décrémente de 1 et sort de la boucle. If (sngTemp(intSub) = -99) Then intSub = intSub - 1 ' Décrémente de 1. Exit For End If sngTotalTemp = sngTotalTemp + sngTemp(intSub) ' Additionne le total. Next intSub ' Calcule la moyenne. sngAvgTemp = sngTotalTemp / intSub intMsg = MsgBox("Température moyenne : " & sngAvgTemp) End Sub Listing PB4.1 : Initialiser la zone de liste et interroger les sélections multiples Private Sub Form_Load() ' S'exécute au chargement de la feuille. lstFirstList.AddItem "Chicago" lstFirstList.AddItem "Dallas" lstFirstList.AddItem "Seattle" lstFirstList.AddItem "Washington" lstFirstList.AddItem "Houston" lstFirstList.AddItem "Dayton" End Sub Private Sub lstFirstList_Click() ' Met à jour les six zones de texte en fonction des . ' éléments sélectionnés dans la première zone de liste. If lstFirstList.Selected(0) Then txtChicago.Text = "Sélectionné" Else txtChicago.Text = "Non sélectionné" End If If lstFirstList.Selected(1) Then txtDallas.Text = "Sélectionné" Else txtDallas.Text = "Non sélectionné" End If If lstFirstList.Selected(2) Then txtSeattle.Text = "Sélectionné" Else txtSeattle.Text = "Non sélectionné" End If If lstFirstList.Selected(3) Then txtWashington.Text = "Sélectionné" Else txtWashington.Text = "Non sélectionné" End If If lstFirstList.Selected(4) Then txtHouston.Text = "Sélectionné" Else txtHouston.Text = "Non sélectionné" End If If lstFirstList.Selected(5) Then txtDayton.Text = "Sélectionné" Else txtDayton.Text = "Non sélectionné" End If End Sub Listing PB5.1 : Répondre aux événements souris Private Sub Form_Click() txtMouse.Text = "Vous avez cliqué sur la feuille" Beep ' Signale l'événement Click. End Sub Private Sub Form_DblClick() txtMouse.Text = "Vous avez double-cliqué sur la feuille" End Sub Private Sub Form_MouseDown(intButton As Integer, intShift As Integer, sngX As Single, sngY As Single) ' Clic sur la feuille. txtMouse.Text = "Clic sur la feuille à la position " & sngX & "," & sngY End Sub ' Arguments ignorés dans la procédure précédente. Private Sub Form_MouseMove(intButton As Integer, intShift As Integer, sngX As Single, sngY As Single) txtMouse.Text = "Déplacement de la souris..." End Sub ' Arguments ignorés dans la procédure précédente. Private Sub imgMouse_Click() txtMouse.Text = "Vous avez cliqué sur l'image" End Sub Private Sub imgMouse_DblClick() txtMouse.Text = "Vous avez double-cliqué sur l'image" End Sub Private Sub imgMouse_MouseDown(intButton As Integer, intShift As Integer, sngX As Single, sngY As Single) ' ' Clic sur l'image. txtMouse.Text = "Clic sur l'image à la position " & sngX & "," & sngY End Sub Private Sub imgMouse_MouseMove(intButton As Integer, intShift As Integer, sngX As Single, sngY As Single) txtMouse.Text = "Vous vous êtes déplacé sur l'image" End Sub Listing 11.1 : La méthode Print écrit directement sur la feuille Private Sub Form_Click() ' Exemple de méthode Print. Dim strString As String strString = "Visual Basic" ' Affiche trois fois la chaîne. Form1.Print strString & " " & strString & " " strString End Sub Listing 11.2 : Le point-virgule empêche les sauts de lignes Private Sub Form_Click () Dim strString As String strString = "Visual Basic" Form1.Print "*"; Spc(5); strString; ' Remarquez le point-virgule. Form1.Print Spc(2); strString End Sub Listing 11.3 : Espacement de la sortie de Print à l'aide des fonctions Tab() et Spc() Private Sub Form_Click() Dim strString As String strString = "Visual Basic" Form1.Print "*"; Tab(5); strString; Tab(20); strString Form1.Print "*"; Spc(5); strString; Spc(20); strString End Sub Listing 11.4 : Print permet aussi d'insérer des lignes vierges Private Sub Form_Click() Dim strString As String Dim CurLine As Integer CurLine = 1 strString = "Visual Basic" ' Affiche la ligne. Form1.Print strString & " est sur la ligne n°" & CurLine For CurLine = 2 To 6 Form1.Print ' Insère des lignes vierges. Next CurLine ' Affiche la ligne. Form1.Print strString & " est sur la ligne n°" & CurLine End Sub Listing 11.5 : Positionnement de la sortie à l'aide des propriétés CurrentX et CurrentY Private Sub Form_Click() ' Définition de l'echelle Form1.ScaleMode = VbCharacters Form1.CurrentX = 20 ' Déplacement horizontal de 20 caractères. Form1.CurrentY = 6 ' Déplacement vertical de 6 lignes. Form1.Print "Vertical et horizontal " Form1.CurrentX = 0 ' Retour vers la gauche. Form1.CurrentY = 0 ' Retour vers le haut. Form1.Print "Coin supérieur gauche" End Sub Listing 11.6 : La procédure Property Get renvoie la valeur de la propriété Public Property Get BottomTitle() ' Cette procédure renvoie la valeur ' de la propriété BottomTitle, ' valeur en fait contenue dans ' la variable publique strTitle. BottomTitle = strTitle End Property Listing 11.7 : La procédure Property Let affecte une valeur à la propriété Public Property Let BottomTitle(strTitleEntered) ' Cette procédure affecte à la variable ' strTitle les valeurs que le programme ' est susceptible d'envoyer à BottomTitle. ' ' L'argument passé est la valeur que ' le programme stocke dans BottomTitle. strTitle = strTitleEntered ' ' La sortie suivante s'affichera au bas de la feuille. frmTitle.CurrentY = (frmTitle.Height - 600) ' ' Si la feuille est si petite que même une seule ' ligne ne rentre pas, ne rien faire. If frmTitle.CurrentY < 600 Then Exit Property Else ' Affiche sur la feuille la valeur de propriété. Print strTitle End If End Property Listing 11.8 : Création d'une variable de référence pointant vers la fenêtre fille Private Sub LoadNewDoc() Static lDocumentCount As Long Dim frmD As frmDocument lDocumentCount = lDocumentCount + 1 Set frmD = New frmDocument frmD.Caption = "Document " & lDocumentCount frmD.Show End Sub Listing 12.1 : FreeFile() permet d'obtenir un numéro de fichier libre Dim intReadFile As Integer, intWriteFile As Integer ' Gère le fichier d'entrée. intReadFile = FreeFile ' Obtient le numéro du premier fichier. Open "AccPay.Dat" For Input As intReadFile ' Gère le fichier de sortie. intWriteFile = FreeFile ' Obtient le numéro du fichier suivant. Open "AccPayOut.Dat" For Output As intWriteFile ' ' Ici, le code chargé d'envoyer au fichier ' de sortie le contenu du fichier d'entrée ' (voir plus loin). Close intReadFile Close intWriteFile Listing 12.2 : Ecriture dans un fichier séquentiel avec Print # Private Sub cmdFile_Click() Dim intCtr As Integer ' Compteur de boucle. Dim intFNum As Integer ' Numéro de fichier. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). intFNum = FreeFile ' Vous pouvez changer le chemin. Open "C:\Print.txt" For Output As #intFNum ' Décrit la procédure. intMsg = MsgBox("Fichier Print.txt ouvert !") For intCtr = 1 To 5 Print # intFNum, intCtr ' Envoie le compteur de boucle. intMsg = MsgBox("Ecriture du chiffre " & intCtr & " dans Print.txt") Next intCtr Close # intFNum intMsg = MsgBox("Fichier Print.txt fermé !") End Sub Listing 12.3 : Le point-virgule permet d'écrire plusieurs valeurs sur une même ligne Private Sub cmdFile_Click() Dim intCtr As Integer ' Compteur de boucle. Dim intFNum As Integer ' Numéro de fichier. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). intFNum = FreeFile ' Vous pouvez changer le chemin. Open "C:\Print.txt" For Output As #intFNum ' Décrit la procédure. intMsg = MsgBox("Fichier Print.txt ouvert") For intCtr = 1 To 5 Print # intFNum, intCtr; ' Remarquez le point-virgule. intMsg = MsgBox("Ecriture du chiffre " & intCtr & " dans Print.txt") Next intCtr Close # intFNum intMsg = MsgBox("Fichier Print.txt fermé") End Sub Listing 12.4 : Ecriture et lecture dans un fichier au sein d'une même procédure Private Sub cmdFileOut_Click () ' Crée le fichier séquentiel. Dim intCtr As Integer ' Compteur de boucle. Dim intFNum As Integer ' Numéro de fichier. intFNum = FreeFile Open "Print.txt" For Output As #intFNum For intCtr = 1 To 5 Print # intFNum, intCtr; ' Ecrit le compteur de boucle. Next intCtr Close # intFNum End Sub Private Sub cmdFileIn_Click () ' Lit le fichier séquentiel. Dim intCtr As Integer ' Compteur de boucle. Dim intVal As Integer ' Valeur lue. Dim intFNum As Integer ' Numéro de fichier. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). intFNum = FreeFile Open "Print.txt" For Input As #intFNum For intCtr = 1 To 5 Input # intFNum, intVal ' Affiche les résultats dans la fenêtre Exécution. intMsg = MsgBox("Lecture du chiffre " & intVal & " dans Print.txt") Next intCtr Close # intFNum intMsg = MsgBox("Le fichier Print.txt file est maintenant fermé") End Sub Listing 12.5 : Ecriture dans un fichier séquentiel avec Write Private cmdFile_Click () Dim intCtr As Integer ' Compteur de boucle. Dim intFNum As Integer ' Numéro de fichier. intFNum = FreeFile Open "c:\Write.txt" For Output As #intFNum For intCtr = 1 To 5 Write # intFNum, intCtr; ' Ecrit le compteur de boucle. Next intCtr Close # intFNum End Sub Listing 12.6 : L'instruction Type permet de déclarer les nouveaux types de données ' Page module du projet. Type UserType strFName As String strLName As String End Type Public Names As UserType Listing 12.7 : Les chaînes de longueur fixe permettent de spécifier la longueur des enregistrements ' Page module du projet. Type UserType2 strFName As String * 8 strLName As String * 20 End Type Public Names As UserType2 Listing 12.8 : Ecriture dans un enregistrement particulier Private Sub cmdCreate_Click() ' Cette procédure crée le fichier. Dim intFile As Integer ' Numéro de fichier disponible. Dim intCtr As Integer ' Compteur de boucle. intFile = FreeFile Open "c:\Random.Txt" For Random As #intFile Len = 5 ' La boucle parcourt les numéros et écrit dans le fichier. For intCtr = 1 To 5 Put # intFile, intCtr, intCtr ' Le numéro d'enregistrement correspond aux données. Next intCtr Close intFile End Sub Private Sub cmdChange_Click() ' Cette procédure modifie l'enregistrement n°3. Dim intFile As Integer ' Numéro de fichier disponible. intFile = FreeFile Open "c:\Random.Txt" For Random As #intFile Len = 5 ' Ecrit un nouvel enregistrement n°3. Put #intFile, 3, 9 ' Value = 9. Close # intFile End Sub Private Sub cmdDisplay_Click() ' Cette procédure affiche le fichier Dim intFile As Integer ' Numéro de fichier disponible. Dim intVal As Integer ' Valeur lue. Dim intCtr As Integer ' Compteur de boucle. Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). intFile = FreeFile Open "c:\Random.Txt" For Random As #intFile Len = 5 intMsg = MsgBox("Fichier Random.Txt ouvert...") ' La boucle parcourt les enregistrements et les affiche. For intCtr = 1 To 5 Get # intFile, intCtr, intVal intMsg = MsgBox("Lecture de " & intVal & " dans Random.Txt") Next intCtr Close # intFile intMsg = MsgBox("Fichier Random.Txt fermé") End Sub Listing 12.9 : Les types personnalisés peuvent être inclus dans un autre type personnalisé ' Dans la section de déclarations du module de code. Type Address strStreet As String strCity As String strZip As String End Type Type UserType3 strFName As String * 10 strLName As String * 25 typAddr As Address ' Autre type de données. End Type Public Names As UserType3 ' Déclare une variable d'application. Listing 12.10 : Le type de données public peut servir dans tous les modules Names.strFName = "Serge" Names.strLName = "Pichot" Names.typAddr.strStreet = "Clergeot" Names.typAddr.strCity = "Perrochonville" Names.typAddr.strZip "99000" ' Traite les données. lblFName.Caption = "Prénom : " & Names.strFName lblLName.Caption = "Nom : " & Names.strLName lblAddr.Caption = "rue : " & Names.strAddr.strStreet lblCty.Caption = "Ville : " & Names.strAddr.strCity lblZip.Caption = "Code postal : " & Names.strAddr.strZip Listing PB6.1 : Chargement du fichier dans un contrôle zone de liste Private Sub cmdColor_Click() ' Pour changer le contrôle d'arrière-plan ' de la zone de liste, l'utilisateur ' se servira de la boîte de dialogue Couleur. comFile.ShowColor lstFile.BackColor = comFile.Color End Sub Private Sub Form_Resize() Dim intMsg As Integer ' Valeur de renvoi de MsgBox(). ' Si l'utilisateur redimensionne la feuille, ' ajuste la taille de la zone de liste. ' ' Cette procédure événementielle s'exécute ' au premier chargement de la feuille. ' ' S'assure que la feuille est assez grande ' pour afficher la zone de liste. If (frmFile.Width < 400) Or (frmFile.Height < 3500) Then ' Masque la zone de liste et ' avertit l'utilisateur. lstFile.Visible = False intMsg = MsgBox("La feuille est trop petite pour afficher le fichier", _ vbCritical) Else ' Active l'affichage de la zone de liste, ' au cas où. lstFile.Visible = True ' Ajuste la taille de la zone de liste. ' Ajuste la position du bouton de commande. lstFile.Width = frmFile.Width - 1440 lstFile.Height = frmFile.Height - 2500 cmdColor.Left = (frmFile.Width / 2) - 500 End If End Sub Private Sub mnuFileExit_Click() ' Option de fermeture du programme. End End Sub Private Sub mnuFileOpen_Click() Dim strFileLine As String ' Gère le bouton Annuler. On Error GoTo comErrorHandler ' ' Affiche la boîte de dialogue Ouvrir. comFile.ShowOpen ' Continue si l'utilisateur clique sur OK, ' passe au gestionnaire d'erreurs s'il clique sur Annuler. ' ' Ouvre le fichier sélectionné par l'utilisateur. Open comFile.FileName For Input As #1 ' Vide la zone de liste pour faire de la place. lstFile.Clear ' ' Lit une ligne complète du fichier. Line Input #1, strFileLine lstFile.AddItem strFileLine ' ' Poursuit la lecture et remplit la zone de liste ' jusqu'à ce que la fin du fichier soit atteinte. Do Until (EOF(1)) Line Input #1, strFileLine lstFile.AddItem strFileLine Loop ' Ferme le fichier. Close comErrorHandler: ' Ne fait rien si l'utilisateur clique sur Annuler. End Sub Listing 13.1 : Le code prend connaissance de chaque imprimante du système Dim prnPrntr As Printer For Each prnPrntr In Printers ' Boucle dans la collection. frmMyForm.Print prnPrntr.DeviceName Next Listing 13.2 : Recherche d'une imprimante couleur sur le système de l'utilisateur Dim prnPrntr As Printer For Each prnPrntr In Printers If prnPrntr.ColorMode = vbPRCMColor Then ' Définit l'imprimante couleur comme imprimante par défaut. Set Printer = prnPrntr Exit For ' Ne cherche pas plus loin. End If Next ' Continue la boucle si nécessaire. Listing 13.3 : Cette procédure permet d'imprimer les contrôles de la feuille Sub PrintAnywhere (Src As Object, Dest As Object) Dest.PaintPicture Src.Picture, Dest.Width / 2, Dest.Height / 2 If TypeOf Dest Is Printer Then Printer.EndDoc End If End Sub Listing 13.4 : Print permet également d'envoyer une sortie vers la feuille Private Sub cmdPrint_Click() ' Envoie une sortie vers la feuille ' à l'aide de la méthode Print. Dim intCtr As Integer Dim intCurX As Integer Dim intCurY As Integer ' ' Définit les attributs de police. frmPrint.FontItalic = True frmPrint.FontBold = True frmPrint.FontSize = 36 ' ' Spécifie des mesures en twips. frmPrint.ScaleMode = vbTwips ' ' Enregistre les positions X et Y (en twips) ' à chaque itération de la boucle. For intCtr = 1 To 10 intCurX = frmPrint.CurrentX intCurY = frmPrint.CurrentY ' Texte noir et blanc en alternance. If (intCtr Mod 2) = 1 Then ' Compteur de boucle. frmPrint.ForeColor = vbWhite Else frmPrint.ForeColor = vbBlack End If ' Affiche le texte. frmPrint.Print "Visual Basic" ' ' Change les positions X et Y. frmPrint.CurrentX = intCurX + 350 frmPrint.CurrentY = intCurY + 300 Next intCtr End Sub Private Sub cmdExit_Click() End End Sub Listing 13.5 : Affichage d'un message sur la feuille, puis impression de la feuille Dim blnAutoRedraw As Boolean ' Contiendra la valeur de AutoRedraw. ' frmBlank.Print "Répartition du matériel" frmBlank.Print ' Blank line frmBlank.Print "Zone"; Tab(20); "Machines" frmBlank.Print "--------"; Tab(20); "--------" frmBlank.Print "Nord"; Tab(20); "Fraises" frmBlank.Print "Sud"; Tab(20); "Presses" frmBlank.Print "Est"; Tab(20); "Broyeurs" frmBlank.Print "Ouest"; Tab(20); "Giboliniseurs" ' ' Enregistre la valeur de AutoRedraw. ' blnAutoRedraw = frmBlank.AutoRedraw ' ' Imprime la feuille. ' frmBlank.AutoRedraw = True frmBlank.PrintForm ' ' Restaure AutoRedraw. ' frmBlank.AutoRedraw = blnAutoRedraw Listing 13.6 : On Error Goto permet de gérer les erreurs d'impression Private Sub cmdPrintForm_Click () Dim intBtnClicked As Integer On Error Goto ErrHandler ' Définit le gestionnaire d'erreur. frmAccPayable.PrintForm ' Imprime la feuille. Exit Sub ErrHandler: intBtnClicked = MsgBox("L'imprimante a un problème", vbExclamation, "Erreur d'impression") End Sub Listing 13.7 : Affiche une boîte de message avant de lancer l'impression Public Function PrReady() As Boolean ' Laisse à l'utilisateur le temps de se préparer. Dim intIsReady As Integer ' ' L'utilisateur répond à la boîte de message ' pour indiquer qu'il est prêt. intIsReady = MsgBox("Veuillez préparer l'imprimante", vbOKCancel, "Impression") ' If (intIsReady = vbCancel) Then PrReady = False Else PrReady = True End If End Function Listing 13.8 : Interroge la valeur de PrReady() avant d'imprimer Private Sub cmdPrint_Click() ' Imprime seulement si l'utilisateur ' indique qu'il est prêt. If PrReady() Then ' Appelle ReportPrint End If End Sub Listing 14.1 : Initialise les zones de liste et répond aux sélections de l'utilisateur Private Sub Form_Load() ' Initialise la liste déroulante Forme. lstShape.AddItem "0 - Rectangle" lstShape.AddItem "1 - Square" lstShape.AddItem "2 - Oval" lstShape.AddItem "3 - Circle" lstShape.AddItem "4 - Rounded Rectangle" lstShape.AddItem "5 - Rounded Square" ' Initialise la liste déroulante Motif. lstPattern.AddItem "0 - Solid" lstPattern.AddItem "1 - Transparent" lstPattern.AddItem "2 - Horizontal Line" lstPattern.AddItem "3 - Vertical Line" lstPattern.AddItem "4 - Upward Diagonal" lstPattern.AddItem "5 - Downward Diagonal" lstPattern.AddItem "6 - Cross" lstPattern.AddItem "7 - Diagonal Cross" ' Définit la première valeur de chaque liste comme valeur par défaut. lstShape.ListIndex = 0 lstPattern.ListIndex = 0 End Sub Private Sub lstPattern_Click() ' Change le motif en fonction de la sélection. shpSample.FillStyle = lstPattern.ListIndex End Sub Private Sub lstShape_Click() ' Change la forme en fonction de la sélection. shpSample.Shape = lstShape.ListIndex End Sub Private Sub mnuFileExit_Click() End End Sub Listing 14.2 : Dessin d'un motif à l'aide de la méthode Line, option "cadre" Private Sub cmdBoxes_Click() Dim intStartX As Integer Dim intStartY As Integer Dim intLastX As Integer Dim intLastY As Integer Dim intCtr As Integer intStartX = 0 intStartY = 0 intLastX = 1000 intLastY = 800 For intCtr = 1 To 20 frmBoxes.Line (intStartX, intStartY)-(intLastX, intLastY), , B ' prépare la position des prochains cadres. intStartX = intStartX + 400 intStartY = intStartY + 400 intLastX = intLastX + 400 intLastY = intLastY + 400 Next intCtr End Sub Listing 14.3 : Gestion du lecteur CD Private Sub Form_Load() ' Ouvre le CD. mmcCD.Command = "Open" End Sub Private Sub Form_Unload(Cancel As Integer) ' Réinitialise le contrôle multimédia. mmcCD.Command = "Close" End Sub Private Sub mmcCD_StatusUpdate() ' Met à jour le label de pistes. lblTrackNum.Caption = mmcCD.Track End Sub Listing 14.4 : Initialise les labels avec les informations d'état Private Sub mciWAV_StatusUpdate() ' Affiche l'état. If mmcWAV.Mode = mciModeNotOpen Then lblStatusValue(0).Caption = "Non prêt" ElseIf mmcWAV.Mode = mciModeStop Then lblStatusValue(0).Caption = "Arrêt" ElseIf mmcWAV.Mode = mciModePlay Then lblStatusValue(0).Caption = "Lecture" ElseIf mmcWAV.Mode = mciModeRecord Then lblStatusValue(0).Caption = "Enregistrement" ElseIf mmcWAV.Mode = mciModePause Then lblStatusValue(0).Caption = "Pause" ElseIf mmcWAV.Mode = mciModeReady Then lblStatusValue(0).Caption = "Prêt" End If ' Affiche le nom du fichier lu. lblStatusValue(1).Caption = mmcWAV.FileName End Sub Listing 14.5 : Associe le lecteur vidéo au contrôle PictureBox Private Sub Form_Load() ' Ouvre le lecteur vidéo. mmcVideo.Command = "Open" ' Connecte le lecteur vidéo au contrôle PictureBox. mmcVideo.hWndDisplay = picVideo.hWnd End Sub Listing PB7.1 : Les barres de défilement modifient la taille de l'image Private Sub hscScroll_Change() ' Change la largeur et la position horizontale de l'image. picScroll.Width = hscScroll.Value picScroll.Left = (frmScroll.Width / 2) - (picScroll.Width / 2) - 300 End Sub Private Sub vscScroll_Change() ' Change la hauteur et la position verticale de l'image. picScroll.Height = vscScroll.Value picScroll.Top = (frmScroll.Height / 2) - (picScroll.Height / 2) -300 End Sub Private Sub vscScroll_Scroll() ' Répond au curseur de défilement. Call vscScroll_Change End Sub Private Sub hscScroll_Scroll() ' Répond au curseur de défilement. Call hscScroll_Change End Sub Listing 15.1 : La boîte de dialogue Connexion permet à l'utilisateur de se connecter à votre application Option Explicit Public LoginSucceeded As Boolean Private Sub cmdCancel_Click() ' Affecte la valeur False à la variable globale ' pour indiquer l'échec de la connexion. LoginSucceeded = False Me.Hide End Sub Private Sub cmdOK_Click() ' Vérifie si le mot de passe est correct. If txtPassword = "password" Then ' Placer le code ici pour signaler ' à la procédure appelante la réussite de la fonction. ' Définir une variable globale est plus facile. LoginSucceeded = True Me.Hide Else MsgBox "Mot de passe non valide, réessayez !", , "Connexion" txtPassword.SetFocus SendKeys "{Home}+{End}" End If End Sub Listing 16.1 : Enregistrer l'objet contrôle conteneur OLE sur disque Dim intFileNum as Integer ' Obtenir le premier numéro de fichier disponible intFileNum = FreeFile ' Ouvrir le fichier de sortie Open "TEST.OLE" For Binary As #intFileNum ' Enregistrer le fichier oleObj1.SaveToFile intFileNum ' Fermer le fichier Close Listing 16.2 : Lire le contenu de l'objet contrôle conteneur OLE enregistré à la précédente exécution Dim intFileNum as Integer ' Obtenir le premier numéro de fichier disponible intFileNum = FreeFile ' Ouvrir le fichier de sortie Open "TEST.OLE" For Binary As #intFileNum ' Lire le fichier dans l'objet oleObj1.ReadFromFile intFileNum ' Fermer le fichier Close Listing 16.3 : Utilisation de Add pour ajouter des éléments à la nouvelle collection Dim Cities As New Collection Dim intCtr As Integer ' Ajoute les éléments Cities.Add "Tulsa" Cities.Add "Miami" Cities.Add "New York" Cities.Add "Seattle" ' Montre qu'il y a quatre villes frmMyForm.Print "Il y a "; Cities.Count; " villes :" ' Imprime chaque nom de ville For intCtr = 1 To Cities.Count frmMyForm.Print " "; Cities(intCtr) Next Listing 17.1 : Votre application peut utiliser Excel pour créer une feuille de calcul Private Sub cmdSendToExcel_Click() Dim obExcelApp As Object ' Objet Appplication Dim obWorkSheet As Object ' Objet Feuille de calcul Dim blnRunning As Boolean ' Si Excel était en exécution ' Déroutement des erreurs On Error Resume Next ' ' Référencer l'application Excel Set obExcelApp = GetObject(, "Excel.Application") If Err.Number <> 0 Then Set obExcelApp = CreateObject("Excel.Application") blnRunning = False ' Excel n'était pas en exécution Else blnRunning = True End If ' Ajouter un nouveau classeur obExcelApp.Workbooks.Add ' Référencer la feuille de calcul active Set obWorkSheet = obExcelApp.ActiveSheet ' Entrer des valeurs dans les cellules de la feuille active obWorkSheet.Cells(1, 1).Value = "Ventes" obWorkSheet.Cells(1, 2).Value = "Mois" obWorkSheet.Cells(2, 1).Value = 21913.44 obWorkSheet.Cells(2, 2).Value = "avril" ' Sélectionner la deuxième ligne pour formater obWorkSheet.Rows("2:2").Select obExcelApp.Selection.NumberFormat = "$##,###.##" ' Enregistrer le classeur (changez ce nom s'il existe déjà) obExcelApp.Save ("c:\VBCreated.XLS") ' Ne pas quitter si Excel était déjà lancé ! obExcelApp.ActiveWorkBook.Close False If Not (blnRunning) Then ' S'il n'était pas lancé... obExcelApp.Quit ' alors quitter Excel End If End Sub Listing 17.2 : L'assistant a initialisé les valeurs par défaut des nouvelles propriétés 'Valeurs de propriétés par défaut: Const m_def_AutoTSize = 1 Const m_def_ULText = 0 'Variables de propriétés: Dim m_AutoTSize As Variant Dim m_ULText As Variant Listing 17.3 : Vous devez définir les valeurs énumérées qui s'afficheront dans la fenêtre Propriétés Public Enum AutoTSizeEnum NA = 1 Small = 2 Medium = 3 Large = 4 End Enum Public Enum ULTextEnum AsIs = 0 Uppercase = 1 Lowercase = 2 End Enum Listing 17.4 : Le nouveau contrôle ActiveX sera à la même place et de la même taille que le contrôle TextBox interne Private Sub UserControl_Resize() ' Définit la hauteur et l'échelle à celle du contrôle sous-jacent ' Etend le contrôle aux bonnes largeur et hauteur If UserControl.Height <> txtParent.Height Then txtParent.Height = UserControl.Height End If txtParent.Move 0, 0, UserControl.ScaleWidth End Sub Listing 17.5 : Les procédures Get des nouvelles propriétés doivent renvoyer les valeurs énumérées correspondantes Public Property Get AutoTSize() As AutoTSizeEnum AutoTSize = m_AutoTSize End Property Public Property Get ULText() As ULTextEnum ULText = m_ULText End Property Listing 17.6 : Vous devez compléter les procédures Let des deux propriétés Public Property Let AutoTSize(ByVal New_AutoTSize As AutoTSizeEnum) m_AutoTSize = New_AutoTSize ' Tester l'état de la propriété et en modifier la taille ' en fonction de sa valeur ' Select Case New_AutoTSize Case 1: ' Pas de modification nécessaire Case 2: Font.Size = 72 * 0.25 * (Height / 1440) Case 3: Font.Size = 72 * 0.5 * (Height / 1440) Case 4: Font.Size = 72 * 0.75 * (Height / 1440) End Select PropertyChanged "AutoTSize" End Property Public Property Let ULText(ByVal New_ULText As ULTextEnum) m_ULText = New_ULText ' Tester l'état du contrôle ' et modifier en fonction la zone de texte ' (ignorer ULText à 0 qui signifie tel quel) If New_ULText = 1 Then Text = UCase(txtParent.Text) ElseIf New_ULText = 2 Then Text = LCase(txtParent.Text) End If PropertyChanged "ULText" End Property Listing 17.7 : Ces procédures événementielles permettront de tester le nouveau contrôle ActiveX Private Sub cmdSmall_Click() ' Test de la conversion Small MyFirstCtl.AutoTSize = Small End Sub Private Sub cmdMedium_Click() ' Test de la conversion Medium MyFirstCtl.AutoTSize = Medium End Sub Private Sub cmdLarge_Click() ' Test de la conversion Large MyFirstCtl.AutoTSize = Large End Sub Private Sub cmdUpper_Click() ' Test de la conversion en majuscules MyFirstCtl.ULText = Uppercase End Sub Private Sub cmdLower_Click() ' Test de la conversion en minuscules MyFirstCtl.ULText = Lowercase End Sub Listing PB8.1 : Le code de l'animation peut être simple Private Sub cmdAni_Click() ' Utilise le bouton pour commander l'animation If cmdAni.Caption = "&Animer" Then cmdAni.Caption = "&Stop" tmrAni.Enabled = True Else cmdAni.Caption = "&Animer" tmrAni.Enabled = False End If End Sub Private Sub mnuHelpAbout_Click() mmcEnv.Command = "Open" mmcEnv.Command = "Play" frmAbout.Show End Sub Private Sub tmrAni_Timer() ' Determine le bon emplacement ' d'image à afficher ' ' La variable suivante part de zéro ' et conserve sa valeur à chaque exécution ' de la procédure. Static intCounter As Integer Select Case intCounter Case 0: picAni1.Picture = picAni2(1).Picture picAni2(2).Visible = True picAni2(2).Left = 3840 picAni2(2).Top = 1220 intCounter = 1 Case 1: picAni1.Picture = picAni2(1).Picture picAni2(2).Visible = True picAni2(2).Left = 4040 picAni2(2).Top = 1120 intCounter = 2 Case 2: picAni1.Picture = picAni2(1).Picture picAni2(2).Visible = True picAni2(2).Left = 4240 picAni2(2).Top = 1220 intCounter = 3 Case 3: picAni1.Picture = picAni2(0).Picture picAni2(2).Left = 4440 picAni2(2).Top = 1320 intCounter = 4 Case 4: ' Arrêter l'animation picAni1.Visible = True intCounter = 0 picAni2(2).Visible = False End Select End Sub Listing PB9.1 : Vous pouvez utiliser des méthodes d'écriture des données dans la table par programmation Private Sub cmdSave_Click() ' Assigne toutes les TextBox aux champs. ' N'assigne que les données non nulles ' (les lignes longues sont découpées) adoBooks.Recordset!Title = _ IIf(txtTitle = "", "N/A", txtTitle) adoBooks.Recordset![Year Published] = _ IIf(txtPub = "", "N/A", txtPub) adoBooks.Recordset!ISBN = _ IIf(txtISBN = "", "N/A", txtISBN) adoBooks.Recordset!PubID = _ IIf(txtPubID = "", "N/A", txtPubID) adoBooks.Recordset!Subject = _ IIf(txtSubject = "", "N/A", txtSubject) ' Effectue la mise à jour réelle du recordset adoBooks.Recordset.Update End Sub Listing 19.1 : Quelques lignes de code HTML peuvent révéler comment fonctionne le code de formatage des pages Web