Ноу Інти, лекція, символи і рядки
У Lazarus основним строковим типом є String (англ. String - рядок). На форму нашого проекту розмістіть ще одну кнопку. Її обробник буде виглядати так:
Як бачите, оскільки рядок в Lazarus має формат UTF8, то ніяких особливих хитрощів для роботи з рядками тут не потрібно, в змінну типу String можна записати будь-який, в тому числі і український текст. Розмір рядка String необмежений, проте є можливість жорстко поставити розмір. Такий спосіб використовується, коли ви точно знаєте, що більше цього розміру рядок не буде. У цьому випадку розмір вказується після ключового слова String в квадратних дужках, наприклад:
У змінну MyStr можна записати до 50 символів. Найбільшою довжиною строки, який можна жорстко задати таким способом - 255 символів. Однак маються на увазі символи ASCII. тобто англійські, однобайтові. приклад:
Даний приклад помилки не викличе, проте повідомлення вийде в повному обсязі, а обрізаним: "При". Тобто, три перших літери зайняли 6 байт. четверта вже не вмістилася. В даному випадку буде правильним вказати розмір не 7, а 14 - по подвоєному кількості букв. Втім, на практиці зазвичай застосовують тип String без обмежень, в цьому випадку рядок обробляється правильно.
Майте на увазі, що тип String є динамічним, тобто, заздалегідь пам'ять для нього не виділяється. Строго кажучи, виділяється пам'ять на покажчик рядки, а не на саму рядок. Фізично рядку виділяється необхідна пам'ять тільки в момент присвоєння їй якогось значення. Однак нерідко виникає необхідність очистити такий рядок. Для цього досить привласнити їй порожні лапки, без пробілів і без будь-яких інших символів:
В цьому випадку, рядку присвоюється значення Nil. тобто нуль, нічого, і рядок стає порожній.
Строкової змінної можна присвоювати значення символьних змінних або констант, наприклад:
Крім String в Lazarus є й інші строкові типи.
Коротка рядок, яка може містити максимум, 255 ASCII-символів. Тобто, ShortString - це String [255].
На практиці коротку рядок використовують вкрай рідко, адже якщо потрібна коротка рядок, то її розмір можна вказати явно. Тому даний перемикач виправляти вручну зазвичай не доводиться. Давайте вважати, що String і AnsiString - це одне і те ж.
Як правило, рядках одного типу можна присвоювати значення рядків іншого типу, компілятор автоматично перетворює текст. Виняток становлять рядки PChar. тут нам доведеться робити перетворення вручну, за допомогою функції PChar (). Виправимо обробник другої кнопки:
Збережіть проект, скомпілюйте і запустіть. При натисканні на другу кнопку у вас вийде повідомлення з трьох рядків
Є ще типи UnicodeString і WideString. обидва типи містять двобайтові символи. Але працювати з такими типами незручно - виникають проблеми з кирилицею, для нас набагато зручніше простий String. Тому розглядати дані типи ми не будемо.
Резюмуємо деякі положення:
- Три основних строкових типу: AnsiString. ShortString і PChar.
- Зазвичай вказують тип String. Якщо перемикач включений (за замовчуванням), то використовується тип AnsiString. Інакше - ShortString.
- Рядку можна присвоїти або текст, укладений в одинарні лапки, або вміст іншої строкової змінної, наприклад:
- Рядку типу PChar можна привласнити або текст, або вміст іншої строкової змінної. Але якщо тип цієї змінної відрізняється, то потрібно зробити перетворення функцією PChar ():
Дякуємо за Ваш чудовий курс!
У самостійній роботі №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 так робити не можна?