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

203
Д. Гоцева ПИК 1 Променливи и типове данни Лекция No 3

description

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

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

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

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

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

Лекция No 3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция

Параметър

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

Ord

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

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

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

Pred

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

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

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

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

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

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

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

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

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

High

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

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

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

Low

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:var

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

procedure ShowMessage(const Msg: string);

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

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

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

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

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

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

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

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

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

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

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

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

stop.

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

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

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

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

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

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

mrNone mrAbort mrYes mrOk

mrRetry mrNo mrCancel mrIgnore mrAll

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

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

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

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

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

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

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

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

Лекция No 4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПИК 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

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

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

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

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

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

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

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

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

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

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

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

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

ПИК 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

function Round(X: Extended): Int64;

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

function Trunc(X: Extended): Int64;

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

function Int(X: Extended): Extended;

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

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

ПИК 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); Конвертира символния низ в число.

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

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

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

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

function FloatToStr(Value: Extended): string;

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

function StrToFloat(const S: string): Extended;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

страници.

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

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

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

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

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

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

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

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

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

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

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

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

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

Лекция No 5

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

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

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

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

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

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

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

Къси низове

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

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

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

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

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

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

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

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

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

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

Къси низове

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

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

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

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

Дълги низове

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дълги низове

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

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

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

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

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

WideString

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

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

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

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

WideString

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПИК 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;

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

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

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

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

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

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

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

ПИК 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');

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПИК 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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лекция No 6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПИК 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].

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Dispose.

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

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

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

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

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

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

ПИК 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.)

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

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

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

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

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

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

ПИК 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.

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

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

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

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

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

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

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

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

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

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

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

High връща -1.

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

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

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

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

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

string; var Msgs: TMessageGrid;

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

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

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

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

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

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

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

ПИК 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;

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

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

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

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

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

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

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

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

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

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

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

PAnsiString, PString AnsiString

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

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

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

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

PCurrency Currency

PExtended Extended

POleVariant OleVariant

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

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

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

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

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

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

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

PVariant Variant

PWideString WideString

PWordArray

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лекция No 7

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

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

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

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

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

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

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

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

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

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

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

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

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

Тип вариант

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

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

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

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

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

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

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

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

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

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

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

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

Тип вариант

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

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

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

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

ПИК 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).

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

ПИК 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 указател).

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

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

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

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

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

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

на типа.

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

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

ПИК 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;

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

ПИК 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);

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

ПИК 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;

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

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

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

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

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

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

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

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

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

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

ПИК 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}

  

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

ПИК 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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лекция No 8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

тип):type

    T1 = Integer;     T2 = T1;     T3 = Integer;     T4 = T2;

За създаване на различни типове се повтаря думата type в декларацията.

Пример (създава нов тип TMyInteger , който не е идентичен с Integer ): type

TMyInteger = type Integer;

Page 164: Променливи и типове данни

ПИК 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];

Идентичност може да се постигне ако се дефинира явно типа и се направи позоваване към него.

Page 165: Променливи и типове данни

ПИК 165Д. Гоцева

Типова съвместимост Всеки тип е съвместим със себе си. Два различни типа са съвместими ако те

покриват поне едно от следващите условия: И двата са реални И двата са целочислени. Единия тип е подобласт на другия. Двата типа са подобласти на трети. Двата са множества със съвместими базови

типове.

Page 166: Променливи и типове данни

ПИК 166Д. Гоцева

Типова съвместимост Двата са пакетирани низове с еднакъв брой

компоненти. Единия е низ, а другия е низ, пакетиран низ

или Char. Единия е вариант, а другия е integer, real,

string, character, или Boolean тип. Двата са клас, препратка към клас или

интерфейси и единия е получен от другия. Единия е PChar или PwideChar, а другия е

zero-based символен масив от вида array[0..n] of Char.

Page 167: Променливи и типове данни

ПИК 167Д. Гоцева

Типова съвместимост

Единия е Pointer (нетипизиран указател), а другия е произволен указателен тип.

Двата типа са (типизирани) указатели към един и същи тип и директивата {$T+} е в сила.

И двата са процедурни типове с еднакъв тип на резултата, еднакъв брой параметри и типова идентичност между съответните параметри.

Page 168: Променливи и типове данни

ПИК 168Д. Гоцева

Съвместимост при присвояване

Съвместимоста при присвояване не е симетрична.

Израз от тип T2 може да бъде присвоен на променлива от тип Т1 ако стойноста на израза е в обсега на T1 и поне едно от следващите условия е покрито: T1 и T2 са от един и същи тип и този тип не

е файлов тип или сложен тип, който съдържа файл.

T1 и T2 са съвместими числови типове.

Page 169: Променливи и типове данни

ПИК 169Д. Гоцева

Съвместимост при присвояване

T1 и T2 са реални типове. T1 е реален ти,п а T2 е целочислен тип. T1 е Pchar или някакъв низов тип и израза е

низова константа. T1 и T2 са низови типове. T1 е низов тип, а T2 е Char или пакетиран

низ. T1 е дълъг низ, а T2 е PChar. T1 и T2 са съвместими пакетирани низове. T1 и T2 са съвместими множества.

Page 170: Променливи и типове данни

ПИК 170Д. Гоцева

Съвместимост при присвояване

T1 и T2 са съвместими указателни типове. T1 иT2 са класове, препратки към класове

или интерфейси и T2 е получен от T1. T1 е интерфейс, а T2 е клас, който използва

Т1. T1 е PChar или PwideChar, а T2 е zero-based

символен масив от вида array[0..n] of Char. T1 и T2 са съвместими процедурни типове

(идентификатор на процедура или функция в някои оператори за присвояване е третиран като израз от процедурен тип).

Page 171: Променливи и типове данни

ПИК 171Д. Гоцева

Съвместимост при присвояване

Т1 е вариант а Т2 е целочислен реален низов символен Булев или интерфейсен тип.

T1 целочислен реален низов символен или Булев тип а Т2 е вариант.

T1 е IUnknown или IDispatch интерфейсен тип а Т2 е вариант. (Кода на типа на варианта трябва да бъде varEmpty, varUnknown, or varDispatch ако T1 е IUnknown, и varEmpty или varDispatch ако T1 е IDispatch.).

Page 172: Променливи и типове данни

ПИК 172Д. Гоцева

УПРАЖНЕНИЕ 8CheckListBox Това е списък от елементи с поле за

отметка. Потребителя може да избира не само

елементите, но и отметките. За проверка на текущото състояние се

използва Checked и State (State се използва при неактивни полета).

Page 173: Променливи и типове данни

ПИК 173Д. Гоцева

УПРАЖНЕНИЕ 8Интервали TrackBar и ProgressBar: използват се за

задаване на интервали и показване на продължителността на операция.

UpDown: обикновено се свързва с текстово поле и служи за промяна стойността му. Връзката между двете контроли става с Associate свойство на UpDown. Може да се ползва и самостоятелно.

Page 174: Променливи и типове данни

ПИК 174Д. Гоцева

УПРАЖНЕНИЕ 8Интервали PageScroller: служи за превъртане на

вътрешни контроли. Използва се при toolbar, като изобразява 2 стрелки в двата края и ако има невидими елементи на toolbar, позволява скролиране с цел тяхната визуализация.

Page 175: Променливи и типове данни

ПИК 175Д. Гоцева

УПРАЖНЕНИЕ 8Dragging За изпълнението на операция drag&drop,

трябва да се: Зададе вида на операцията в dragKind: dkDrag

(при драгване) или dkDock (при скачване); Зададе режима на операцията в dragMode:

dmAutomatic (автоматично се стартира) или dmManual (трябва да се стартира ръчно от програмиста чрез извикване на BeginDrag);

Page 176: Променливи и типове данни

ПИК 176Д. Гоцева

УПРАЖНЕНИЕ 8Dragging

Създаде обработка на събитие OnDragDrop, което показва какво ще се случи при драгването;

Създаде обработка на събитие OnDragOver, което показва дали ще приеме контролата влачения обект (accept:=True;).

Page 177: Променливи и типове данни

ПИК 177Д. Гоцева

УПРАЖНЕНИЕ 8Задачи Да се създаде приложение на Делфи,

което демонстрира drag&drop:Дадени са 3 етикета с различни шрифтове

и ListBox, който при драгване на етикет си сменя шрифта;

Даден е EditBox и CheckListBox, при драгване на текста от EditBox-a да се добавя в CheckListBox-a.

Page 178: Променливи и типове данни

Д. Гоцева ПИК 178

Променливи и типове данни

Лекция No 9

Page 179: Променливи и типове данни

ПИК 179Д. Гоцева

ПроменливиАбсолютни адреси За да се декларира променлива, която

се разполага на определен адрес в паметта, думата absolute се поставя след името на типа следвана от адрес. Пример:

var CrtMode: Byte absolute $0040;

Page 180: Променливи и типове данни

ПИК 180Д. Гоцева

Променливи Абсолютни адреси За създаване на нова променлива, която се

разполага на същия адрес както и съществуваща променлива, се използва името на съществуваща променлива вместо адрес след думата absolute. Пример:

var     Str: string[32];     StrLen: Byte absolute Str;

Променлива не може да бъде инициализирана в абсолютна декларация.

Page 181: Променливи и типове данни

ПИК 181Д. Гоцева

Нишкови променливи Нишковите променливи се използват в

многонишковите приложения. Нишковите променливи са като глобални

променливи, освен това че всяка нишка, която се изпълнява получава собствено копие на променливата до което другите нишки нямат достъп.

Нишковите променливи се декларират с threadvar вместо с var. Пример:

threadvar X: Integer;

Page 182: Променливи и типове данни

ПИК 182Д. Гоцева

Нишкови променливи

Декларациите на нишкови променливи: Не могат да се появяват в процедура или

функция. Не могат да включват инициализации. Не могат да използват директивата

absolute.

Page 183: Променливи и типове данни

ПИК 183Д. Гоцева

Нишкови променливи Относително отброените променливи (като

дълги низове, динамични масиви или интерфейси) не са нишково безопасни, дори ако са декларирани с threadvar.

Не използвайте динамично нишкови променливи защото по принцип няма начин за освобождаване на заделената в купа памет от всяка нишка, която е използвана.

Не създавайте указателни или процедурни нишкови променливи.

Page 184: Променливи и типове данни

ПИК 184Д. Гоцева

Деклариране на константи Синтаксисът за декларирането на константа е: const <идентификатор> = <константен израз>

където <идентификатор> е валиден идентификатор и <константен израз> е израз, който компилаторът може да изчисли, без да изпълнява програмата.

Ако <константен израз> връща числена стойност, може да бъде определен типа на декларираната константа използвайки типизираната стойност. Пример:

const MyNumber = Int64(17);

Page 185: Променливи и типове данни

ПИК 185Д. Гоцева

Деклариране на константи Тип на константата Ако <константен израз> е символен низ,

декларираната константа е съвместима с всеки низов тип. Ако символния низ е с дължина 1, той е също съвместим с всеки символен тип.

Ако <константен израз> е реално число, декларираната константа е от тип Extended. Ако е целочислен, декларираната константа е от тип Longint, освен ако стойността на <константен израз> е извън обсега на Longint – в този случай типа на константата е Int64.

Page 186: Променливи и типове данни

ПИК 186Д. Гоцева

Константи изрази Константен израз е израз, който компилаторът

може да изчисли без да изпълнява програмата, в която израза се среща.

Константните изрази включват числа, символни низове, константи, стойности на изброени типове, специалните константи True, False и nil и изрази, съставени изключително от тези елементи с оператори типизация и множество.

Константните изрази могат да включват променливи, указатели, обръщения към функции.

Page 187: Променливи и типове данни

ПИК 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

Page 188: Променливи и типове данни

ПИК 188Д. Гоцева

Ресурсни низове

Ресурсните низове се съхраняват като ресурси и се свързват с изпълнимия файл или библиотека, така че могат да бъдат модифицирани, без да се прекомпилира програмата.

Ресурсните низове се декларират както и другите константи, с изключение на това че думата const се заменя с resourcestring.

Page 189: Променливи и типове данни

ПИК 189Д. Гоцева

Ресурсни низове

Изразът вдясно от символа = трябва да бъде константен израз и трябва да връща низова стойност. Пример:

resourcestring     CreateError = 'Cannot create file %s';

Page 190: Променливи и типове данни

ПИК 190Д. Гоцева

Изрази и операцииВидове операции • Аритметични + - * / div mod• Булеви not and or xor• Логически not and or xor shl shr• Низови < <= > >= <> = +• Указателни < <= > >= + - ^ = <>• За множества + - * <= >= = <> in• Релационни < <= > >= = <>• Класови As is = <>• Операция @ @

Page 191: Променливи и типове данни

ПИК 191Д. Гоцева

Изрази и операции Операнди С изключение на ^, is, и in, всички

операции приемат операнди от тип Variant.

Операциите as и is приемат за операнди класове и инстанции на обекти, as действа и на интерфейси.

Page 192: Променливи и типове данни

ПИК 192Д. Гоцева

Изрази и операции Резултат от операциите При аритметичните операции резултатът е от

тип Extended, когато поне единият операнд е real; иначе , резултатът е от тип Int64 когато поне един от операндите е от тип Int64; иначе резултатът е от тип integer. Ако типа на операнда е подмножество на целочислен тип, той е третиран като от целочисления тип.

Page 193: Променливи и типове данни

ПИК 193Д. Гоцева

Изрази и операции Резултат от операциите Следните правила важат за слепването

на низове: Операндите за + могат да бъдат низове,

групирани низове (групирани масиви от тип char), или символи. Ако единия от операторите е от тип WideChar, тогава другият трябва да бъде дълъг низ.

Резултатът от операцията + е съвместим с всеки низов тип. Обаче ако операндите са къси низове и тяхната комбинирана дължина е по-голяма от 255 резултата се отрязва до първите 255 символа.

Page 194: Променливи и типове данни

ПИК 194Д. Гоцева

Изрази и операции Резултат от операциите Следните правила важат за операциите за

отношение: Операндите трябва да бъдат съвместими типове с

изключение на това, че могат да бъдат сравнявани реален и цял тип.

Низовете се сравняват според реда на символите, които съдържат в ASCII кодовата таблица. Отделните символи се третират като низове с дължина 1.

Два групирани низа трябва да имат еднакъв брой елементи, за да бъдат сравнени. Когато групиран низ с n елемента е сравнен с низ, групираният низ се третира като низ с дължина n.

Page 195: Променливи и типове данни

ПИК 195Д. Гоцева

Изрази и операции Резултат от операциите

Операциите за отношение <,,<= и = се прилагат към PChar операнди, само ако двата указателя са към един и същи символен масив .

Операциите = и <> могат да приемат операнди от тип class и class-reference. С операндите от тип class, операциите = и <> се изчисляват според правилата, които са в сила за указателите: C = D е Истина само ако C и D сочат към една и съща инстанция на обекта, в противен случай C <> D е Истина.

Page 196: Променливи и типове данни

ПИК 196Д. Гоцева

Приоритет на операциите

Операциите с еднакъв приоритет се изчисляват от ляво на дясно.

Oперации Приоритет@ Най-висок*, /, div, mod, and, shl, shr, as Втори+, -, or, xor Трети=, <, <, , <=, =, in, is  Най-малък ( 4 )

Page 197: Променливи и типове данни

ПИК 197Д. Гоцева

УПРАЖНЕНИЕ 9Главно Меню (TMainMenu) Създава се чрез меню дизайнер. Могат

да се добавят горещи клавиши чрез ShortCut и клавишни комбинации с Alt+символ. Последното се постига с & пред символа.

За да се въведе разделител се използва ‘-’ в Caption.

Page 198: Променливи и типове данни

ПИК 198Д. Гоцева

УПРАЖНЕНИЕ 9Главно Меню (TMainMenu) За въвеждане на подменю се използва

Ctrl+->. Управлението на менюто се

осъществява чрез Enable и Visible. Възможно е създаването на радиогрупа

посредством еднакъв GroupIndex за всички елементи на групата и RadioItem:=true.

Page 199: Променливи и типове данни

ПИК 199Д. Гоцева

УПРАЖНЕНИЕ 9Главно Меню (TMainMenu) Възможно е задаване на състояния на

елементите на менюто чрез Checked. Може да се добави картинка към

елемент на менюто чрез задаване на Bitmap.

Page 200: Променливи и типове данни

ПИК 200Д. Гоцева

УПРАЖНЕНИЕ 9Контекстно Меню (TPopMenu) Показва се при натискане на десен

бутон на мишката. За свързване на контекстно меню с

компонент, трябва да се попълни свойството PopupMenu на последния.

Може да се използва и метода Popup на менюто като се укажат координатите на менюто.

Page 201: Променливи и типове данни

ПИК 201Д. Гоцева

УПРАЖНЕНИЕ 9TAction Използва се за синхронизация на

елементи от меню и бутони. Може да определя състоянието им и да показва операция, която да се извършва върху тях.

Всеки action се свързва с клиентските обекти посредством ActionLink. Връзката е двупосочна.

Page 202: Променливи и типове данни

ПИК 202Д. Гоцева

УПРАЖНЕНИЕ 9TAction При операция върху обект се генерира

събитие OnExecute на Action обекта и оттам се въздейства на всички контроли в ActionList.

Ред на работа: Създаване на действие. Създаване на елементите му. Ако действието няма OnExecute, то трябва

DisableIfNoHandler:=False, за да не се забрани контролата към него.

Page 203: Променливи и типове данни

ПИК 203Д. Гоцева

УПРАЖНЕНИЕ 9Задачи Да се създаде динамично меню за

задаване на размер на шрифта. Да се създаде меню File с картинки. Да се актуализира програмата Текстов

редактор като се добави меню Edit с подменю Cut, Copy, Paste.