Курс на обучение

Днес:
- 0 - 0 - 0

Онлайн сега:
На сайта - 13
По IRC канала - 2

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

Вариантни записи

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

този начин

Например искаме да съхраняваме информация за отсечка на линия в равнина в програма. Математически можем да представим сегмент по два начина:

  1. Две точки, всяка с координати X и Y (т.е. X1, Y1, X2, Y2).
  2. Една точка (X, Y), дължината на линията и ъгълът между нея и която и да е ос (например оста X).

И двата метода са илюстрирани. Съвсем очевидно е, че е удобно да се съхранява такава структура като запис. Нека опишем първата опция:

За по-голяма яснота точките са описани отделно, въпреки че ще бъде по-кратко да ги поставите в един ред (X1, Y1, X2, Y2: Real).

Сега втората опция:

Всичко е наред, и двата варианта са работещи и удобни. Но сега си представете, че в програмата трябва да предоставим на потребителя възможността да въведе сегмент както по първия, така и по втория начин, т.е. той сам ще реши как му е по-удобно. Какво да правя в този случай? Не пишете 2 програми, базирани на една структура, след това на друга? Тук ще ни помогнат записите с опции.

Първо, нека да опишем прост изброен тип данни, който съдържа две стойности - тип описание на сегмента:

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

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

Още веднъж: започваме селектор на променливи, приложите към него оператора с множествен избор случай, и за всяка от стойностите описваме необходимия набор от полета. Комплектите трябва да бъдат затворени в скоби. В нашия случай се случва така:

Тук има една особеност: делото не трябва да се затваря с командата end. Вариантите на набори винаги трябва да се намират в края на списъка с полета (т.е. първо се описват фиксирани полета и след това вариант) - това обяснява липсата на край за случай - записът ще бъде затворен така или иначе със следващия край.

В нашия случай структурата все още не е оптимална: координатите на една от точките са описани и в двата набора. Нека ги преместим като постоянни полета:

Това е последният вид на нашия запис. Погледнете отново и разберете написаното.

Е, сега да преминем към по-познати неща - ще направим интерфейс за въвеждане на информация за сегмента и ще програмираме въвеждането на всички данни в записа.

този начин

Сигурен съм, че ще се справите сами с интерфейсната част, затова давам само кода на бутона:

Първо, разглеждаме кой метод за въвеждане сме избрали във формуляра и съответно задаваме променливата на селектора LType. И тогава прехвърляме данните от полетата за въвеждане в нашия запис: ако първият метод е от 4 леви полета, ако вторият е от 4 десни.

С каква цел въведохме сегмент? Е, например, нека изчислим дължината му. За да направим това, ще представим нашата собствена функция, която ще получи запис като вход и ще изведе дължината на сегмента на изхода. Ако сте забравили математиката, нека ви напомня как да изчислите дължината:

  1. Две точки: дължина е квадратният корен от сумата на квадратите на разликите на съответните координати.
  2. По точка, ъгъл и дължина: няма да кажа нищо, да.

Какво може да бъде по-лесно? Е, в края на манипулатора за щракване на бутона добавете:

Проверете дали работи правилно, като стартирате програмата и въведете някои данни. Не забравяйте, че програмата работи с очакването, че първоначалните данни са верни, т.е. че вместо цифри не сте написали "здравей на всички!".

Опаковани записи

Няколко думи за това какво са опакованите записи и с какво се ядат. По подразбиране паметта за записи не се разпределя много икономично - в допълнение към самите данни се добавят и байтове, които разделят блоковете данни един от друг. Има принудителен начин да принудите Delphi да опакова записа, т.е. минимизиране на паметта, която заема. Това става чрез посочване на думата, опакована преди думата запис. Разликата понякога може да бъде доста осезаема. Пример: писане от низ с дължина 5 знака, един знак и три числа от различен тип. Нека декларираме два различни записа, единият редовен, а другият опакован:

И сега най-интересното: нека видим колко памет отнема всеки от записите. Нека го превърнем във функция Размер на ():