Променливи и типове данни

Post on 21-Mar-2016

100 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Променливи и типове данни. Лекция No 3. Променливи и типове данни. Типът задава вида на данните: големина в брой байтове, начин на представяне в паметта, диапазон. Когато се декларира променлива, трябва да се зададе типа й. Всеки израз и/или функция връща резултат от определен тип. - PowerPoint PPT Presentation

TRANSCRIPT

Д. Гоцева ПИК 1

Променливи и типове данни

Лекция No 3

ПИК 2Д. Гоцева

Променливи и типове данни Типът задава вида на данните: големина в

брой байтове, начин на представяне в паметта, диапазон.

Когато се декларира променлива, трябва да се зададе типа й.

Всеки израз и/или функция връща резултат от определен тип.

Функциите и процедурите могат да имат параметри, на които също трябва да се специфицира типа.

ПИК 3Д. Гоцева

Променливи и типове данни

Object Pascal е “строго типизиран” език. В случай, че се налага използване на

различни типове, трябва да се прибягва до преобразуване на типове, безтипови указатели, варианти, вариантни части на записи и абсолютно адресиране.

ПИК 4Д. Гоцева

Видове типове

предефинирани /predefined/ (вградени): компилаторът разпознава типовете автоматично;

създадени чрез декларация /created by declaration/: налага се предварителна декларация; тук се включват всички потребителски дефинирани типове и тези в библиотеките на Delphi.

ПИК 5Д. Гоцева

Видове типове

фундаментални /fundamental/: имат еднакво представяне, диапазон, обхват във всички реализации на Object Pascal, независимо от процесора и операционната система;

родови /generic/: те са платформено зависими. Такива са integer, character, string, и pointer.

ПИК 6Д. Гоцева

Дърво на типовете в Object Pascal Прости данни

Подредени данни цели символни булеви изброени диапазон

реални низови

Структурирани данни множество масив запис файл клас псевдоним към класа интерфейс

указатели процедури данни тип вариант (<типов спецификатор>)

ПИК 7Д. Гоцева

Типове данни в Object Pascal

Стандартната функция SizeOf работи с всички променливи и типове. Тя връща цяло число, равно на обема памет (в брой байтове) заделени за променливата/типа.

Пример: SizeOf(Longint) връща 4.

ПИК 8Д. Гоцева

Прости типове данни

Тук се включват:Подредени данниРеални данни

ПИК 9Д. Гоцева

Подредени данни

Подредените данни са: Integer;Character;Boolean;изброени данни;данни диапазон.

ПИК 10Д. Гоцева

Подредени данни

Те дефинират подредено множество от стойности, където всяка стойност, без първата има уникален предшественик и всяка стойност, без последната, има уникален следващ елемент, т.е. налице е подреденост на данните.

ПИК 11Д. Гоцева

Подредени данни

За тип integer подредбата на елементите съвпада с тяхната стойност.

за всички останали типове, с изключение на данни диапазон, първата стойност заема позиция 0 в реда, следващата е на позиция 1 и т.н.

ПИК 12Д. Гоцева

Подредени данни – предефинирани функции

Функция

Параметър

Връщана стойност Забележка

Ord

Израз от подреден тип

Числовата позиция в подредбата

Не работи с Int64 тип.

Pred

Израз от подреден тип

Предшественика на параметъра в реда

Не трябва да се използва при свойства, които имат процедура за запис.

ПИК 13Д. Гоцева

Подредени данни – предефинирани функции

Succ Израз от подреден тип

Елемента, следващ параметъра в реда

Не трябва да се използва при свойства, които имат процедура за запис.

High

Типов спецификатор или променлива от подреден тип

Най-голямата данна от този тип

Работи при къси низове и масиви.

Low

Типов спецификатор или променлива от подреден тип

Най-малката данна от този тип

Работи при къси низове и масиви.

ПИК 14Д. Гоцева

Подредени данни

Стандартните процедури Inc и Dec увеличават и намаляват стойността на подредена променлива.

Пример: Inc(I) е еквивалентно на I := Succ(I), а ако I е цяла променлива, на I := I + 1.

ПИК 15Д. Гоцева

Цели типове данни

Те nредставят подмножество на целите числа.

Родовите типове са Integer и Cardinal. Фундаменталните цели типове

включват Shortint, Smallint, Longint, Int64, Byte, Word, и Longword.

ПИК 16Д. Гоцева

Цели типове данни - родови

Тип Обхват Формат на представяне

Integer -2147483648..2147483647 знаково 32-битово

Cardinal 0..4294967295 Беззнаково 32-битово

ПИК 17Д. Гоцева

Цели типове данни - фундаментални

Тип Обхват Формат на представяне

Shortint -128..127 знаково 8-битово

Smallint -32768..32767 знаково 16-битово

Longint -2147483648..2147483647 знаково 32-битово

ПИК 18Д. Гоцева

Цели типове данни - фундаментални

Int64 -2^63..2^63-1 знаково 64-битово

Byte 0..255 беззнаково 8-битово

Word 0..65535 беззнаково 16-битово

Longword 0..4294967295 беззнаково 32-битово

ПИК 19Д. Гоцева

Цели типове данни

Аритметичните операции връщат стойност от тип Integer с изключение на случаите, когато в тях присъства операнд от тип Int64.

Пример:var

    I: Integer;     J: Int64;     ...     I := High(Integer);     J := I + 1; J := Int64(I) + 1;

ПИК 20Д. Гоцева

Цели типове данни Повечето стандартни процедури и

функции, които получават целочислени параметри, отрязват Int64 до 32-битови.

Изключение правят High, Low, Succ, Pred, Inc, Dec, IntToStr, и IntToHex, които поддържат напълно Int64.

Функциите Round, Trunc, StrToInt64, и StrToInt64Def връщат Int64.

Ord не работи с Int64.

ПИК 21Д. Гоцева

Цели типове данни

Когато се увеличи последната стойност или се намали първата на целочислен тип, се получава първата, респективно последната стойност от типа.

Ако е включена опция range-checking на компилатора, ще се генерира runtime грешка.

ПИК 22Д. Гоцева

УПРАЖНЕНИЕ 3Работа с визуални компоненти - бутони Button: дава бутон, чрез който

потребителят може да изпълни някаква операция (напр. спиране, стартиране на някой процес и др.)

CheckBox: бутон за маркиране. Осигурява Да/Не, True/False или On/Off опции.

ПИК 23Д. Гоцева

УПРАЖНЕНИЕ 3Работа с визуални компоненти - бутони BitBtn: графични бутони. Дават възможност за

поставяне не само на надпис, но и малка картина-икона. Иконите обикновено са графично пояснение за действието на бутона. Делфи предоставя стандартен набор от бутони, които можете да използвате наготово при създаване на приложенията си. Различните видове се избират с помощта на свойството Kind.

SpeedButton: оперативни бутони. Тези компоненти са предвидени, за да се ускори разработването на панели с инструменти (toolbars). Оперативният бутон има само икона и няма име.

ПИК 24Д. Гоцева

УПРАЖНЕНИЕ 3Работа с визуални компоненти - бутони RadioButton: осигурява взаимно изключващи се

опции. Радио бутоните обикновено се използват съединени в групова кутия, където само един от тях е разрешен в един момент от време.

RadioGroup: представлява група с няколко радио бутона в нея. Елементите в нея са част от един списък от низове (Items). Свойството ItemIndex е цяло число, което връща номера на реда, които е избран. По подразбиране ItemIndex има стойност –1, което означава, че не избран нито една от опциите.

ПИК 25Д. Гоцева

УПРАЖНЕНИЕ 3Стандартни процедури за съобщенияПроцедура Модул Описание

procedure ShowMessage(const Msg: string);

Dialogs Показва диалогова кутия с бутон ОК

function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word;

Dialogs Показва диалогова кутия в центъра на екрана като програмиста задава бутоните

ПИК 26Д. Гоцева

УПРАЖНЕНИЕ 3Бутони, използвани от MessageDlg Предефинирани са следните бутони:

mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mnNoToAll, mbYesToAll, mbHelp.

В добавка са предефинирани и най-използваните комбинации: mbYesNoCancel, mbOKCancel, mbAbortRetryIgnore.

ПИК 27Д. Гоцева

УПРАЖНЕНИЕ 3Диалогови типове, използвани от MessageDlgДиалогов тип ЗначениеmtWarning Диалогова кутия съдържаща жълт

удивителен знак.mtError Диалогова кутия съдържаща червен знак

stop.

mtInformation Диалогова кутия съдържаща синя буква "i".

mtConfirmation Диалогова кутия съдържаща зелен въпросителен знак.

mtCustom Диалогова кутия без картинка.

ПИК 28Д. Гоцева

УПРАЖНЕНИЕ 3Връщана стойност от MessageDlg

mrNone mrAbort mrYes mrOk

mrRetry mrNo mrCancel mrIgnore mrAll

ПИК 29Д. Гоцева

УПРАЖНЕНИЕ 3Задачи Да се намери сумата, средното аритметично,

минималният и максималният елементи на масив от 100 числа, които са записани във файл ‘Data.txt’. Резултата да се изведе в диалогова кутия.

Да се добави възможност за избор на типа на елементите на масива (цели или реални числа) и ако са цели – да се определи сума на четните и сума на нечетните числа. Резултата да се изведе в диалогова кутия.

Д. Гоцева ПИК 30

Променливи и типове данни

Лекция No 4

ПИК 31Д. Гоцева

Символни типове

Фундаментални символни типове:AnsiChar - еднобайтови (8 бита) символи,

подредени съгласно разширената ANSI кодова таблица;

WideChar - двубайтови (16 бита) символи, подредени по Unicode кодова таблица.

Първите 256 Unicode символи съвпадат със същите от ANSI.

ПИК 32Д. Гоцева

Символни типове

Родовият тип е Char, който е еквивалентен на AnsiChar.

Тъй като реализацията на Char подлежи на промяна, добра идея е използването на стандартната функция SizeOf при определяне на размер.

ПИК 33Д. Гоцева

Символни типове

Предефинираната функция Chr връща символа за всяко цело число в диапазона на AnsiChar или WideChar.

Символните стойности работят като целите при намаляване на най-малката или увеличаване на най-голямата (докато не е включена range-checking опция на компилатора).

ПИК 34Д. Гоцева

Булеви типове

предефинирани булеви типове: Boolean ByteBool WordBool LongBool

Boolean е предпочитаният тип. Останалите съществуват за съвместимост с различните езици за програмиране и средата Windows.

ПИК 35Д. Гоцева

Булеви типове

Променлива от тип Boolean заема един байт памет.

Променлива от тип ByteBool заема един байт.

Променлива от тип WordBool заема два байта.

Променлива от тип LongBool - четири байта.

ПИК 36Д. Гоцева

Булеви типове

Булевите стойности се означават чрез предефинираните константи True и False.

В сила са правилата, показани в таблицата вдясно.

BooleanByteBool,

WordBool, LongBool

False < True False <> True

Ord(False) = 0 Ord(False) = 0

Ord(True) = 1 Ord(True) <> 0

Succ(False) = True

Succ(False) = True

Pred(True) = False

Pred(False) = True

ПИК 37Д. Гоцева

Булеви типове

Стойност от тип ByteBool, LongBool, или WordBool се счита за True, ако стойността е различна от нула.

Компилаторът автоматично извършва това преобразувание.

Това е в сила за поредността на булевата стойност, а не за самата нея.

ПИК 38Д. Гоцева

Булеви типове

В Object Pascal, булевите изрази не са еквивалентни на цели или реални числа.

Преобразуването на променлива до Boolean ще даде непредсказуем резултат.

ПИК 39Д. Гоцева

Фундаментални реални данни

Тип Обхват Брой значещи цифри

Размер в брой байтове

Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6

Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4

Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8

Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10

Comp -2^63+1 .. 2^63 -1 19-20 8

Currency -922337203685477.5808.. 922337203685477.5807 19-20 8

ПИК 40Д. Гоцева

Фундаментални реални данни Real48 се поддържа само за съвместимост с

по-ранните версии на езика. Тъй като форматът му на съхранение не е вграден във фамилия Intel, той дава по-лоши резултати от останалите реални типове.

Extended се използва за постигане на по-голяма точност отколкото при другите реални типове, но създава проблеми при преносимостта на програми от една платформа на друга.

ПИК 41Д. Гоцева

Фундаментални реални данни Типът Comp (computational) е вграден в Intel

и представя 64-битово цяло число. Класифициран е като реален, но поведението му е като на подреден тип. (Например, не може да се увеличава или намалява стойност от тип Comp.) Comp се поддържа само за съвместимост с предходни версии на езика. Препоръчва се използването на Int64.

ПИК 42Д. Гоцева

Фундаментални реални данни Currency е реално число с фиксирана точка,

което е създадено за намаление на грешката от закръгление при парични изчисления. Съхранява се като скалирано 64-битово цяло число като последните четири позиции са след десетичната точка. Когато се смесва с други реални типове в присвояване и изрази, Currency автоматично се делят или умножават по 10000.

ПИК 43Д. Гоцева

Реални данни Родовият тип е Real. Еквивалентен е на Double. Шест-байтовия тип Real48 е еквивалентен на

Real в ранните версии на езика Object Pascal. Ако прекомпилирате код, създаден на Delphi1.0

трябва да смените Real с Real48. За тази цел може да използвате и директивата

на компилатора {$REALCOMPATIBILITY ON} за да превключите Real да бъде 6 байта.

ПИК 44Д. Гоцева

Предефинирани стрингови данни

Тип Максимална дължина Памет Предназначение

ShortString 255 символа От 2 до 256 байта

Съвместимост с по-ранните версии на езика

AnsiString ~2^31 символа От 4 байта до 2GB

8-битови (ANSI) симлови

WideString ~2^30 символа От 4 байта до 2GB

Unicode символи; COM сървъри и интерфейси

ПИК 45Д. Гоцева

Предефинирани стрингови данни

AnsiString, наричен още дълъг низ, е най-често използвания тип.

Низовите типове могат да се смесват в присвояване и изрази. Компилаторът автоматично прaви необходимите преобразувания.

Изисква се строго съвпадение на типовете при предаване на стринговете като параметри към процедури и функции по псевдоним (като var и out параметри). Може да се използва явно преобразуване на типа от един стринг към друг.

ПИК 46Д. Гоцева

Стрингови данни Ключовата дума string се използва за родов

типов идентификатор, начина на представянето на който зависи от директива на компилатора.

По подразбиране е включена {$H+}. При нея компилаторът ще интерпретира стринга, когато е записан без квадратни скоби с брой елементи в тях, като AnsiString.

Използването на {$H-} директива означава, че горепосочения стринг е ShortString

ПИК 47Д. Гоцева

Стрингови данни Стандартната функция Length връща броя

символи в низа. Процедурата SetLength задава размер на

низа. Сравнението на низове е дефинирано от

подредбата на символите в тях. Прави се символ по символ.

Когато низовете не са с еднаква дължина, всеки символ от по-дългия низ без съответствие от другия, е по-голям.

ПИК 48Д. Гоцева

Стрингови данни

Стрингът може да се индексира, точно както масив.

Ако S е низова променлива и I е целочислен израз, S[I] означава I-тия символ в S.

За типовете ShortString или AnsiString, S[I] е от тип AnsiChar; а за WideString, S[I] е от тип WideChar.

ПИК 49Д. Гоцева

Стрингови данни Пример: преобразуване от малки в големи букви:var I: Integer;

begin     I := Length(MyString);     while I > 0 do     begin         MyString[I] := UpCase(MyString[I]);             I := I - 1;     end; end;

ПИК 50Д. Гоцева

Стрингови данни

Индексирането на низа след неговия край води до сериозна грешка: “access violations”.

Трябва да се избягва и предаването на индекси на дълги низове като var параметри, защото кодът не може да се оптимизира в този случай.

ПИК 51Д. Гоцева

Стрингови данни

Може да се присвоява низова константа, или всеки друг израз, който връща низ като резултат, на стрингова променлива.

Дължината на низа се променя динамично при просвояване.

Примери: MyString := 'Hello world!'; MyString := 'Hello ' + 'world';MyString := MyString + '!';MyString := ' '; { space }MyString := ''; { empty string }

ПИК 52Д. Гоцева

УПРАЖНЕНИЕ 4Стандартни функции за конвертиране на типове данни Синтаксис Описание

function Chr(X:Byte): Char Превръща подаденото число в ANSI символ.

function Round(X: Extended): Int64;

Закръглява реално число. Връща цяло число.

function Trunc(X: Extended): Int64;

Връща цялата част, като отрязва дробната част.

function Int(X: Extended): Extended;

Връща цялата част, като нулира дробната

ПИК 53Д. Гоцева

УПРАЖНЕНИЕ 4Стандартни функции за конвертиране на типове данниfunction IntToStr(Value: Integer): string;

Конвертира цяло число в съответния символен низ

function StrToInt(const S: string): Integer;

Конвертира символния низ в число. Предизвиква изключение, ако низа не валидно цяло число.

function StrToIntDef(const S: string; Default: Integer): Integer;

Конвертира символния низ в число. Ако низа S не е валидно цяло число, то връща стойността на Default.

procedure Val(S; var V; var Code: Integer); Конвертира символния низ в число.

ПИК 54Д. Гоцева

УПРАЖНЕНИЕ 4Стандартни функции за конвертиране на типове данниprocedure Str(X; var S);

Конвертира число в символния низ.

function FloatToStr(Value: Extended): string;

Конвертира реално число в символния низ.

function StrToFloat(const S: string): Extended;

Конвертира символния низ в реално число.

ПИК 55Д. Гоцева

УПРАЖНЕНИЕ 4Текстови визуални компоненти

Label: създава контрол, който показва ред с текст. Този контрол не е в прозорец и потребителя не може да го избира. Обикновено се използва с други контроли.

Edit: показва област, където потребителя може да въвежда или модифицира един единствен ред с текст. Основната характеристика на този компонент е Text, която се използва за представяне на текста извеждан на екрана.

ПИК 56Д. Гоцева

УПРАЖНЕНИЕ 4Текстови, групиращи и скролиращи визуални компоненти Memo: показва област, където потребителя

може да въвежда или модифицира произволен брои редове с текст. Важно свойство на този компонент е Lines. Достъпните чрез Lines текстови редове всъщност се пазят в обект TString, който има свои собствени свойства и методи и прави достъпа до текста много лесен.

ПИК 57Д. Гоцева

УПРАЖНЕНИЕ 4Текстови визуални компоненти

MaskEdit: форматира извеждането на данни или ограничава потребителския вход до зададени символи. Характерно свойство, което го отличава от Edit е EditMask. То се използва за маскиране (филтрация) на символите, които се въвеждат от клавиатурата в компонента. Маската определя кои символи ще се възприемат и кои не.

RichEdit: служи за обработка на по-голям текст, на който да се променят шрифтове и да се форматират параграфите. Тази контрола е базирана на формата RTF.

ПИК 58Д. Гоцева

УПРАЖНЕНИЕ 4Групиращи визуални компоненти Групиращи компоненти - се използват за

групиране на други компоненти. Те са полезни при създаване на граници и области във вашата форма, които трябва забележимо да се различават от другите области. Групирането на компоненти обикновено се налага, когато те имат отношение един към друг.

ПИК 59Д. Гоцева

УПРАЖНЕНИЕ 4Групиращи визуални компоненти GroupBox - групира свързани компоненти върху

формата. Panel - групира други компоненти такива като

speed бутони на ивица с инструменти. Често се използва и за извеждане на статуса.

TabSet - създава етикети, които придават на формата вид на страници. Често се използва с Notebook компонент.

Notebook - създава стек с многобройни страници. TabbedNotebook - създава форма с много

страници.

ПИК 60Д. Гоцева

УПРАЖНЕНИЕ 4Скролиращи визуални компоненти ScrollBar - показва коя част от списък

или форма е видим. ScrollBox - дава област с два

ScrollBar в краищата. Те се появяват автоматично, когато екрана надвишава размера на прозореца.

ПИК 61Д. Гоцева

УПРАЖНЕНИЕ 4Задачи Да се смени изходът на задачите от

упражнение 3 от диалогова кутия на Label.

Да се състави малък текстов редактор с функции Cut, Copy, Paste, Delete като за основа се използва Memo. Какви предимства дава RichEdit при такава реализация?

Д. Гоцева ПИК 62

Променливи и типове данни

Лекция No 5

ПИК 63Д. Гоцева

Къси низове Типът ShortString е от 0 до 255 символа дълъг.

Независимо, че дължината на ShortString може да се променя динамично, памет се заделя статично за 256 байта; в нулевият байт се съхранява дължината на низа, а останалите 255 байта са за данни.

Ако S е променлива от тип ShortString, Ord(S[0]), работи като Length(S) и връща дължината на низа S; смяната на стойността на S[0], замества обръщението към SetLength, т.е. сменя дължината на S.

ПИК 64Д. Гоцева

Къси низове

Типът ShortString използва 8-битови ANSI символи и се поддържа само за съвместимост с по-ранните версии на езика.

Object Pascal поддържа къси низове с предварително зададена дължина.

Те са подтипове на ShortString-като максималната им дължина се движи между 0 и 255 символа.

ПИК 65Д. Гоцева

Къси низове Променливи, декларирани по този начин,

заемат само толкова памет, колкото е специфицирано в декларацията плюс един допълнителен байт за съхранение на тяхната дължина.

При присвояване на по-дълъг низ променлива от тип ShortString, низът се отрязва до максимално допустимият брой символи.

ПИК 66Д. Гоцева

Къси низове

Стандартните функции High и Low работят със ShortString типове и променливи.

High връща максималната дължина на низа, а Low връща нула.

ПИК 67Д. Гоцева

Дълги низове

AnsiString, наречени още дълги низове, представят динамични низове чиято максимална дължина зависи само от наличната памет.

Използват 8-битови ANSI символи.

ПИК 68Д. Гоцева

Дълги низове Променлива, от тип дълъг низ, е 4-байтов указател. Когато променливата е празна, .т.е. с нулева

дължина, указателят сочи nil и низът не използва допълнително памет.

Когато променливата е свързана с информация, се заделя динамично памет за указателя и освен това се поддържат 32-битов индикатор за дължина на низа и 32-битов брояч на референциите към него.

Паметта се заделя от хипа (heap).

ПИК 69Д. Гоцева

Дълги низове Променливите от тип AnsiString са указатели и се

насочват към една и съща памет, когато имат еднаква стойност. По този начин се пести памет и се увеличава скоростта на изпълнение на кода.

Когато променлива от посоченият тип се унищожава или си сменя стойността, се намалява броячът на референциите на стария низ (предходната стойност на променливата) и се увеличава броячът на референциите на новия, ако има такъв.

Ако въпросният брояч достигне нулева стойност, се освобождава заетата от низа памет.

ПИК 70Д. Гоцева

Дълги низове

Описаният процес се нарича броене на обръщенията (reference-counting).

Когато се използва индексиране за промяна на стойността на единичен символ от низа, се създава негово копие само ако броячът му е по-голям от едно.

Този процес се нарича копие при необходимост (copy-on-write).

ПИК 71Д. Гоцева

WideString

Типът WideString представя динамични низове, чиято кодова таблица е 16-bit Unicode.

В повечето аспекти приличат на AnsiString, но са по-малко ефективни, защото не използват цитираните по-горе процеси reference-counting и copy-on-write.

ПИК 72Д. Гоцева

WideString

WideString е съвместим с COM BSTR тип.

Delphi поддържа COM и конверсия от AnsiString до WideString, но ако се извиква COM API, трябва явно да се преобразуват низовете до WideString.

ПИК 73Д. Гоцева

Видове разширени кодови таблици еднобайтови (single-byte, SBCS) – в

нея всеки байт представя един символ от низа. Най-често използваната такава таблица е ANSI; повечето Western версии на Windows я използват.

ПИК 74Д. Гоцева

Видове разширени кодови таблици многобайтови (multibyte, MBCS) - някои

символи се представят с един байт, а останалите с повече от един. Първият байт се нарича водещ. Най-общо първите 128 символа от многобайтовата кодова таблица съответстват на 7-битовата ASCII кодова таблица и всеки байт, който следва след тях, се предхожда от водещ такъв. Използва се в Азия.

ПИК 75Д. Гоцева

Видове разширени кодови таблици Unicode - всеки символ се представя с

два байта. Символите и низовете Unicode се наричат широки (wide characters). Първите 256 символа от таблицата Unicode съвпадат с тези от ANSI.

ПИК 76Д. Гоцева

Поддръжка на кодовите таблици от Object Pascal Object Pascal поддържа еднобайтови и

многобайтови символи и низове чрез типовете Char, PChar, AnsiChar, PAnsiChar, и AnsiString.

Стандартните функции за работа със стрингове в Delphi имат многобайтова версия, която реализира подредба на символите за съответния регион. (Имената на многобайтовите функции обикновено започват с Ansi. Например, многобайтовата версия на StrPos е AnsiStrPos.)

ПИК 77Д. Гоцева

Поддръжка на кодовите таблици от Object Pascal Поддръжката на многобайтова кодова

таблица е опция на операционната система и се базира на локалната версия на Windows.

Object Pascal поддържа и кодова таблица Unicode с типове WideChar, PWideChar, и WideString.

ПИК 78Д. Гоцева

Работа с null-терминирани низове null-терминираният низ е масив от

символи, долната граница на индекса на който започва от нула (zero-based масиви), който завършва с символ NULL (#0); тъй като масивът няма индикатор за дължина, първият символ NULL определя края на низа.

ПИК 79Д. Гоцева

Работа с null-терминирани низове За работа с null-terminated низове

може да използвате функциите и процедурите от модула SysUtils. Това се налага при предаване на данни между различни системи, както и извикване на API функции.

ПИК 80Д. Гоцева

Работа с null-терминирани низове Може да се присвоява низова константа

на променливи от описания тип. Ако инициализиращия низ е по-къс от дължината на масива, остатъкът се попълва с #0 автоматично.

ПИК 81Д. Гоцева

Използване на указатели, масиви и низови константи При обработката на null-

терминирани низове, обикновено се използват указатели.

Низовите константи са съвместими при присвояване с типовете Pchar и PWideChar,които представляват указатели към null-терминирани масиви от типове Char и WideChar съответно.

Пример:var P: PChar; ...

P := 'Hello world!';

Което е еквивалентно на:const TempString: array[0..12] of

Char = 'Hello world!'#0; var P: PChar;

... P := @TempString;

ПИК 82Д. Гоцева

Използване на указатели, масиви и низови константи Позволено е да се предава низова константа към

функция, който получава параметър от тип const PChar или PWideChar –например: StrUpper('Hello world!').

Както и при присвояването на тип PChar, компилаторът генерира null-терминирано копие на стринга и предава на функцията указател към това копие.

Може и да се инициализират константи от типове PChar или PWideChar със стрингови литерали, както и тези, които са членове на структуриран тип.

ПИК 83Д. Гоцева

Използване на указатели, масиви и низови константи Пример:const

    Message: PChar = 'Program terminated';     Prompt: PChar = 'Enter values: ';     Digits: array[0..9] of PChar = (  'Zero', 'One', 'Two', 'Three', 'Four',     'Five', 'Six', 'Seven', 'Eight', 'Nine');

ПИК 84Д. Гоцева

Използване на указатели, масиви и низови константи Символните масиви с начален индекс нула са

съвместими с типове PChar и PWideChar. Когато се използва символен масив на

мястото на указател, компилаторът преобразува масива към константен указател, чиято стойност съответства на адреса на първия елемент на масива.

ПИК 85Д. Гоцева

Използване на указатели, масиви и низови константи Пример: var

    MyArray: array[0..32] of Char;     MyPointer: PChar; begin     MyArray := 'Hello';     MyPointer := MyArray;     SomeProcedure(MyArray);     SomeProcedure(MyPointer); end;

ПИК 86Д. Гоцева

Използване на указатели, масиви и низови константи Указателят към символна данна може

да бъде индексиран като масив. Индексът, определя отместване, което

се добавя към указателя преди адресирането на паметта. (За променливи от тип PWideChar, индекът автоматично се умножава по две.)

ПИК 87Д. Гоцева

Използване на указатели, масиви и низови константи Следователно, ако P е указател към

символна данна, P[0] е еквивалентно на P^ и определя първият символ на масива, P[1] определя вторият символ в масива и т.н.; P[-1] определя символа, който се намира непосредствено отляво на P[0].

Компилаторът не проверява излизане от границите на масива.

ПИК 88Д. Гоцева

Използване на указатели, масиви и низови константи Пример:function StrUpper(Dest, Source: PChar; MaxLen: Integer): PChar;

var     I: Integer; begin

    I := 0;     while (I < MaxLen) and (Source[I] <> #0) do     begin         Dest[I] := UpCase(Source[I]);         Inc(I);     end;     Dest[I] := #0;     Result := Dest; end;

ПИК 89Д. Гоцева

Използване на низове от Паскал и null-терминирани низове съвместно Допуска се смесването на дългите низове

(AnsiString тип) and null-терминираните низове (PChar тип) в изрази и присвояване.

При предаване на параметри към функции и процедури може да се предаде данна от тип PChar и когато типът на формалният параметър е дълъг низ.

Присвояването S := P, където S е низова променлива, а P е израз от тип Pchar, копира null-терминираният низ в дълъг.

ПИК 90Д. Гоцева

Използване на низове от Паскал и null-терминирани низове съвместно В бинарните операции, ако единият операнд

е от тип дълъг низ, а другият е PChar, операнда от тип PChar се конжертира до дълъг низ.

Може да се преобразува стойност от тип PChar като дълъг низ. Това е полезно когато трябва да се използва низова операция върху две данни от тип PChar.

ПИК 91Д. Гоцева

Използване на низове от Паскал и null-терминирани низове съвместно Може да се преобразува дълъг низ като

null-терминиран низ. В сила са следните правила: Ако S е израз от тип дълъг низ, PChar(S)

преобразува S като null-терминиран низ; при това се връща указател към първия символ от S.

ПИК 92Д. Гоцева

Използване на низове от Паскал и null-терминирани низове съвместно

Може да се използва Pointer(S) за преобразуване на дълъг низ в безтипов указател. Ако S е празен низ, преобразуването връща nil.

Когато преобразувате променлива от тип дълъг низ в указател, указателят остава валиден, докато на променливата не се присвои нова стойност или се излезе извън нейният обхват. Ако се преобразува израз от тип дълъг низ към указател, указателят е валиден само в оператора, в който е извършено преобразуването.

ПИК 93Д. Гоцева

Използване на низове от Паскал и null-терминирани низове съвместно

Когато преобразувате израз от тип дълъг низ към указател, указателят се счита константен (read-only). Указателят може да се ползва за промяна на дългия низ само ако са спазени следните условия:

При преобразуването се използва променлива от тип дълъг низ.

Низът не е празен. Низът е уникален – т.е. има брояч на обръщенията,

равен на едно. За да се гарантира тази уникалност, може да се извика една от следните процедури: SetLength, SetString, или UniqueString.

ПИК 94Д. Гоцева

Използване на низове от Паскал и null-терминирани низове съвместно

Низът не е модифициран след преобразуването на типа към указател.

Модифицирани са символи, които са в обхвата на низа. Не са използвани индексиране и указател извън този обхват.

Същите правила важат и при смесване на данни от типове WideString и PWideChar

ПИК 95Д. Гоцева

УПРАЖНЕНИЕ 5Работа с TStrings Използва се за работа със списък от низове. Намира

широко приложение при работа с големи текстови масиви или списъци.

TStrings притежава следните по-важни свойства и методи: Добавяне (Add, Insert) или изтриване (delete) на низове на

зададена позиция. Преподреждане на списъка (Move, Exchange) Достъп дo низ на зададена позиция (с индексиране) Четене/запис от/във файл (LoadFromFile/SaveToFile) Свързване на обект с низа (AddObject, InsertObject)

ПИК 96Д. Гоцева

УПРАЖНЕНИЕ 5Визуални компоненти – списъци ListBox: списъци. Този елемент изглежда

като списък от елементи за избор. Елементите могат да се добавят и изваждат динамично от списъка, което е полезно при показване на променящи се данни. Най-важното свойство на този компонент е Items, които се явява атрибут на класа TListBox. Използва се по същия начин, както се използват масивите в Паскал. За да съхранява данните си, този атрибут притежава символен масив.

ПИК 97Д. Гоцева

УПРАЖНЕНИЕ 5Визуални компоненти – списъци ComboBox: комбинирани панели.

Приличат на списъците, защото показват поредица от елементи. Но те изискват по-малко място и показват само един елемент от списъка. Това може да бъде елемент по подразбиране или избраният от потребителя.

ПИК 98Д. Гоцева

УПРАЖНЕНИЕ 5Визуални компоненти – списъци StringGrid: Компонентата StringGrid представлява

мрежа от низове. Такива компоненти могат да се използват навсякъде, където е необходимо да се покаже нещо подобно на мрежа – електронна таблица, телефонен номератор или нещо друго. Достъп до полетата на тази мрежа се получава чрез свойството Cells (елементи), представляващо двумерен масив от низове. Това свойство се определя по време на програмата. Възможно е да се “фиксират” редове и колони с елементи, така че потребителя да не може да ги избира.

ПИК 99Д. Гоцева

УПРАЖНЕНИЕ 5Визуални компоненти – списъци Това е полезно при изобразяване на редове

и колони, за които не искате да бъдат променяни. Стойностите на свойствата FixedCols и FixedRows определят броя на фиксираните колони и редове. Броят на редовете и колоните, от които се състои мрежата, се определя чрез свойствата RowCount и ColCount. В групата от свойства Options има много елементи. Те могат да се възприемат като специални аспекти на конкретното свойство.

ПИК 100Д. Гоцева

УПРАЖНЕНИЕ 5Визуални компоненти – списъци Всеки от елементите на групата от

свойствата има собствени стойности по подразбиране. Най-голям интерес представлява свойството goEditing. Включването на goEditing дава възможност за въвеждане на данни по време на работата на програмата. За повече информация относно свойствата се обърнете към вградената помощна информация.

ПИК 101Д. Гоцева

УПРАЖНЕНИЕ 5Задачи Задачите от упражнение 3 да се

направят като данните се четат от файла и се изобразяват в ListBox.

Задачите от упражнение 3 да се направят като данните се четат от клавиатура в Edit и се изобразяват в ListBox.

Д. Гоцева ПИК 102

Променливи и типове данни

Лекция No 6

ПИК 103Д. Гоцева

Сложни типове Инстанциите на сложните типове съдържат

повече от една стойност. Сложните типове включват:

множества масиви Записи Файлове Класове интерфейси

ПИК 104Д. Гоцева

Сложни типове

Един тип може да има неограничени нива на структуриране.

По подразбиране стойностите в сложен тип се подравняват по границите на word или double word.

ПИК 105Д. Гоцева

Сложни типове Когато се декларира сложен тип може да се

използва запазената дума packed за да се използва компресирано съхранение на данните. Пример:

type TNumbers = packed array[1..100] of Real; Използването на packed забавя достъпа до

информацията и, в случая на масив от символи влияе на съвместимостта на типовете.

ПИК 106Д. Гоцева

Масиви Масив представлява индексирана съвкупност

от елементи от еднакъв тип (наречен базов тип).

Всеки елемент има уникален индекс затова масивите за разлика от множествата могат да съдържат една и съща стойност повече от един път.

Масивите могат да се заделят статично или динамично.

ПИК 107Д. Гоцева

Статични масиви

Дефиниция:array[<тип на индекса 1>, ...,<тип на индекса N>] of <базов тип>

<тип на индекса> е числен тип, чиито обсег не надвишава 2GB;

Докато <тип на индекса> индексират масива, броят елементи, които масива може да съдържа е ограничен от разликата в размерите на индексните типове.

ПИК 108Д. Гоцева

Статични масиви

На практика индексните типове са обикновено integer подобласти.

В най-простия случай – едномерен масив – има един единствен <тип на индекса>.

Пример:var MyArray: array[1..100] of Char;

ПИК 109Д. Гоцева

Статични масиви

Ако създадете статичен масив но не присвоите стойности на всички от елементите му – неизползваните все още са неинициализирани и съдържат случайна информация. Многомерен масив е масив от масиви.

ПИК 110Д. Гоцева

Статични масиви Пример:type TMatrix = array[1..10] of array[1..50] of Real; type TMatrix = array[1..10, 1..50] of Real; По които и начин да се декларира TMatrix той

представлява масив от 500 реални стойности. Променлива MyMatrix от типа TMatrix може да бъде

индексирана така : MyMatrix[2,45]; MyMatrix[2][45].

ПИК 111Д. Гоцева

Статични масиви

Стандартните функции Low и High действат с променливи и идентификатори от тип array.

Те връщат горната и долната граница на първия индексен тип на масива.

Стандартната функция Length връща броя елементи в първото измерение на масива.

ПИК 112Д. Гоцева

Статични масиви

Едномерен, пакетиран статичен масив от символи се нарича пакетиран низ.

Пакетираните низове са съвместими с низовете и с други пакетирани низове, които имат същия брой елементи.

ПИК 113Д. Гоцева

Статични масиви

Масив от вида array[0..x] of Char се нарича zero-based символен масив.

Zero-based символните масиви се използват за да съхраняват null-терминирани низове и са съвместими с PChar стойности.

ПИК 114Д. Гоцева

Динамични масиви

Динамичните масиви нямат фиксиран размер или дължина.

Памет за динамичния масив се заделя когато се предаде стойност на процедурата SetLength.

Динамичните масиви се обозначават от конструкции от вида:

array of <базов тип>

ПИК 115Д. Гоцева

Динамични масиви

Пример:var MyFlexibleArray: array of Real; SetLength(MyFlexibleArray, 20); Динамичните масиви винаги се

индексират с integer и индекса винаги започва от нула.

ПИК 116Д. Гоцева

Динамични масиви Динамичните масиви са скрити указатели и се

управляват чрез същите техники, каквито се използват за дългите низове.

За унищожаване на динамичен масив: на променливата, която се отнася за масива се присвоява

стойност nil; или масива се подава като параметър на Finalize;

Към динамичния масив: не се прилага оператора вземане на адрес; и не се предава като параметър на процедурата New или

Dispose.

ПИК 117Д. Гоцева

Динамични масиви

Ако X и Y са променливи от един и същ тип динамичен масив X :=Y присвоява на X дължината на Y и пренасочва X към същия масив към който сочи Y.

За разлика от низовете и статичните масиви динамичните масиви не се копират автоматично преди да се пише в тях.

ПИК 118Д. Гоцева

Динамични масиви Пример:var     A, B: array of Integer;

begin     SetLength(A, 1);     A[0] := 1;     B := A;     B[0] := 2; end;

Стойността на A[0] е 2. (Ако A и B бяха статични масиви A[0] щеше да бъде 1.)

ПИК 119Д. Гоцева

Динамични масиви

Присвояването на индекс на динамичен масив (например MyFlexibleArray[2] := 7) не пренасочва масива.

Индексите извън обсега се съобщават по време на компилацията.

ПИК 120Д. Гоцева

Динамични масиви Когато динамични масиви се сравняват, сравняват се

техните препратки, а не стойностите на масивите. Пример:var     A, B: array of Integer;

begin     SetLength(A, 1);     SetLength(B, 1);     A[0] := 2;     B[0] := 2; end;

A = B връща False но A[0] = B[0] връща True.

ПИК 121Д. Гоцева

Динамични масиви

Орязване на динамичен масив се постига чрез функция Copy и резултатът се присвоява на променлива масив.

Пример:A := Copy(A, 0, 20) отрязва всичките елементи на А след 20.

ПИК 122Д. Гоцева

Динамични масиви

Length връща броя елементи на масива.

High връща най-големия индекс (т.е., Length - 1).

Low връща 0. В случай на масив с дължина нула ,

High връща -1.

ПИК 123Д. Гоцева

Многомерни динамични масиви

Многомерен динамичен масив се декларира като се използва итеративна array of … конструкция.

Пример: type TMessageGrid = array of array of

string; var Msgs: TMessageGrid;

ПИК 124Д. Гоцева

Многомерни динамични масиви

Памет се заделя със SetLength със два целочислени аргумента:

SetLength(<име масив>,<редове>,<колони>); Могат да бъдат създавани многомерни

динамични масиви, които не са правоъгълни. Пример:var Ints: array of array of Integer; SetLength(Ints,10); SetLength(Ints[2], 5);

ПИК 125Д. Гоцева

Многомерни динамични масиви

Пример: триъгълна матрица от низовеvar

    A : array of array of string;     I, J : Integer; begin     SetLength(A, 10);     for I := Low(A) to High(A) do     begin         SetLength(A[I], I);         for J := Low(A[I]) to High(A[I]) do             A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';     end; end;

ПИК 126Д. Гоцева

Символни Указатели

Фундаменталните типове PAnsiChar и PWideChar представляват указатели към AnsiChar и WideChar променливи.

Общият PChar представлява указател към Char (т.е. в сегашната реализация към AnsiChar).

Тези символни указатели се използват за работа със нулево терминирани низове.

ПИК 127Д. Гоцева

Други стандартни указатели

Модулите System и SysUtils декларират много стандартни типове указатели. Ето някои от тях:

Тип указател Сочи към променлива от тип

PAnsiString, PString AnsiString

PByteArrayByteArray (деклариран в SysUtils). Използван за типизиране на динамично заделена памет за индексиран достъп.

ПИК 128Д. Гоцева

Други стандартни указатели

PCurrency Currency

PExtended Extended

POleVariant OleVariant

PShortStringShortString. Полезен когато се предава

наследствен код който използва типа РString .

PTextBuf TextBuf (деклариран в SysUtils). TextBuf е вътрешния буферен тип в TtextRec .)

ПИК 129Д. Гоцева

Други стандартни указатели

PVarRec TVarRec (деклариран в System)

PVariant Variant

PWideString WideString

PWordArray

TwordArray (деклариран в SysUtils). Използван за типизиране на динамично заделена памет за масиви от 2-байтови стойности.

ПИК 130Д. Гоцева

УПРАЖНЕНИЕ 6Задачи Да се създаде приложение на Delphi, в което

потребителя въвежда матрица с 3 реда и 4 колони, реални числа и се изчислява: Сума на числата под главния диагонал; Минимален елемент и неговите индекси над

главния диагонал; Средноаритметично по колони като се попълва в 5

колона (допълнителна).

ПИК 131Д. Гоцева

УПРАЖНЕНИЕ 6Задачи Даден е едномерен масив от 10 елемента,

реални числа. Да се компресира масива, като се използва динамичен масив, като се отстранят отрицателните числа.

Даден е едномерен масив от 10 елемента, цели числа. Да се разшири масива на място, като се използва динамичен масив, като зад всяко четно число се добави следващото го нечетно.

Д. Гоцева ПИК 132

Променливи и типове данни

Лекция No 7

ПИК 133Д. Гоцева

Тип вариант Използват се при работа с информация, чиито тип

варира или не може да бъде определен по времето на компилация.

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

Нерегламентираните операции с варианти често причиняват грешки, които биха били уловени по време на компилацията при използване на обикновени променливи.

ПИК 134Д. Гоцева

Тип вариант Вариантите не могат да съдържат:

записи Множества статични масиви Файлове Класове указатели към класове Указатели Int64

Вариантите които съдържат низове не могат да бъдат индексирани.

ПИК 135Д. Гоцева

Тип вариант

Вариантите могат да съдържат: динамични масиви вариантен масив – това е статичен масив.

Вариантите могат да се смесят с други варианти и с: integer, real, string и boolean стойности в изрази и присвоявания;

Компилаторът автоматично превръща типовете.

ПИК 136Д. Гоцева

Тип вариант Един вариант заема 16 байта памет и се

състои от: код на типа стойност, или указател към стойност, от типа

определен от кода. Всички варианти се инициализират със

специалната стойност Unassigned при създаването си.

Специалната стойност Null означава неизвестна или липсваща информация.

ПИК 137Д. Гоцева

Тип вариант

Стандартната функция VarType връща кода на типа на варианта.

Константата varTypeMask е битова маска, използвана за извличане на кода от стойността която връща VarType.

Пример:VarType(V) and varTypeMask = varDouble

ПИК 138Д. Гоцева

Стойности на VarType

VarType Стойност Съдържание на варианта

varEmpty $0000 Варианта е Unassigned.varNull $0001 Варианта е Null.varSmallint $0002  16-битов цял със знак (Smallint).varInteger $0003 32-битов цял със знак (Integer).

varSingle $0004 Плаваща запетая с единична точност (Single).

varDouble $0005 Плаваща запетая с двойна точност (Double).

varCurrency $0006 Валутна стойност с плаваща запетая (Currency).

ПИК 139Д. Гоцева

Стойности на VarType

varDate $0007 Стойност за време и дата (TDateTime).

varOleStr $0008 Обръщение към OLE низ (динамично заделен Unicode низ).

varDispatch $0009 Обръщение към OLE automation object ( IDispatchinterface указател).

varError $000A Код за грешка на ОС.VarBoolean $000B 16-битов Boolean (WordBool).

varVariant $000C Вариант (използван само при масиви от Варианти).

varUnknown $000D Обръщение към неизвестен ОLE обект (IUnknowninterface указател).

ПИК 140Д. Гоцева

Стойности на VarType

varByte $0011 8-битов цял без знак (Byte).

varString $0100 Обръщение към динамично заделен дълъг низ (AnsiString).

varTypeMask $0FFF Битова маска за извличане на кода

на типа.

varArray $2000 Бит указващ вариант – масив.

ПИК 141Д. Гоцева

Дефиниция на TVarDataType type

  TVarArrayBound = record    ElementCount: Integer;    LowBound: Integer;   end;

  PVarArray = ^TVarArray;   TVarArray = record    DimCount: Word;    Flags: Word;    ElementSize: Integer;    LockCount: Integer;    Data: Pointer;    Bounds: array[0..255] of TVarArrayBound;   end;

ПИК 142Д. Гоцева

Дефиниция на TVarDataTypeTVarData = record

   VType: Word;    Reserved1, Reserved2, Reserved3: Word;    case Integer of     varSmallint: (VSmallint: Smallint);     varInteger:  (VInteger: Integer);     varSingle:   (VSingle: Single);     varDouble:   (VDouble: Double);     varCurrency: (VCurrency: Currency);     varDate:     (VDate: Double);

ПИК 143Д. Гоцева

Дефиниция на TVarDataTypevarOleStr:   (VOleStr: PWideChar); varDispatch: (VDispatch: Pointer);

   varError:    (VError: Integer); varBoolean:  (VBoolean: WordBool);

   varUnknown:  (VUnknown: Pointer); varString:   (VString: Pointer); varArray:    (VArray: PVarArray); varByRef:    (VPointer: Pointer);

end;

ПИК 144Д. Гоцева

Работа с вариант Пример:var

  V: Variant; begin   ...   if TVarData(V).VType = varEmpty then ...;   ...   VarClear(V);   TVarData(V).VType := varInteger;   TVarData(V).VInteger := 1234567;   ... end;

ПИК 145Д. Гоцева

Преобразуване на тип при варианти Всички цели, реални, низови, символни, и

булеви типове (с изключение на Int64) са съвместими за присвояване с вариант.

Изрази могат са бъдат открито типизирани като варианти и стандартните процедури VarAsType и VarCast могат да бъдат използвани за смяна на вътрешното представяне на variant.

ПИК 146Д. Гоцева

Преобразуване на тип при варианти Пример:

var     V1, V2, V3, V4, V5: Variant;     I: Integer;     D: Double;     S: string; begin     V1 := 1; { цяла данна }     V2 := 1234.5678; { реална данна }

    V3 := 'Hello world!'; { низ }     V4 := '1000'; { низ }     V5 := V1 + V2 + V4; { реален резултат: 2235.5678}

  

ПИК 147Д. Гоцева

Преобразуване на тип при варианти    I := V1; { I = 1 (цяло число) }

    D := V2; { D = 1234.5678 (реално число) }     S := V3; { S = 'Hello world!' (низ) }     I := V4; { I = 1000 (цяло число) }     S := V5; { S = '2235.5678' (низ) } end;

ПИК 148Д. Гоцева

Преобразуване на тип при варианти Преобразуване от цяло или реално в:

В цяло или реално става по правилата на Object Pascal;

В низ или символ: в стринг като използва Regional Settings;

В булев: при нула в False, иначе True.

ПИК 149Д. Гоцева

Преобразуване на тип при варианти Преобразуване от символ или низ в:

В цяло или реално: прави се опит да се преобразува до число и дава грешка при невъзможност;

В низ или символ: според правилата на Object Pascal;

В булев: при низ “false” (not case sensitive) или числов резултат 0 дава False, при низ “true” (not case sensitive) или ненулев числов резултат дава True, иначе грешка.

ПИК 150Д. Гоцева

Преобразуване на тип при варианти Преобразуване от булев в:

В цяло или реално: False е 0, а True е (-1);В символ или низ: False е ‘0’, а True е ‘-1’;В булев: False e False, True е True.

ПИК 151Д. Гоцева

Преобразуване на тип при варианти Преобразуване от Unassigned в:

В цяло или реално: връща 0;В символ или низ: връща ‘’;В булев: връща False.

Преобразуване от Null, в който и да е тип дава грешка.

ПИК 152Д. Гоцева

Преобразуване на тип при варианти При присвоявания на стойности извън

обсега на променливата , тя приема най-високата стойност в обсега си.

Невалидни присвоявания или типизации причиняват изключителната ситуация EvariantError.

ПИК 153Д. Гоцева

Преобразуване на тип при варианти: TDateTime Когато ТDateTime се превръща в друг тип, той се

третира като Double. Когато цял, реален или булев тип се превръща в

TDateTime, той се превръща първо в Double и след това се прочита като стойност ДАТА:ВРЕМЕ.

Когато низ се превръща в TDateTime, той се интерпретира като стойност ДАТА:ВРЕМЕ, използвайки регионалните настройки на Windows (Windows regional settings).

Когато Unassigned стойност се превръща в TDateTime, тя се третира като реално или цяло нула.

Превръщането от null в TDateTime причинява изключителна ситуация (exception).

ПИК 154Д. Гоцева

УПРАЖНЕНИЕ 7Задачи Да се създаде приложение за

криптиране/декриптиране на текст, зададен в мемо.

Да се промени текстовият редактор от упр. 4 като се добави възможност за смяна на шрифт и характеристиките му.

Д. Гоцева ПИК 155

Променливи и типове данни

Лекция No 8

ПИК 156Д. Гоцева

Варианти в изрази Всички оператори с изключение на ^, is, и in

приемат операнди варианти. Операциите над варианти връщат:

стойност Null ако някой от операндите е Null; причиняват изключение ако някой от операндите

е Unassigned. В бинарна операция ако само единия операнд е

вариант, другия се превръща във вариант.; стойности варианти – във всички останали случаи.

ПИК 157Д. Гоцева

Варианти в изрази Типът на връщаната стойност от

операцията се определя от типа на операндите.

Важат същите правила, които са за операнди от статично зададени типове.

Когато е възможно компилаторът преобразува несъвпадащи варианти, използвайки правилата, обобщени в таблицата за преобразуване на типове на варианти.

ПИК 158Д. Гоцева

Варианти масиви Обикновения статичен масив не може да

бъде присвоен на вариант. Трябва да се създаде масив – вариант чрез

повикването на някои от стандартните функции VarArrayCreate или VarArrayOf.

Пример:V: Variant; ... V := VarArrayCreate([0,9], varInteger);

ПИК 159Д. Гоцева

Варианти масиви Масивът може да бъде индексиран, но не е

възможно да се предаде вариант масив като Var параметър.

Вариантите масиви винаги се индексират с цели числа.

Вторият параметър на VarArrayCreate е кода на типа на базовия тип на масива.

Не предавайте кода varString на VarArrayCreate; За създаване на вариант – масив от низове се използва varOleStr.

ПИК 160Д. Гоцева

Варианти масиви Вариантите могат да съдържат варианти масиви с

различни размери, измерения и базови типове. Елементите на вариант масив могат да бъдат от

всякакъв тип позволен във вариантите с изключение на ShortString и AnsiString.

Ако базовия тип на масива е вариант, елементите му могат дори да бъдат хетерогенни.

Когато вариант, съдържащ вариант масив се присвои на друг вариант или се предаде като параметър по стойност, целия масив се копира.

ПИК 161Д. Гоцева

Варианти масиви Функцията VarArrayRedim се използва за

преоразмеряване на вариант- масив. Други стандартни процедури за работа с варианти

масиви са: VarArrayDimCount – връща броя на дименсиите на масива; VarArrayLowBound – връща долната граница на масива; VarArrayHighBound – връща горната граница на масива; VarArrayRef – връща псевдоним към масива; VarArrayLock – заключва масива (не може да се прави

resize); VarArrayUnlock – отключва масива, заключен с VarArrayLock.

ПИК 162Д. Гоцева

OleVariant Типът OleVariant представлява варианти,

които съдържат само COM-съвместими типове.

Когато вариант е присвоен на OLE вариант, несъвместимите типове се превръщат в съвместимите им съответни.

Например ако вариант съдържащ AnsiString е присвоен на OleVariant, AnsiString се превръща в WideString.

ПИК 163Д. Гоцева

Идентичност на типовете Когато един идентификатор на тип е деклариран чрез друг

идентификатор, без квалифициране, те обозначават един и същи тип. Пример (T1, T2, T3, T4, и Integer всички обозначават един и същи

тип):type

    T1 = Integer;     T2 = T1;     T3 = Integer;     T4 = T2;

За създаване на различни типове се повтаря думата type в декларацията.

Пример (създава нов тип TMyInteger , който не е идентичен с Integer ): type

TMyInteger = type Integer;

ПИК 164Д. Гоцева

Идентичност на типовете Езиковите конструкции, които функционират като имена на типове

обозначават различни типове всеки път, когато се появят. Пример (създават се два различни типа TS1 и TS2 и две

променливи S1 и S2 от различен тип и S11 и S22 от един и същи тип):

type     TS1 = set of Char;     TS2 = set of Char;

var     S1: string[10];     S2: string[10]; S11, S22: string[10];

Идентичност може да се постигне ако се дефинира явно типа и се направи позоваване към него.

ПИК 165Д. Гоцева

Типова съвместимост Всеки тип е съвместим със себе си. Два различни типа са съвместими ако те

покриват поне едно от следващите условия: И двата са реални И двата са целочислени. Единия тип е подобласт на другия. Двата типа са подобласти на трети. Двата са множества със съвместими базови

типове.

ПИК 166Д. Гоцева

Типова съвместимост Двата са пакетирани низове с еднакъв брой

компоненти. Единия е низ, а другия е низ, пакетиран низ

или Char. Единия е вариант, а другия е integer, real,

string, character, или Boolean тип. Двата са клас, препратка към клас или

интерфейси и единия е получен от другия. Единия е PChar или PwideChar, а другия е

zero-based символен масив от вида array[0..n] of Char.

ПИК 167Д. Гоцева

Типова съвместимост

Единия е Pointer (нетипизиран указател), а другия е произволен указателен тип.

Двата типа са (типизирани) указатели към един и същи тип и директивата {$T+} е в сила.

И двата са процедурни типове с еднакъв тип на резултата, еднакъв брой параметри и типова идентичност между съответните параметри.

ПИК 168Д. Гоцева

Съвместимост при присвояване

Съвместимоста при присвояване не е симетрична.

Израз от тип T2 може да бъде присвоен на променлива от тип Т1 ако стойноста на израза е в обсега на T1 и поне едно от следващите условия е покрито: T1 и T2 са от един и същи тип и този тип не

е файлов тип или сложен тип, който съдържа файл.

T1 и T2 са съвместими числови типове.

ПИК 169Д. Гоцева

Съвместимост при присвояване

T1 и T2 са реални типове. T1 е реален ти,п а T2 е целочислен тип. T1 е Pchar или някакъв низов тип и израза е

низова константа. T1 и T2 са низови типове. T1 е низов тип, а T2 е Char или пакетиран

низ. T1 е дълъг низ, а T2 е PChar. T1 и T2 са съвместими пакетирани низове. T1 и T2 са съвместими множества.

ПИК 170Д. Гоцева

Съвместимост при присвояване

T1 и T2 са съвместими указателни типове. T1 иT2 са класове, препратки към класове

или интерфейси и T2 е получен от T1. T1 е интерфейс, а T2 е клас, който използва

Т1. T1 е PChar или PwideChar, а T2 е zero-based

символен масив от вида array[0..n] of Char. T1 и T2 са съвместими процедурни типове

(идентификатор на процедура или функция в някои оператори за присвояване е третиран като израз от процедурен тип).

ПИК 171Д. Гоцева

Съвместимост при присвояване

Т1 е вариант а Т2 е целочислен реален низов символен Булев или интерфейсен тип.

T1 целочислен реален низов символен или Булев тип а Т2 е вариант.

T1 е IUnknown или IDispatch интерфейсен тип а Т2 е вариант. (Кода на типа на варианта трябва да бъде varEmpty, varUnknown, or varDispatch ако T1 е IUnknown, и varEmpty или varDispatch ако T1 е IDispatch.).

ПИК 172Д. Гоцева

УПРАЖНЕНИЕ 8CheckListBox Това е списък от елементи с поле за

отметка. Потребителя може да избира не само

елементите, но и отметките. За проверка на текущото състояние се

използва Checked и State (State се използва при неактивни полета).

ПИК 173Д. Гоцева

УПРАЖНЕНИЕ 8Интервали TrackBar и ProgressBar: използват се за

задаване на интервали и показване на продължителността на операция.

UpDown: обикновено се свързва с текстово поле и служи за промяна стойността му. Връзката между двете контроли става с Associate свойство на UpDown. Може да се ползва и самостоятелно.

ПИК 174Д. Гоцева

УПРАЖНЕНИЕ 8Интервали PageScroller: служи за превъртане на

вътрешни контроли. Използва се при toolbar, като изобразява 2 стрелки в двата края и ако има невидими елементи на toolbar, позволява скролиране с цел тяхната визуализация.

ПИК 175Д. Гоцева

УПРАЖНЕНИЕ 8Dragging За изпълнението на операция drag&drop,

трябва да се: Зададе вида на операцията в dragKind: dkDrag

(при драгване) или dkDock (при скачване); Зададе режима на операцията в dragMode:

dmAutomatic (автоматично се стартира) или dmManual (трябва да се стартира ръчно от програмиста чрез извикване на BeginDrag);

ПИК 176Д. Гоцева

УПРАЖНЕНИЕ 8Dragging

Създаде обработка на събитие OnDragDrop, което показва какво ще се случи при драгването;

Създаде обработка на събитие OnDragOver, което показва дали ще приеме контролата влачения обект (accept:=True;).

ПИК 177Д. Гоцева

УПРАЖНЕНИЕ 8Задачи Да се създаде приложение на Делфи,

което демонстрира drag&drop:Дадени са 3 етикета с различни шрифтове

и ListBox, който при драгване на етикет си сменя шрифта;

Даден е EditBox и CheckListBox, при драгване на текста от EditBox-a да се добавя в CheckListBox-a.

Д. Гоцева ПИК 178

Променливи и типове данни

Лекция No 9

ПИК 179Д. Гоцева

ПроменливиАбсолютни адреси За да се декларира променлива, която

се разполага на определен адрес в паметта, думата absolute се поставя след името на типа следвана от адрес. Пример:

var CrtMode: Byte absolute $0040;

ПИК 180Д. Гоцева

Променливи Абсолютни адреси За създаване на нова променлива, която се

разполага на същия адрес както и съществуваща променлива, се използва името на съществуваща променлива вместо адрес след думата absolute. Пример:

var     Str: string[32];     StrLen: Byte absolute Str;

Променлива не може да бъде инициализирана в абсолютна декларация.

ПИК 181Д. Гоцева

Нишкови променливи Нишковите променливи се използват в

многонишковите приложения. Нишковите променливи са като глобални

променливи, освен това че всяка нишка, която се изпълнява получава собствено копие на променливата до което другите нишки нямат достъп.

Нишковите променливи се декларират с threadvar вместо с var. Пример:

threadvar X: Integer;

ПИК 182Д. Гоцева

Нишкови променливи

Декларациите на нишкови променливи: Не могат да се появяват в процедура или

функция. Не могат да включват инициализации. Не могат да използват директивата

absolute.

ПИК 183Д. Гоцева

Нишкови променливи Относително отброените променливи (като

дълги низове, динамични масиви или интерфейси) не са нишково безопасни, дори ако са декларирани с threadvar.

Не използвайте динамично нишкови променливи защото по принцип няма начин за освобождаване на заделената в купа памет от всяка нишка, която е използвана.

Не създавайте указателни или процедурни нишкови променливи.

ПИК 184Д. Гоцева

Деклариране на константи Синтаксисът за декларирането на константа е: const <идентификатор> = <константен израз>

където <идентификатор> е валиден идентификатор и <константен израз> е израз, който компилаторът може да изчисли, без да изпълнява програмата.

Ако <константен израз> връща числена стойност, може да бъде определен типа на декларираната константа използвайки типизираната стойност. Пример:

const MyNumber = Int64(17);

ПИК 185Д. Гоцева

Деклариране на константи Тип на константата Ако <константен израз> е символен низ,

декларираната константа е съвместима с всеки низов тип. Ако символния низ е с дължина 1, той е също съвместим с всеки символен тип.

Ако <константен израз> е реално число, декларираната константа е от тип Extended. Ако е целочислен, декларираната константа е от тип Longint, освен ако стойността на <константен израз> е извън обсега на Longint – в този случай типа на константата е Int64.

ПИК 186Д. Гоцева

Константи изрази Константен израз е израз, който компилаторът

може да изчисли без да изпълнява програмата, в която израза се среща.

Константните изрази включват числа, символни низове, константи, стойности на изброени типове, специалните константи True, False и nil и изрази, съставени изключително от тези елементи с оператори типизация и множество.

Константните изрази могат да включват променливи, указатели, обръщения към функции.

ПИК 187Д. Гоцева

Константи изразиИзброените по-долу функции не се допускат в константни изрази:

Abs Addr ArcTan Chr Cos

Exp Frac Hi High Int

Length Ln Lo Low Odd

Ord Pred Round Sin SizeOf

Sqr Sqrt Succ Swap Trunc

ПИК 188Д. Гоцева

Ресурсни низове

Ресурсните низове се съхраняват като ресурси и се свързват с изпълнимия файл или библиотека, така че могат да бъдат модифицирани, без да се прекомпилира програмата.

Ресурсните низове се декларират както и другите константи, с изключение на това че думата const се заменя с resourcestring.

ПИК 189Д. Гоцева

Ресурсни низове

Изразът вдясно от символа = трябва да бъде константен израз и трябва да връща низова стойност. Пример:

resourcestring     CreateError = 'Cannot create file %s';

ПИК 190Д. Гоцева

Изрази и операцииВидове операции • Аритметични + - * / div mod• Булеви not and or xor• Логически not and or xor shl shr• Низови < <= > >= <> = +• Указателни < <= > >= + - ^ = <>• За множества + - * <= >= = <> in• Релационни < <= > >= = <>• Класови As is = <>• Операция @ @

ПИК 191Д. Гоцева

Изрази и операции Операнди С изключение на ^, is, и in, всички

операции приемат операнди от тип Variant.

Операциите as и is приемат за операнди класове и инстанции на обекти, as действа и на интерфейси.

ПИК 192Д. Гоцева

Изрази и операции Резултат от операциите При аритметичните операции резултатът е от

тип Extended, когато поне единият операнд е real; иначе , резултатът е от тип Int64 когато поне един от операндите е от тип Int64; иначе резултатът е от тип integer. Ако типа на операнда е подмножество на целочислен тип, той е третиран като от целочисления тип.

ПИК 193Д. Гоцева

Изрази и операции Резултат от операциите Следните правила важат за слепването

на низове: Операндите за + могат да бъдат низове,

групирани низове (групирани масиви от тип char), или символи. Ако единия от операторите е от тип WideChar, тогава другият трябва да бъде дълъг низ.

Резултатът от операцията + е съвместим с всеки низов тип. Обаче ако операндите са къси низове и тяхната комбинирана дължина е по-голяма от 255 резултата се отрязва до първите 255 символа.

ПИК 194Д. Гоцева

Изрази и операции Резултат от операциите Следните правила важат за операциите за

отношение: Операндите трябва да бъдат съвместими типове с

изключение на това, че могат да бъдат сравнявани реален и цял тип.

Низовете се сравняват според реда на символите, които съдържат в ASCII кодовата таблица. Отделните символи се третират като низове с дължина 1.

Два групирани низа трябва да имат еднакъв брой елементи, за да бъдат сравнени. Когато групиран низ с n елемента е сравнен с низ, групираният низ се третира като низ с дължина n.

ПИК 195Д. Гоцева

Изрази и операции Резултат от операциите

Операциите за отношение <,,<= и = се прилагат към PChar операнди, само ако двата указателя са към един и същи символен масив .

Операциите = и <> могат да приемат операнди от тип class и class-reference. С операндите от тип class, операциите = и <> се изчисляват според правилата, които са в сила за указателите: C = D е Истина само ако C и D сочат към една и съща инстанция на обекта, в противен случай C <> D е Истина.

ПИК 196Д. Гоцева

Приоритет на операциите

Операциите с еднакъв приоритет се изчисляват от ляво на дясно.

Oперации Приоритет@ Най-висок*, /, div, mod, and, shl, shr, as Втори+, -, or, xor Трети=, <, <, , <=, =, in, is  Най-малък ( 4 )

ПИК 197Д. Гоцева

УПРАЖНЕНИЕ 9Главно Меню (TMainMenu) Създава се чрез меню дизайнер. Могат

да се добавят горещи клавиши чрез ShortCut и клавишни комбинации с Alt+символ. Последното се постига с & пред символа.

За да се въведе разделител се използва ‘-’ в Caption.

ПИК 198Д. Гоцева

УПРАЖНЕНИЕ 9Главно Меню (TMainMenu) За въвеждане на подменю се използва

Ctrl+->. Управлението на менюто се

осъществява чрез Enable и Visible. Възможно е създаването на радиогрупа

посредством еднакъв GroupIndex за всички елементи на групата и RadioItem:=true.

ПИК 199Д. Гоцева

УПРАЖНЕНИЕ 9Главно Меню (TMainMenu) Възможно е задаване на състояния на

елементите на менюто чрез Checked. Може да се добави картинка към

елемент на менюто чрез задаване на Bitmap.

ПИК 200Д. Гоцева

УПРАЖНЕНИЕ 9Контекстно Меню (TPopMenu) Показва се при натискане на десен

бутон на мишката. За свързване на контекстно меню с

компонент, трябва да се попълни свойството PopupMenu на последния.

Може да се използва и метода Popup на менюто като се укажат координатите на менюто.

ПИК 201Д. Гоцева

УПРАЖНЕНИЕ 9TAction Използва се за синхронизация на

елементи от меню и бутони. Може да определя състоянието им и да показва операция, която да се извършва върху тях.

Всеки action се свързва с клиентските обекти посредством ActionLink. Връзката е двупосочна.

ПИК 202Д. Гоцева

УПРАЖНЕНИЕ 9TAction При операция върху обект се генерира

събитие OnExecute на Action обекта и оттам се въздейства на всички контроли в ActionList.

Ред на работа: Създаване на действие. Създаване на елементите му. Ако действието няма OnExecute, то трябва

DisableIfNoHandler:=False, за да не се забрани контролата към него.

ПИК 203Д. Гоцева

УПРАЖНЕНИЕ 9Задачи Да се създаде динамично меню за

задаване на размер на шрифта. Да се създаде меню File с картинки. Да се актуализира програмата Текстов

редактор като се добави меню Edit с подменю Cut, Copy, Paste.

top related