Ноу Інти, лекція, логічні типи, конструкції і компоненти

Анотація: В лекції представлений вичерпний матеріал по роботі з логічними даними. Існуючі логічні типи, операції над ними, а також компоненти TCheckBox, TCheckGroup, TRadioButton, TRadioBox. Приклади програм демонструють всі можливості роботи з логічними типами.

мета лекції

Вивчення способів роботи з логічними типами даних. Вивчення основних компонентів для роботи з цими типами.

Логічний тип даних

У попередніх лекціях ми вже зустрічалися з таким типом - деякі властивості компонентів могли приймати тільки одне з двох значень: або True (Істина), або False (Брехня). Це і є логічний тип даних. У Паскалі це тип Boolean. який займає один байт оперативної пам'яті. У Lazarus, крім того, є типи ByteBool (теж 1 байт), WordBool (2 байта) і LongBool (4 байта). Всі ці типи можуть приймати лише одне з двох значень: true або false. На практиці, щоправда, таке різноманіття не застосовується, програмісти цілком обходяться тільки одним стандартним типом boolean. Ви можете створити змінну такого типу і присвоїти їй true або false. Крім того, нерідко зустрічаються вирази, які в результаті теж дають або Істину. або Брехня. вони також вважаються логічними. Наприклад, якщо ви надасте логічної змінної вираз 3> 2. то в змінну потрапить True. так як три дійсно, більше двох.

Отже, що ж можна робити з логічними даними, крім присвоювання їм значень True або False. Їх можна порівнювати між собою, використовуючи для цього оператори порівняння:

Давайте розберемо дії цих операцій детальніше.

Операція NOT (НЕ), на відміну від інших логічних операцій, працює тільки з одним операндом. Це - операція-перевертень: якщо операнд містить True. то повертається результат буде False. і навпаки. Цю операцію дуже часто застосовують для того, щоб поміняти значення логічної змінної (або властивості) на протилежне, наприклад,

Операція AND (І) повертає True тільки в тому випадку, якщо обидва порівнюваних операнда містять True. Якщо перший операнд містить False. подальша перевірка вже не проводиться (сенсу немає), і AND повертає False. Якщо перший операнд містить True. то AND робить перевірку другого операнда - якщо він також містить True. то і повертається результат буде True. інакше повертається False.

Операція OR (АБО) діє схожим чином, але повертає True в тому випадку, якщо хоч один з операндів містить True. OR перевіряє перший операнд. Якщо він True. подальша перевірка вже не виробляється, і OR повертає True. Інакше OR перевіряє другий операнд - якщо він True. то і повертається True. в іншому випадку повертається False.

Операція XOR (виключає Або) завжди перевіряє обидва операнда, і повертає True тільки тоді, коли один з операндів True. а інший обов'язково False. Правда, на практиці XOR зазвичай не використовують, оскільки завжди простіше виконати перевірку A <> B. яка повертає такий же точно результат.

Отже, приклади роботи з логічними даними (в Lazarus їх виконувати не потрібно):

Керуюча конструкція IF

Від логічного типу даних було б мало користі, якби ми не могли застосовувати різні дії в залежності від результатів перевірки - якщо у змінній знаходиться Істина. тоді виконати один код, інакше виконати інший код. Саме таку можливість надає керуюча конструкція IF.

Найпростіший синтаксис цієї конструкції такої:

Англійське IF перекладається як ЯКЩО. а THEN - ТОДІ. Тут все досить зрозуміло: якщо якесь умовне вираз (логічна змінна або логічне властивість компонента) має значення True. тоді виконується вказане дію. Тепер ми можемо вивчати приклади на практиці. Завантажте Lazarus з новим проектом. Посеред вікна встановіть кнопку TButton. Збережіть проект в папку 07-01 під ім'ям MyBool; не забудьте головну форму назвати fMain. а зберігається модуль - Main. Потім згенеруйте подія натискання на кнопку, яка оформите наступним чином:

Тут все гранично просто: оголошуємо логічну змінну b. потім присвоюємо їй значення True (Істина). В рядку

ми перевіряємо: якщо b має значення True (тобто, якщо b істинна), тоді ми виводимо повідомлення "Істина". Збережіть і запустіть проект. Натискання на кнопку викличе висновок повідомлення. Можете для прикладу привласнити b значення False - в цьому випадку натискання на кнопку не викличе ніякого повідомлення.

До речі, в даному випадку в якості умови ми вказали просто ім'я змінної b. Адже вона вже містить значення True. Так що рядок

Якщо ми будемо розширювати умова за допомогою умовних операцій, то всі операнди слід укласти в дужки. Виняток становить операція NOT. яка працює тільки з одним операндом. Змінимо код:

Тут ми перевіряємо вже дві умови. І якщо перше (a = b) поверне нам False. то друге b поверне True. І так як ми використовуємо операцію OR. нам досить, щоб хоч один з операндів був True. Значить, повідомлення буде виконано. Якби у другому операнд ми порівнювали b ще з чимось, то його теж слід було б помістити в дужки. наприклад,

У цьому прикладі повідомлення "Істина" буде виведено, так як у другому операнд b дійсно більше, ніж a. Якщо ви забудете про дужки, компілятор не стане вказувати вам на помилку, і програма буде запущена. Однак результат може виявитися невірним. Наприклад, якщо ми приберемо дужки в першому прикладі:

Те повідомлення "Істина" не буде виконано. Адже оператор IF робить тільки одну перевірку, значить, він перевірить тільки a = b. Частина умови з OR буде пропущена, тому що ми не уклали операнди в дужки. Так що якщо ви в умови застосовуєте операції AND. OR або XOR. не забувайте укладати операнди в дужки. Дужки можна не використовувати, якщо в якості операндів ви вказуєте по одній умовній змінної або властивості, наприклад, код:

виведе повідомлення "Істина", так як в b міститься True.

Керуючий оператор IF не дарма називають конструкцією, його синтаксис може складатися з декількох частин:

Англійське ELSE перекладається як ІНАКШЕ. Тут, ЯКЩО якась умова поверне True. то буде виконано Действіе1. ІНАКШЕ буде виконано Действіе2. Зверніть увагу, що перед ELSE крапку з комою НЕ СТАВЛЯТЬ! Змінимо код:

Натискання на кнопку викличе повідомлення "Істина", однак якщо потім ви виправите код, і в змінну b замість True помістіть False. то вийде повідомлення "Брехня" - перевірте це самі.

Однак конструкція IF може бути і складніше. Що, якщо нам потрібно перевірити не одне, а два умови? Або більше? Повний синтаксис цієї конструкції такої:

Давайте розбиратися. У цій конструкції, якщо Условіе1 поверне True. то буде виконано Дествіе1. і на цьому конструкція закінчиться. Якщо ж воно поверне False. перевірка буде продовжена. Якщо таке Условіе2 поверне True. то буде виконано Дествіе2. і так далі, подібних перевірок може бути скільки завгодно. Якщо ж всі перевірки умов повернуть False. то буде виконано ДействіеІНАЧЕ. Змінимо код:

Як ви думаєте, яке повідомлення вийде в даному випадку? І скільки повідомлень вийде? Якщо ви сказали, що вийде тільки одне повідомлення "Дія №2", то ви засвоїли конструкцію IF. Інакше раджу повернутися назад, і уважніше вивчити все вищесказане.

Дякуємо за Ваш чудовий курс!

У самостійній роботі №2 при компіляції модуля MyCript.pas (ОС: Windows 7 x64, Lazarus 1.4 win64) видається помилка на код асемблера

mycript.pas (54,5) Error: Asm: [push reg32] invalid combination of opcode and operands
mycript.pas (95,5) Error: Asm: [pop reg32] invalid combination of opcode and operands

Я розумію, що курс готувався для 32 розрядних ОС, але як бути в разі 64 розрядних систем?

У обробниках пунктів меню FileCreate і FileOpen, а також в обробнику закриття форми OnClose - в цих трьох процедурах міститься один і той же код

їх перед створенням нового тексту>
if Memo1.Modified then begin
// якщо користувач згоден зберегти зміни:
if MessageDlg ( 'Збереження файлу',
'Поточний файл був змінений. Зберегти зміни?',
mtConfirmation, [mbYes, mbNo, mbIgnore], 0) = mrYes then
FileSaveClick (Sender);
end; // if

Дозвольте запитати: чи не краще було б винести цей код в окрему процедуру, наприклад - в обробник події форми OnCloseQuery? Наскільки я пам'ятаю з досвіду Delphi, виклик цієї процедури сам по собі не повинен призводити до закриття форми. А значить, її можна використовувати і в процедурах очищення Memo1 і читання з файлу. Або в Lazarus так робити не можна?

Схожі статті