Направете цикли - цикъл докато
За да изпълните тялото на цикъла поне веднъж, трябва да използвате втората форма на израза тип Do While. В този случай условието се поставя в самия край на цикъла, след ключовите думи Loop While. Това поставяне на условието казва на програмата, че първо трябва да изпълни операторите на цикъла и след това да тества условието за истинност. По-долу е фрагмент от код, който определя дали дадено число е просто (простото число се дели само на единица и самото себе си без остатък).
Dim N като дълго
Dim D като дълъг разделител
Dim Sim като булев флаг за просто число
N = txtN 'четене на число от текстово поле txtN
S = Истинското число е просто
D = 2 'начална стойност на делителя
Стартирайте цикъла
Ако N mod D = 0 Тогава S = False 'ако N се дели на D,
„тогава числото N не е просто
D = D + 1 'увеличете делителя с едно
Когато използвате тази форма на оператор тип Do While, бъдете особено внимателни, защото тялото на цикъла се изпълнява за първи път без проверка на определеното условие. Ако тялото на цикъла съдържа оператори, които могат да бъдат изпълнени с грешки, тогава е по-добре да използвате оператор на цикъл с предварително условие.
внимание! Не поставяйте условие едновременно в началото и в края на цикъла, след ключовите думи Do While и Loop While, тъй като това ще доведе до грешка по време на изпълнение на програмата.
Цикли като Do Until
Циклите Do Until работят подобно на циклите Do While, обсъдени по-горе, с едно изключение. Тялото на цикъл Do Until ще се изпълни само ако условието е невярно,, докато циклите Do While ще се изпълнят само ако условието е вярно. По този начин, веднага щом условието стане вярно, цикълът Do Until прекратява. Същото като заDo While цикли, има две форми на Do Until цикли. Те се различават по местоположението на условието - в началото на цикъла (в оператора Do Until), или в края на цикъла (в оператора Loop Until). Ако условието е в началото на цикъла в оператор Do, то се проверява преди цикълът да бъде изпълнен. Ако условието е поставено в края на цикъла, в оператора Loop, то се проверява след изпълнението на цикъла. Така във втория случай цикълът ще се изпълни поне веднъж, докато в първия случай може изобщо да не се изпълни.
Кодовият фрагмент по-долу чете стойност на положително цяло число от текстовото поле txtN, разлага това число на прости множители и добавя тези множители към списъка lstMul.
Затъмнете N като цяло число
Dim D като цяло число
N = txtN 'четене на число от текстово поле txtN
D = 2 'начална стойност на делителя
Стартирайте цикъла
Do While N mod D = 0 'докато остатъкът от N, разделен на D стане нула
N = N \ D 'цялочислено деление на N на D
lstMul.AddItem D 'Добавяне на D към списъка
Операция за край на цикъл
D = D + 1 'увеличете делителя с едно
Loop Until N = 1 'излезте от цикъла, ако N = 1
Горният кодов фрагмент съдържа два цикъла, вложени един в друг. Външният цикъл (Do ... Loop Until N = 1) е цикъл с постусловие. Изпълнява се поне веднъж и се изпълнява, докато N стане равно на единица. Условието (N = 1) е условието за излизане от цикъла. Външният цикъл съдържа вътрешния цикъл и оператора за увеличаване на делителя D с единица.
Вътрешният цикъл (Do While N mod D = 0 ... Loop) е цикъл с предварително условие. Проверява дали числото N се дели равномерно на D и ако се дели, дели двете числаедин върху друг и добавя стойността на делителя D към списъка lstMul. Тези операции продължават, докато числото N вече не се дели на числото D.
Ако N = 180, то ще бъде разделено два пъти на 2, два пъти на 3, никога на 4 и веднъж на 5. След тези операции N ще стане равно на едно и кодовият фрагмент ще излезе. В резултат на това списъкът ще съдържа низове със стойности 2, 2, 3, 3, 5. Не е трудно да се види, че тези числа са прости и техният продукт е 180.
В следния кодов фрагмент, в процедурата за валидиране на въвеждане, програмата подканва потребителя да въведе число в InputBox, докато потребителят го направи.
Private Sub txtN_Validate(Cancel As Boolean)
Направете Until IsNumeric ( txtN ) 'докато txtN не е число
предлага да се въведе число в прозореца за въвеждане и го предава в полето txtN
txtN = InputBox ("Въведете число", "Грешка", 5)
Операция за край на цикъл
While-Wend Loops
съвет. Когато пишете програма, препоръчваме отстъп на изрази, разположени вътре в цикъл или друга структура (например в блока If ... Then ... Else или между служебните думи For ... Next). Това ще подобри възприемането на програмата. За да направите отстъп в началото на ред, натиснете клавиша Tab.След като въведете текущия оператор и натиснете Enter, за да преминете към следващия ред, Visual Basic автоматично ще постави курсора директно под предишния оператор, като по този начин зачита нивото на отстъп (или влагане) на изразите. За да преместите няколко реда надясно, изберете ги и натиснете Tab, за да преместите наляво Shift+Tab. Опитайте се винаги да правите отстъп на началните и крайните изрази на блок от код, както се прави във всички примери в тази книга.
Изброеницикли
Visual Basic предоставя друг вариант на цикъла, който започва с ключовите думи For Every. Това е така нареченият изброен тип цикъл, тъй като се използва за обработка на всеки елемент от някакъв набор от обекти. Набори от обекти могат да се съхраняват като колекции.
Един пример за колекция е колекцията Printers. Това е вградена колекция на Visual Basic, която съхранява всички принтери, инсталирани в системата, като обекти. Следният кодов фрагмент използва цикъл For Every, за да отпечата стойността на свойството DeviceName на всички системни принтери.
Dim objPrinter като принтер
За всеки objPrinter в Принтери
Циклите For Every могат да се използват и за обработка на контроли във формуляр, както е показано в примера по-долу.
За всеки ctrl В frmMain 'за всяка контрола във формуляра frmMain
If Left ( ctrl.Name , 3 ) = "txt" Then 'ако името на контролата започва с "txt"
'задайте цвета на фона на контролата да бъде същият като frmMain на формуляра
ctrl.Locked = True 'заключване на контролата
End If ‘край на условен оператор
Next ctrl 'преминаване към следващата контрола
Горният кодов фрагмент има достъп до всички контроли във формуляра frmMain и ако името на контролата започва с подниза „txt“ (всички текстови полета, ако следвате конвенцията за стандартни префикси в имената на контролите), тогава цветът на фона на контролата е зададен на същия като този на формуляра frmMain. Освен това всички текстови полета са блокирани (потребителят няма да може да променя съдържанието на полетата).