Переменные в Delphi


Переменные в Delphi

Переменные в любом языке программирования являются его неотъемлемой структурой. Именно создание переменных мы и разберем в этом уроке. По просьбе постоянных читатей сайта я буду иногда размещать уроки, предназначенные для тех кто не освоил Pascal, но хочет освоить Delphi с нуля. Если же вы знакомы с основами языка Pascal, то этот урок вы можете пропустить.

Переменные, как вы уже наверное догадываетесь, в первую очередь служат для хранения информации. Именно в хранении информации и работе с ней заключается основной принцип программирования. Переменные, т.е. информация может быть различных типов, например целые числа, дробные числа, строки и т.д.

Прежде чем производить различные операции с переменной, ее надо создать, т.е. объявить. Для создания переменных в Delphi или Pascal существует специальный раздел var, в котором при помощи специальных инструкций можно объявлять переменные и задавать им типы. Пример раздела var:

В данном случае, Delphi по умолчанию всегда создает var в начале файла с программным кодом. Переменные указанные в разделе Var, объявленном в начале файла с программным кодом (обычно перед ключевым словом implementation) называются глобальными. Особенность глобальных переменных заключается в том, что их можно использовать в любых обработчиках событий, практически в любом месте данного программного кода. Стоит отметить, что в глобальном разделе var delphi уже создает переменную form1, которая и есть наша форма. Поэтому под переменной в Delphi подразумевается достаточно широкие возможности. Переменной можно назвать кнопку, любой элемент интерфейса, однако тут тоже существуют свои особенности, которые мы рассмотрим в следующих уроках.

Но переменные можно объявлять и внутри обработчиков событий (а также процедур, функций, которые мы разберем в следующих уроках). Такие переменные называются локальными. Локальные переменные объявляются здесь:

Видно, что я создал раздел для объявления переменных в обработчике события OnClick у Button1. Делается это добавлением слова var перед begin.

Теперь разберемся, как объявлять такие переменные. Перед объявлением переменных всегда надо указывать var. После var идет список переменных. Переменные должны иметь название, которое может состоять из латинских букв, цифр и знака подчеркивания, например: my, i, my_1_variable. Запомните, что переменные не могут начинаться со знака цифры. Теперь пора разобраться с тем, какие же существуют типы переменных. На самом деле их существует огромное количество, но мы рассмотрим с вами только самые необходимые для изучения Delphi. Далее я привожу таблицу:

integer Этот тип представляет собой целочисленные числа, находящиеся в диапазоне от -2147483648 до 2147483647.
byte Числа в диапозоне от 0 до 255.
double Числа с плавающей запятой, имеющие до 15 цифр точности.
char Символ (будет подробно разобрано в следующих уроках).
string Набор символов, т.е. строка (будет подробно разобрано в следующих уроках).
boolean Логический тип данных, который может хранить в себе 2 значения: правда или ложь (будет подробно разобрано в следующих уроках).

Теперь я покажу как создавать, т.е. объявлять переменные в Delphi:

[cc lang=’delphi’]var a,b:integer;
c:byte;
d:string;
e:boolean;
[/cc]

При создании переменных нужно помнить, что каждая переменная должна иметь свое собственное уникальное название. Если же существует несколько переменных с одинаковым именем, то при компиляции программы delphi выдаст ошибку.[/warning]

В данном примере мы создали следующие переменные: a и b типа целочисленного числа, с — число в диапозоне от 0 до 255, d — строку и e — логическая переменная. Далее я привожу примеры создания локальных переменных и глобальных.

О том, как работать с переменными, мы разберем в следующем уроке.

Типы переменных Delphi. Глобальные переменные Обучающий материал

Для большей структурированности кода и наиболее эффективному использованию ресурсов оперативной памяти в языке программирования Delphi применяются три вида переменных: глобальные, локальные и динамические. Необходимо знать и четко разграничивать области, где и какие типы переменных Delphi правильно использовать.

Глобальные переменные Delphi

Переменные, имеющие глобальный тип объявляются вне функций и процедур. Область их использования не ограничена. То есть глобальные переменные могут вызываться и использоваться во всем теле программы. Динамическая память под них резервируется сразу же после запуска приложения и очищается по окончанию его работы. Принято чаще всего объявлять глобальные переменные Delphi в самом начале кода. Пример:

Следует заметить, что нежелательно использовать в качестве имени переменной счетчик цикла, который затем будет использоваться в программе. Имеется ввиду, что если существует глобальная переменная Delphi “i:Integer”, то эту “i” не нужно использовать в цикле. Такое применение может вызвать замедление цикла и некорректность в работе. К тому же следует помнить, что если нет крайней необходимости в использовании глобальных переменных, то нужно воздержаться от их объявления.

Локальные переменные Delphi

Локальными называются те переменные, которые объявляются в теле функций, процедур, модулей и видимы только внутри них. Область применения такой переменной ограничена процедурой либо функцией, в которой она была объявлена. Оперативная память в этом случае резервируется в момент объявления и обнуляется по окончанию работы той части программы, в которой эта переменная использовалась. Следует знать, что использование именно локальных переменных приводит к увеличению быстродействия приложения и способствует снижению нагрузки на динамическую память. Пример:

Глобальные и локальные типы переменных Delphi чаще всего используется при написании кода. Однако иногда существует необходимость при выполнении того или иного приложения где-то хранить промежуточные данные. Они необходимы именно для внутренних операций и в дальнейшем нигде не используются. В таких случаях целесообразно использовать динамические переменные.

Динамический тип переменных Delphi

Оперативная память под такую переменную выделяется во время выполнения программы вызываемой процедурой “new”. Параметром такой процедуры является указатель на тип: строка, число, дробь. Исходя из типа указателя, выделяется необходимый объем динамической памяти под хранение динамических переменных. Объявленные таким образом переменные могут существовать в памяти до тех пор, пока не будут уничтожены специальной процедурой. Пример создания динамических переменных Delphi:

Понимания и используя динамические переменные Delphi, другие типы переменных существует возможность создавать полноценные приложения на языке delphi. Начиная от простых программ до сложных приложений способных поднять на новый уровень администрирование linux, повышая эффективность работы системных администраторов.

Язык delphi. переменные, константы и их типы

Лк 2. События Delphi

Операционная система Windows — многозадачная, т.е. несколько программ в ней могут функционировать одновременно. Когда, например, мы щёлкаем по кнопке в окне нашей программы, система Windows определяет, что произошло событие именно в нашей программе, и посылает ей сообщение об этом. Наша программа должна соответствующим образом отреагировать на него. Для этого мы, как программисты, должны написать код-обработчик этого события. Таким образом, структура программы для Windows представляет собой набор подпрограмм, каждая из которых ответственна за обработку конкретного события и вызывается только при его возникновении. Удобство Delphi состоит в том, что мы избавлены от необходимости получать сообщения от Windows сами, Delphi это делает за нас. Каждый компонент имеет впечатляющий набор событий, на которые он может реагировать. Программист сам определяет, какие события в программе требуется обрабатывать.

Откройте наш проект из предыдущего урока. Щелкните на компоненте Edit1. Он появится в Инспекторе объектов. Посмотрите: в Инспекторе объектов две вкладки: Properties (свойства) и Events (события). Перейдите на вкладку Events. Чтобы создать обработчик нужного события, нужно дважды кликнуть по нему мышкой. А если раскрыть выпадающий список, в нём будут находиться уже готовые обработчики, которые могут подходить для этого компонента. Таким образом, один обработчик может вызываться для обработки событий нескольких компонентов.

Изменим нашу программу так, чтобы текст на форме появлялся прямо в момент его ввода. В момент ввода у Edit1 меняется свойство Text — в нём появляется новая буква! Значит, воспользуемся событием onChange (change — изменение (англ.)), которое и происходит в этот момент. Итак:

1. Кликаем дважды по onChange, и оказываемся внутри только что созданного обработчика.

2. Присваиваем свойству Caption компонента Label1 значение свойства Textкомпонента Edit1, то есть делаем то же, что и в прошлом уроке: Label1.Caption := Edit1.Text;Или просто копируем из обработчика нажатия кнопки.

3. Запускаем программу, всё работает. Как видим, всё очень просто.

Теперь рассмотрим событие onClick, это событие возникает при щелчке мышкой на компоненте. Воспользуемся им, чтобы очищать строку ввода от уже введённых символов. В обработчике нужно присвоить свойству Text значение пустой строки. Строка в Delphi образуется заключением текста в одинарные кавычки (находятся на кнопке Э): ‘Так в Delphi образуется строка’.Значит, пустая строка — это кавычки без текста: ». Не должно быть даже пробела, иначе он окажется в строке ввода: Edit1.Text:=»;Есть другой способ, воспользоваться специально предназначенным для этого методом компонента Edit, который так и называется Clear (очистка англ.):Edit1.Clear;Но подумайте о пользователе, который будет работать с вашей программой. Ему должно быть удобно. Если при вводе текста он захочет что-то исправить, и щёлкнет мышкой в том месте текста, где нужно внести изменение?! И всё сотрётся! Поэтому лучше использовать событие onEnter, которое происходит, когда вы входите в него и компонент получает фокус ввода, или использовать для очистки специальную кнопку и её событие onClick. Конечно, у каждого компонента свой набор событий. Мы познакомились с тремя из них:

Другие важные события, которые есть почти у каждого визуального компонента:

  • onExit — возникает, когдакомпонент теряет фокус ввода;
  • onDblClick — возникает при двойномщелчке мышкой по компоненту;
  • onKeyDown — когда при нажатии накнопку на клавиатуре она оказалась в нижнем положении;
  • onKeyUp — когда при отпусканииклавиатурной кнопки она оказалась в верхнем положении;
  • onKeyPress — возникает при нажатиина клавиатурную кнопку. От событийonKeyDown и onKeyUp оноотличается типом используемого параметра Key ;
  • onMouseDown — когда при нажатиикнопки мышки она оказалась в нижнем положении;
  • onMouseUp — когда при отпусканиикнопки мышки она оказалась в верхнем положении;
  • onMouseMove — возникает приперемещении указателя мышки над

В начале работы любой программы происходит очень важное событие событие нашего основного компонента — Формы, onCreate. Оно происходит перед появлением Формы на экране. Это событие используется для задания свойств тех элементов программы, которые нуждаются в настройке, например, размеры и положение Формы на экране. Если вы захотите сделать невидимую программу, можно приравнять нулю ширину Width и высоту Height Формы. На этапе проектирования сделать этого нельзя, т.к. это помешает работе, поэтому делаем это по событию onCreate:
Form1.W >Form1.Height := 0;
Дополнительно нужно убрать и заголовок Формы, выбрав в Инспекторе Объектов параметр BorderStyle равным None. Теперь Форма на экране не появится. Единственным визуальным признаком останется появление её значка на панели задач. В дальнейшем я расскажу, как избавиться и от него

Язык Delphi. Переменные, константы и их типы

Данные в компьютере можно рассматривать как ячейки памяти, имеющие свои имена (идентификаторы). Все данные в программе на языке Delphi должны быть описаны до их первого использования. И компилятор следит, чтобы в программе они использовались в соответствии с этим описанием, что позволяет избежать ошибок.

Любая величина в Delphi может быть постоянной или переменной. Её имя (идентификатор) может состоять из комбинации латинских букв, цифр и знака подчёркивания, и начинаться не с цифры. При этом регистр символов значения не имеет.

Место описания данных в программе — вне логических блоков begin / end. В модуле перед ключевым словом implementation есть блок описания:

var
Form1: TForm1;
Именно здесь, начиная со следующей строки, удобно объявлять глобальные переменные и константы. Как видим, одна (Form1) уже есть! Команда объявления переменных в языке Delphi: var имя_переменной : тип_переменной ;
Слово var — ключевое. Именем может быть любой идентификатор, если он не был описан ранее и не является одним из ключевых или зарезервированных слов языка Delphi. Если нужно описать несколько переменных одного типа, то их перечисляют, отделяя запятой:

var A, B, C : Integer;

Если несколько описаний следуют друг за другом, то ключевое слово var повторно можно не указывать:
var A, B : Integer;C, D : String;

Постоянную величину иначе называют константой. Конечно, в программе можно использовать числа и строки непосредственно: 3.1415 или ‘Это значение числа пи’, но иногда удобнее присвоить их идентификатору. Описание констант аналогично описанию переменных, но используется ключевое слово const, за именем идентификатора следует тип, затем знак равенства и его значение. Причём тип константы допускается не указывать:
const pi=3.1415 ;
ZnakPi : String =’Это значение числа пи’;
К слову, константа Pi встроенная в Delphi, то есть для того чтобы использовать в Delphi число 3,1415… в расчётах, нужно просто присвоить встроенную константу Pi переменной типа Real или просто использовать непосредственно в выражениях.

Илон Маск рекомендует:  Что такое код swfbutton >setup

Теперь пришло время узнать о типах данных, используемых в Delphi. Прежде всего это строки и числа.

Строкой называется последовательность символов, заключённая в одиночные кавычки:’это текстовая строка’

Если текст должен содержать сам символ кавычки, то его надо повторить дважды: ‘это » — символ одиночной кавычки’

Строка может быть и пустой, не содержащей символов. Тогда она состоит из двух идущих друг за другом без пробела кавычек. Естественно, строка может состоять и только из одних пробелов.
Самый популярный строковый тип — String. Строка типа String может содержать переменное количество символов объёмом до 2 Гбайт. Если нужно ограничить размер строки фиксированным значением, то после ключевого слова String в квадратных скобках указывается число, определяющее количество символов в строке: String[50]. Одиночный символ имеет тип Char и записывается в виде знака в одиночных кавычках: ‘a’. Есть символы, которые на экране отобразить невозможно, например, символ конца строки (равен #13), символ переноса строки (равен #10). Такие символы записываются в виде их числового кода (в кодировке ANSI), перед которым стоит знак #. Например, #0.
Наконец, существуют так называемые нуль-терминированные строки. Отсчёт символов в таких строках начинается с нуля, а заканчивается символом с кодом 0 (#0). Такие строки имеют тип PChar.

Числа бывают целые и дробные. В следующей таблице перечислены стандартные типы целых чисел и соответствующие им дипазоны допустимых значений.

Integer -2147483648.. +2147483647
Cardinal 0.. 4294967295
Shortint -128.. +127
Smallint -32768.. +32767
Int64 -263 .. +263-1
Byte 0.. +255
Word 0.. +65535

Наиболее удобным для использования в программах является тип Delphi Integer. Другие целые типы используются для уменьшения места, занимаемого данными в памяти компьютера.

Дробные числа имеют дробную часть, отделяемую десятичной точкой. Допускается использование символа e (или E), за которым следует число, указывающее, что левую часть нужно умножить на 10 в соответствующей степени: 5e25 — пять умножить на десять в двадцать пятой степени.
Ниже приведены стандартные типы дробных чисел и соответствующие им диапазоны допустимых значений. Для большинства типов указан диапазон положительных значений, однако допустимым является аналогичный диапазон отрицательных значений, а также число 0.

Real 5*10-324 .. 1.7*10308
Real48 2.9*10-39 .. 1.7*1038
Singl 1.5*10-45 .. 3.4*1038
Double 5*10-324 .. 1.7*10308
Extended 3.6*10-4951 .. 1.1*104932-1
Comp -263 .. +263-1
Currency 922337203685477.5807
Наиболееудобным для использования в программах является тип Delphi Real.Ему эквивилентен тип Double, но в будущем это может бытьизменено. Вычисления с дробными числами выполняются приближённо, заисключением типа Currency (финансовый), который предназначендля минимизации ошибок округления в бухгалтерских расчётах.

Следующим типом данных является логический Boolean, состоящий всего из двух значений: True(Истина) и False (Ложь). При этом TrueFalse.
Теперь, используя компоненты, их свойства и события, вводя собственные переменные, можно конструировать программы, содержащие вычисления. Осталось узнать, как вычисленное значение вывести на экран.
Про консольные программы я здесь не говорю! А в нормальных оконных Windows-приложениях это значение нужно поместить в какой-нибудь компонент, имеющий свойства Text или Caption. Это, например, такие компоненты как Label и Edit, да и сама Форма имеет свойство Caption, куда тоже можно выводить информацию. Однако, в Delphi информацию перед выводом, как правило, необходимо преобразовывать. Так как присвоение возможно только между переменными одного типа, то такая программа (не пытайтесь её исполнять):

var A, B, C: Integer ;
begin
A := 5 ;
B := 10 ;
C := A+B ;
Label1.Caption := C ;
end ;

вызовет ошибку, так как свойство Caption имеет текстовый тип String, а использованные переменные — цифровой тип Integer. Значит, нужно преобразовать значение переменной C в текстовый тип. Для этого есть встроенная функция IntToStr. Строка в нашей программе, вызывавшая ошибку, должна выглядеть так: Label1.Caption := IntToStr(C) ; Такая программа, кроме показа числа 15, ни на что не способна. Мы должны научиться вводить в программу другие числа. Используем компоненты Edit. Введённые числа будут содержаться в свойстве Text этих компонентов. Расположим на форме два компонента Edit, один компонент Label и кнопку Button, по нажатию на которую и будем проводить вычисления. В компоненты Edit1 и Edit2будем вводить числа для суммирования. Чтобы переместиться в редактор кода, щёлкнем дважды по нашей кнопке Button1. Мы попадём прямо в сформированную для нас средой Delphi заготовку обработчика нажатия на кнопку, непосредственно между операторами begin и end. Напишем такой простой код:

procedure TForm1.Button1Click(Sender: TObject);
var A, B, C: Integer;//Не забудьте описание переменных
begin
//Начало кода:
A := Edit1.Text;
B := Edit2.Text;
C := A+B;
Label1.Caption := IntToStr(C);
//Конец кода
end ;

При попытке исполнить этот код Delphi покажет ошибки по аналогичной причине — переменные A и Bимеют цифровой тип Integer, а свойство Text — текстовый тип String. Исправить ошибки поможет встроенная функция StrToInt, выполняющая обратное преобразование — текст в целое число. Операторы присвоения переменным A и B должны выглядеть так:

A := StrToInt(Edit1.Text);
B := StrToInt(Edit2.Text);

В данном случае переменные A, B, C использовались для наглядности. Можно обойтись одной строчкой:

Аналогично, имеются функции и для преобразования в строку и обратно действительных чисел c плавающей (Floating англ.) запятой, имеющих тип Real. Для преобразования в строку — FloatToStr, обратно — StrToFloat.
Часто результаты вычислений, имеющие тип Delphi Real, имеют после запятой длинный хвост цифр. При выводе такой переменной в текстовом виде необходимо ограничить количество цифр после запятой.

Статьи к прочтению:

Delphi урок #1 | Основные типы переменных.

Похожие статьи:

Данные в компьютере можно рассматривать как ячейки памяти, имеющие свои имена (идентификаторы). Все данные в программе на языке Delphi должны быть…

Общий формат объявления переменных: [] [][=], [=],…, [=]; Необязательный элемент(необязательный элемент далее в записи форматов будет помещаться в…

Глобальные переменные

04.12.2009, 12:41

Глобальные переменные
Если я в файле проекта создам раздел var и там напишу переменные, могу ли я их использовать в.

Глобальные переменные
Глобальные переменные вроде как инициализируются нулевыми значениями. Даже в хелпе написано: «If.

Каким образом использовать глобальные переменные в процедурах?
Собственно проблема, создаю процедуру, в которой ссылаюсь на глобальные переменные. У меня.

Глобальные переменные — передача значения из одной формы в другую
На одном форуме нашел следующее решение: Создать отдельный модуль без форму. Объявить в нем в.

Копирование русских символов с редактора Edit на Label (локальные глобальные переменные в цикле)
for loop control variable must be simple local variable переменная в цикле должна быть.

Константы и переменные Delphi

Работа с Delphi. Константы и переменные.


Константы — это параметры (объекты) программы, которые не могут из­менять своё значение в ходе выполнения программы.

Как мы уже знаем, все числа являются числовыми константами. Из чисел, знаков операций, идентификаторов некоторых стандартных функций и круглых скобок можно составлять константные выражения:

Точно так же из любых символов мы можем составить символьные (один любой символ) и строковые константы (любое количество любых симво­лов, в том числе и ни одного). Такие константы заключаются в одинарные (не двойные!) кавычки:

’G’ ’R’ ’7’ ’Ж’ ’Э’ — символьные константы

’’ — пустая строка, в которой нет ни одного символа

’Delphi’ ’G’ ’Constant’ ’Строковая константа’ — строковые кон­станты

Строковые и символьные константы можно соединять знаком +:

’Delphi’ + ’ — ’ + ’ это наш выбор! ’

Значением этого выражения будет строка «Delphi- это наш выбор!»

’205’ ’14.007’ ’2 + 2’ — тоже строковые константы! Их значени­ями являются именно строки, а не числа, поэтому значение выражение ‘2 + 2’ вовсе не 4!

Если в строковой константе имеется одиночная кавычка, то её следует по­вторить дважды.

Кроме того, существуют логические константы True(соответствует зна­чению истина), False(ложь), а также константа nil (0, используется как значение указателей).

Такие явные константы и константные выражения можно использовать в любых операторах и для этого их не нужно объявлять.

Переменные — это параметры (объекты) программы, которые могут из­менять своё значение в ходе выполнения программы.

Физически переменная представляет собой область памяти (её размер за­висит от типа переменной; в этих ячейках памяти хранится значение пе­ременной), связанную с её идентификатором.

Как и все другие объекты программы, до первого использования перемен­ные должны быть объявлены. Переменные описываются в разделе объяв­ления переменных модуля или подпрограммы. Он начинается зарезерви­рованным словом var (от слова variable — переменная), за которым следуют объявления переменных.

При объявлении переменной указывается её имя, которое отделяется двоеточием от типа. Каждое объявление завершается точкой с запятой:

Переменные в Delphi

Школа программирования Delphi

Портал DelphiSchool является бесплатным проектом, обеспечивающим пользователям быстрый и легкий доступ к урокам программирования на Delphi. Сайт позволяет научиться программировать на Делфи любому, кто хочеть писать свои программы, игры, Android приложения, программы для MAC OC или IOS. Кроме уроков Delphi и статей Delphi, на сайте доступны также и видеоуроки. Практически к каждому уроку, пользователю доступен исходник, изучив который, он сможет наглядно посмотреть как работает та или иная программа, написанная на Делфи. Кроме того мы постараемся прилагать к каждому материалу (статье, уроку, видеоуроку) файлы Delphi, которые будут помогать изучить предоставленный материал.

Каждый кто решил написать свою программу, создать свое приложение, научиться программировать и т.д., найдет на DelphiSchool статьи Delphi, уроки Delphi, видеоуроки Delphi, исходники Delphi, файлы Delphi, изучит компоненты Delphi, посмотрит Delphi примеры и многое другое абсолютно бесплатно. Все о Delphi программировании теперь собрано на одном сайте.
DelphiSchool

С помощью переменных этого типа очень удобно строить логику. Переменная булева типа может принимать только одно из двух значений – true или false. Лучше и понятнее булевы переменные называть логическими переменными. Для объявления логических переменных используется слово Boolean. Рассмотрим пример работы с такими типами переменных:

В этом примере объявляются две переменные: b (логическая) и str (строковая). Потом происходит присваивание переменной b значения true. Дальше требуются пояснения, потому что идет логическая конструкция if … then, которая до этого момента не изучалась.
Слово if переводится как «если». Слово then переводится как «то». В результате получается конструкция «если условие выполнено,то» В программе она выглядит как if условие выполнено then. Частым случаем этой конструкции является запись if . then . else. Слово else переводится как «иначе». То есть если условие выполнено, то выполнится то, что написано после then, иначе выполнится то, что написано после else.
Все операторы в Delphi заканчиваются точкой с запятой. Это нужно делать, чтобы отделить команды друг от друга, ведь одна команда может быть записана на две строки или две команды в одной. Так вот после оператора, идущего перед else, никогда не ставится точка с запятой. Это правило нужно запомнить.
В примере ниже проверяется условие, если переменная b равна true, то переменной str присваивается значение «Истина», иначе значение «Ложь».

Динамические переменные

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

Выделение памяти для динамической переменной осуществляется вызовом процедуры new. У процедуры new один параметр — указатель на переменную того типа, память для которой надо выделить. Например, если р является указателем на тип real, то в результате выполнения процедуры new(p); будет выделена память для переменной типа real (создана переменная типа real), и переменная-указатель р будет содержать адрес памяти, выделенной для этой переменной.

У динамической переменной нет имени, поэтому обратиться к ней можно только при помощи указателя.

Процедура, использующая динамические переменные, перед завершением своей работы должна освободить занимаемую этими переменными память или, как говорят программисты, уничтожить динамические переменные». Для освобождения памяти, занимаемой динамической переменной, используется процедура Dispose, которая имеет один параметр — указатель на динамическую переменную.

Например, если р — указатель на динамическую переменную, память для которой выделена инструкцией new(p), то инструкция dispose (р) освобождает занимаемую динамической переменной память.

Следующая процедура (ее текст приведен в листинге 8.3) демонстрирует создание, использование и уничтожение динамических переменных.

Листинг 8.3. Создание, использование и уничтожение динамических переменных

procedure TForm1.Button1Click(Sender: TObject); var

p1,p2,p3: Integer; // указатели на переменные типа integer

// создадим динамические переменные типа integer

// (выделим память для динамических переменных)

ShowMessage(‘Сумма чисел равна ‘ + IntToStr(р3^));

// уничтожим динамические переменные

// (освободим память, занимаемую динамическими переменными)

В начале работы процедура создает три динамические переменные. Две переменные, на которые указывают p1 и р2, получают значение в результате выполнения инструкции присваивания. Значение третьей переменной вычисляется как сумма первых двух.

Релятивисты и позитивисты утверждают, что «мысленный эксперимент» весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.

Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: «Если факт не соответствует теории — измените факт» (В другом варианте » — Факт не соответствует теории? — Тем хуже для факта»).

Максимально, на что может претендовать «мысленный эксперимент» — это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.

Илон Маск рекомендует:  Php руководство по рнр 3 0 дополнительные функции

Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.

Понятие «мысленный эксперимент» придумано специально спекулянтами — релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим «честным словом». Подробнее читайте в FAQ по эфирной физике.

Кибер-Сайт

Приветствую Вас Гость | RSS
Главная » 2013 » Апрель » 5 » Переменные Delphi. Объявление и инициализация переменных. Урок-7

Переменные Delphi. Объявление и инициализация переменных. Урок-7

Сегодняшний наш урок будет посвящен переменным. Для чего нужны переменные? Переменные нужны для записи, хранения и считывания, данных во время работы программы.

Объявляются переменные всегда в начале программы или подпрограммы (процедуры или функции), это очень важно, так как каждая переменная должна быть доступна во всем теле программы. Для каждой переменной компилятору необходимо выделить определенное количество памяти, которое зависит от типа данных каждой переменной.

Чтобы сообщить компилятору о том, что мы собираемся объявить переменную, существует специальное ключевое слово var.

var
Имя переменной : Тип данных ;

После ключевого слова var следует: имя переменной (служит для идентификации переменной и обращения к ней), знак двоеточия (сообщает, что дальше следует тип данных переменной), тип данных (сообщает компилятору о количестве выделяемой памяти и характере переменной (число, строка, пользовательский тип данных и т. д, точка с запятой (сообщает об окончании описания переменной). Более конкретный пример использования переменных смотрите ниже.

А сейчас рассмотрим следующий пример.

var
VInt: Integer; // Описание переменной VInt типа Integer (целочисленный тип данных)
VFloat: Single; // Описание переменной VFloat типа Single (вещественный тип данных (число с плавающей точкой))
VStr: String; // Описание переменной VStr типа String (строковой тип данных)

После объявления переменной её нужно инициализировать (присвоить начальное значение). Следует отметить, что при выделении памяти под переменную в ней остается «мусор» (данные, оставленные в памяти другими программам). Важно: инициализация переменных и дальнейшие действия над ними осуществляется между двумя ключевыми словами begin и end (в подпрограммах) и в специальных разделах модуля (таких, как initialization и finalization). Присваивание выглядит следующим образом:

Имя переменной := Присваиваемое значение ;

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

procedure UseVar;
var
V1: Integer; // Объявляем переменную
begin
V1 := 30; // Обращаемся к переменной и присваиваем ей значение 30
// Дальнейшие действия…
end;

Здесь мы объявляем переменную V1: Integer, затем присваиваем ей значение 30. Дальше мы можем использовать переменную в различных арифметических и логических операциях, присваивать ей разные значения или обращаться к переменной для присваивания ей значений других переменных.

Категория : Delphi | Просмотров : 12669 | Добавил : Admin | Теги : Delphi для чайников, Object Pascal, Delphi Справочная информация, Уроки Delphi, Delphi | Рейтинг : 0.0 / 0

Похожие материалы

  • Синтаксис Delphi. Урок-3
  • Интерфейс Delphi. Знакомство с Delphi-7. Урок-1
  • Модуль Delphi. Знакомство с модулями. Урок-6
  • Модуль Delphi. Полное описание
  • Настройка Delphi. Урок-2
  • Программа в Delphi. Урок-5
Всего комментариев : 1

Привет.
Приглашаю Вас на Лучший High Five сервак
Сервак подойдет тем кто приветствует долгую игру с расчетом на настоящее доминирование.
Совершенно не подойдет предпочитающим ворваться и всех нагнуть.
Скользящим мимо любителям попрыгать по сервакам переоткрывашкам, ловить мало, т.к. старики их быстренько уделают :)

Строковые типы в Delphi. Особенности реализации и использования

В этой статье будут освещены следующие вопросы:

  1. Какие строковые типы существуют в Delphi, и чем они отличаются друг от друга
  2. Преобразование строк из одного типа в другой
  3. Некоторые приемы использования строк типа AnsiString:
    1. Функции для работы со строками о которых многие часто забывают или вовсе не знают
    2. Передача строк в качестве параметров
    3. Использование строк в записях
    4. Запись в файл и чтение из файла
    5. Использование строк в качестве параметров и результатов функций размещенных в DLL.

Ну что, интересно? Тогда поехали.

Какие строковые типы существуют в Delphi, и чем они отличаются друг от друга?

В Delphi 1.0 существовал лишь единственный строковый тип String, полностью эквивалентный одноименному типу в Turbo Pascal и Borland Pascal. Однако, этот тип имеет существенные ограничения, о которых я расскажу позднее. Для обхода этих ограничений, в Delphi 2, разработчики из Borland устроили небольшую революцию. Теперь, начиная с Delphi 2, имеются три фундаментальных строковых типа: ShortString, AnsiString, и WideString. Кроме того, тип String теперь стал логическим. Т.е., в зависимости от настройки соответствующего режима компилятора (режим больших строк), он приравнивается либо к типу ShortString (для совместимости со старыми программами), либо к типу AnsiString (по умолчанию). Управлять режимом, можно используя директиву компиляции <$LONGSTRINGS ON/OFF>(короткая форма <$H+/->) или из окна настроек проекта – вкладка «Compiler» -> галочка «Huge strings». Если режим включен, то String приравнивается к AnsiString, иначе String приравнивается ShortString. Из этого правила есть исключение: если в определении типа String указан максимальный размер строки, например String[25], то, вне зависимости от режима компилятора, этот тип будет приравнен к ShortString соответствующего размера.


Поскольку, как вы узнаете в дальнейшем, типы ShortString и AnsiString имеют принципиальное отличие в реализации, то я вообще не рекомендую пользоваться логическим типом String без указания размера, если Вы, конечно, не пишете программ под Delphi 1. Если же Вы все-таки используете тип String, то я настоятельно рекомендую прямо в коде Вашего модуля указывать директиву компиляции, устанавливающую подразумеваемый Вами режим работы компилятора. Особенно если Вы используете особенности реализации соответствующего строкового типа. Если этого не сделать, то однажды, когда Ваш код попадет в руки другого программиста, не будет никакой гарантии того, что его компилятор будет настроен, так же как и Ваш.

Поскольку по умолчанию, после установки Delphi, режим больших строк включен, большинство молодых программистов даже и не подозревают, что String может представлять что-то отличное от AnsiString. Поэтому, дальше в этой статье, любое упоминание типа String без указания размера, подразумевает, что он равен типу AnsiString, если не будет явно указано иное. Т.е., считается что настройка компилятора соответствует настройке по умолчанию.

Сразу же упомяну о различии между типами AnsiString и WideString. Эти типы имеют практически одинаковую реализацию, и отличаются лишь тем, что WideString используется для представления строк в кодировке UNICODE использующей 16-ти битное представление каждого символа (WideChar). Эта кодировка используется в тех случаях когда необходима возможность одновременного присутствия в одной строке символов из двух и более языков (помимо английского). Например, строк содержащих одновременно символы английского, русского и европейских языков. За эту возможность приходится платить – размер памяти, занимаемый такими строками в два раза больше размера, занимаемого обычными строками. Использование WideString встречается не часто, поэтому, я буду в основном рассказывать о строках типа AnsiString. Но, поскольку они имеют одинаковую реализацию, почти все сказанное относительно AnsiString будет действительно и для WideString, естественно с учетом разницы в размере каждого символа.

Тоже самое касается и разницы между pChar и pWideChar.

Строковый тип AnsiString, обычно используется для представления строк в кодировке ANSI, или других (например OEM) в которых для кодирования одного символа используется один байт (8 бит). Такой способ кодирования называется single-byte character set, или SBCS. Но, очень многие не знают о существовании еще одного способа кодирования многоязычных строк (помимо UNICODE) используемого в системах Windows и Linux. Этот способ называется multibyte character sets, или MBCS. При этом способе, некоторые символы представляются одним байтом, а некоторые, двумя и более. В отличие от UNICODE, строки, закодированные таким способом, требуют меньше памяти для своего хранения, но требуют более сложной обработки. Так вот, строковый тип AnsiString может использоваться для хранения таких строк. Я не буду подробно останавливаться на этом способе кодирования, поскольку он применяется крайне редко. Лично я, ни разу не встречал программ использующих данный способ кодирования.

Знатоки Delphi вероятно мне сразу напомнят еще и о типах pChar (pWideChar) и array [. ] of Char. Однако, я считаю, что это не совсем строковые типы, но я расскажу и о них, поскольку они очень часто используются в сочетании со строковыми типами.

Итак, приведу основные характеристики строковых типов:

Тип Максимальный размер строки Размер переменной Объем памяти, требуемый для хранения строки
String[n] где 0 0, поэтому то Delphi и не освобождает память, занятую строкой.

Еще, этот счётчик используется и для разрешения проблем, связанных со следующей ситуацией:

Здесь, как мы уже знаем, после выполнения оператора s2 := s1, обе переменные указывают на один и тот же экземпляр строки ‘abc123’. Однако, что же произойдёт когда выполниться оператор s2[1] := ‘X’? Казалось бы, в единственном имеющимся в нашем распоряжении экземпляре строки первая буква будет заменена на ‘X’. И как следствие, обе строки станут равными ‘Xbc123’. s1 то за что «страдает»? Но, к счастью это не так. Здесь на помощь Delphi вновь приходит счетчик ссылок. Delphi, при выполнении этого оператора понимает, что строка на которую указывает s2 будет изменена, а это может повлиять на других. Поэтому, перед изменением строки, проверяется ее счётчик ссылок. Обнаружив, что на нее ссылается более одной строковой переменной, делается следующее: создается копия этой строки со счётчиком ссылок равным 1, и адрес этой копии, присваивается s2; У исходного экземпляра строки, счетчик ссылок уменьшается на 1 – ведь s2 на неё теперь не ссылается. И лишь после этого, происходит изменение первой буквы, теперь уже собственного экземпляра строки. Т.е., по окончанию выполнения этого оператора, в памяти будут находиться две строки: ‘abc123’ и ‘Xbc123’. Причем, s1 будет ссылаться на первую, а s2 на вторую.

При работе со строками определенными как константы, алгоритм работы несколько отличается. Приведу пример:

Казалось бы, при завершении работы процедуры, экземпляр строки ‘Вася’ должен быть уничтожен. Но в данном случае это не так. Ведь, при следующем входе в процедуру, для выполнения присваивания нужно будет вновь где-то взять строку ‘Вася’. Для этого, ещё при компиляции, Delphi размещает экземпляр строки ‘Вася’ в области констант программы, где её даже невозможно изменить, по крайней мере, простыми методами. Но как же при завершении процедуры определить что строка ‘Вася’ – константная строка, и ее нельзя уничтожать? Все очень просто. Для константных строк, счётчик ссылок устанавливается равным -1. Это значение, «выключает» нормальный алгоритм работы со «счётчиком ссылок». Он не увеличивается при присваивании, и не уменьшается при уничтожении переменной. Однако, при попытке изменения переменной (помните s2[1]:=’X’), значение счётчика равное -1 будет всегда считаться признаком того, что на строку ссылается более одной переменной (ведь он не равен 1). Поэтому, в такой ситуации всегда будет создаваться уникальный экземпляр строки, естественно, без декремента счётчика ссылок старой. Это защитит от изменений экземпляр строки-константы.

К сожалению, этот алгоритм срабатывает не всегда. Но об этом, мы поговорим позже, при рассмотрении вопросов преобразования строковых типов.

Где же Delphi хранит «счётчик ссылок»? Причем, для каждой строки свой! Естественно, вместе с самой строкой. Вот что представляет собой эта область памяти, хранящая экземпляр строки ‘abc’:

Байты с 1 по 4 Счётчик ссылок равный -1
Байты с 5 по 8 Длина строки равная 3
Байт 9 Символ ‘a’
Байт 10 Символ ‘b’
Байт 11 Символ ‘c’
Байт 12 Символ с кодом 0 (#0)

Для удобства работы с такой структурой, когда строковой переменной присваивается ссылка на эту строку, в переменную заносится адрес не начала этой структуры, а адрес её девятого байта. Т.е. адрес начала реальной строки (прямо как pChar). Для того, что бы приблизиться к реальной жизни, перепишем приведённую структуру:

Смещение Размер Значение Назначение
-8 4 -1 Счётчик ссылок
-4 4 3 Длина строки
1 ‘a’
1 1 ‘b’
2 1 ‘c’
3 1 #0

С полем по смещению -8, нам уже должно быть все ясно. Это значение, хранящееся в двойном слове (4 байта), тот самый счетчик, который позволяет оптимизировать хранение одинаковых строк. Значение этого счетчика имеет тип Integer, т.е. может быть отрицательным. На самом деле, используется лишь одно отрицательное значение – «-1», и положительные значения. 0 не используется.

Теперь, обратите внимание на поле, лежащее по смещению -4. Это, четырёхбайтовое значение длинны строки (почти как в ShortString). Думаю, Вы заметили, что размер памяти выделенной под эту строку не имеет избыточности. Т.е. компилятор выделяет под строку минимально необходимое число байт памяти. Это конечно хорошо, но, при попытке «нарастить» строку: s1 := s1 + ‘d’, компилятору, точнее библиотеке времени исполнения (RTL) придется перераспределить память. Ведь теперь строке требуется больше памяти, аж на целый байт. Для перераспределения памяти нужно знать текущий размер строки. Вероятно, именно для того, что бы не приходилось каждый раз сканировать строку, определяя её размер, разработчики Delphi и включили поле длины, строки в эту структуру. Длина строки, хранится как значение Integer, отсюда и ограничение на максимальный размер таких строк – 2 Гбайт. Надеюсь, мы не скоро упрёмся в это ограничение. Кстати, именно потому, что память под эти строки выделяется динамически, они и получили ещё одно свое название: динамические строки.

Осталось рассказать ещё о нескольких особенностях переменных AnsiString. Важнейшей особенностью значений этого типа является возможность приведения их к типу Pointer. Это впрочем, естественно, ведь в «душе» они и есть указатели, как бы они этого не скрывали. Например, если описаны переменные: s :AnsiString и p :Pointer. То выполнение оператора p := Pointer(s) приведет к тому, что переменная p станет указывать на экземпляр строки. Однако, при этом, очень важно знать: счетчик ссылок этой строки не будет увеличен. Но об этом, мы поговорим чуть позднее.

Поскольку, переменные этого типа реально являются указателями, то для них и реально такое значение как Nil – указатель в «никуда». Это значение в переменной типа AnsiString по смыслу приравнивается пустой строке. Более того, чтобы не тратить память и время на ведение счётчика ссылок, и поля размера строки всегда равного 0, при присваивании пустой строке переменной этого типа, реально, присваивается значение Nil. Это не очевидно, поскольку обычно не заметно, но как мы увидим позже, очень важная особенность.

Вот теперь, кажется, Вы знаете о строках все. Настала пора переходить к более интересной части статьи – как с этим всем жить?

Преобразование строк из одного типа в другой

Здесь, все как обычно, и просто и сложно.

Преобразование между «настоящими» строковыми типами String[n], ShortString, и AnsiString выполняются легко, и прозрачно. Никаких явных действий делать не надо, Delphi все сделает за Вас. Надо лишь понимать, что в маленькое большое не влезает. Например:

В результате выполнения этого кода, в переменной s3 окажется строка ‘abc’, а не ‘abcdef’. С преобразованием из pChar в String[n], ShortString, и AnsiString, тоже всё очень не плохо. Просто присваивайте, и все будет нормально.

Сложности начинаются тогда, когда мы начинаем преобразовывать «настоящие» строковые типы в pChar. Непосредственное присваивание переменным типа pChar значений строк не допускается компилятором. На оператор p := s где p имеет тип pChar, а s :AnsiString, компилятор выдаст сообщение: «Incompatible types: ‘String’ and ‘PChar'» — несовместимые типы ‘String’ и ‘PChar’. Чтобы избежать такой ошибки, надо применять явное приведение типа: p := pChar(s). Так рекомендуют разработчики Delphi. В общем, они правы. Но, если вспомнить, как хранятся динамические строки — с нулем в конце, как и pChar. А еще и то, что к AnsiString применимо преобразование в тип Pointer. Станет очевидным, что всего, возможно целых три способа преобразования строки в pChar:

Все они, синтаксически правильны. И кажется, что все три указателя (p1, p2 и p3) будут в результате иметь одно и то же значение. Но это не так. Всё зависит от того, что находится в s. Если быть более точным, равно ли значение s пустой строке, или нет:

Чтобы Вы понимали причину такого явления, я опишу, как Delphi выполняет каждое из этих преобразований. В начале напомню, что переменные AnsiString представляющие пустые строки, реально имеют значение Nil. Так вот:

Для выполнения преобразования pChar(s), компилятор генерит вызов специальной внутренней функции @LstrToPChar. Эта функция проверяет – если строковая переменная имеет значение Nil, то вместо него, она возвращает указатель на реально размещенную в памяти пустую строку. Т.е. pChar(s) никогда не вернет указатель равный Nil.

Тут все просто, такое преобразование просто возвращает содержимое строковой переменной. Т.е. если она при пустой строке содержит Nil, то и результатом преобразования будет Nil. Если же строка не пуста, то результатом будет адрес экземпляра строки.

Здесь, все совсем по другому. Перед выполнением такого преобразования, компилятор вставляет код, обеспечивающий ситуацию, когда указатель, хранящийся в s, будет единственным указателем на экземпляр строки в памяти. В нашем примере, если строка не пуста, то будет создана копия исходной строки. Вот ее-то адрес и будет возвращен как результат такого преобразования. Но, если строка пуста, то результатом будет Nil, как и во втором случае.

Теперь, интересно отметить, что если в приведенном примере, преобразование p3 := @(s[1]) выполнить первым, то при не пустой строке в s, все указатели (p1, p2, и p3), будут равны. И содержать они будут адрес «персонального» экземпляра строки.

Вот, теперь, зная как выполняются те или иные преобразования, Вы сможете всегда выбрать подходящий способ. Для тех, кто ещё не «проникся» до конца этой проблемой, приведу пример. В нем, преобразование, рекомендуемое разработчиками, приводит к «странному» поведению программы:

вызывает ошибку доступа к памяти при выполнении строки, помеченной 1. Вот и приходится применять эту функцию.

Здесь, поскольку параметр передаётся по значению, при вызове будет создана локальная копия переменной (указателя) Msg. Об этом я ещё расскажу ниже. Эта переменная, при завершении процедуры будет уничтожаться, что приведёт к освобождению «персональной» копии экземпляра переданной и преобразованной строки.

Функции этой группы используются для сравнения строк. Результатом будет одно из значений:

>0 если S1 > S2
255 символов приходится платить.

Если же тебе достаточно и 255 символов, то используй ShortString, или String[n].

Есть еще одно, на мой взгляд, замечание. Если Вы обратили внимание на тип переменной Len в моем примере, то возможно у Вас возник вопрос: А почему LongInt, а не Integer? Жаль если у Вас вопрос не возник – либо вы все знаете, либо ничего :). Для остальных поясню: дело в том, что тип LongInt фундаментальный тип, размер которого (4 байта) не будет меняться в последующих версиях Delphi. А тип Integer, это универсальный тип, размерность которого может меняться от версии к версии. Например, для 64-разрядных компьютеров он наверняка «вырастет» до 8-ми байт (64 бита). Лично мне, хочется, что бы файлы данных записанные моей старой версией программы могли быть нормально прочитаны более поздними версиями, возможно скомпилированными уже под 64-разрядной OS.

Использование строк в записях

Проблема возникает тогда, когда одно поле (или несколько полей) имеют тип динамической строки. В этом случае, часто возникает проблема схожая с проблемой записи динамической строки в файл – не все данные лежат в записи, динамические строки представлены в ней лишь указателями. Решается проблема также как и с записью строк в файл. Жаль только что тогда нельзя будет оперировать (записать/прочитать) целиком всей записью. Строки придется обрабатывать особо. Можно сделать, например, так:

Обратите внимание на то, что перед записью в поток я делаю так, что бы в поле f3 попал указатель Nil. Если этого не сделать, то в поток попадет адрес текущего экземпляра динамической строки. При чтении, он будет прочитан в поле f3. Т.е. поле f3 станет указывать на какое-то место в памяти. При выполнении SetLength, поскольку Delphi сочтет что текущее значение f3 лежит по указанному адресу, будет попытка интерпретировать лежащую там информацию как динамическую строку. Если же в поток записать Nil, то SetLength, никуда лезть не будет – экземпляра-то нет.

Использование строк в качестве параметров и результатов функций размещенных в DLL.

Многие, наверное, пытались хоть раз написать собственную Dll. Если при этом Вы использовали соответствующего мастера Delphi, то наверняка видели комментарий который он вставляет в начало файла библиотеки:

Общий смысл этого эпоса в том, что если Ваша Dll экспортирует хотя бы одну процедуру или функцию с типом параметра соответствующим любой динамической строке (AnsiString например), или функцию, возвращающую результат такого типа. Вы должны обязательно и в Dll, и в использующей ее программе, первым модулем в списке импорта (uses) указать модуль ShareMem. И как следствие, поставлять со своей программой и Dll еще одну стандартную библиотеку BORLNDMM.DLL.

Вы не задумывались над вопросами: «Зачем все эти сложности?»; «Что будет если этого не сделать?» и «Можно ли этого избежать?»; «Если да, то как?» Если не задумывались, то самое время сделать это.

Попробуем разобраться что будет происходить с экземплярами динамических строк в следующем примере:

Сначала, при выполнении процедуры X, функция IntToStr(100) создаст экземпляр динамической строки ‘100’, и ее адрес будет помещен в переменную Str. Затем, адрес этой переменной будет передан процедуре Y. В ней, при выполнении оператора s := s+’$’, будет создан экземпляр новый строки ‘100$’, Экземпляр старой строки ‘100’ станет не нужным и память, выделенная для него при создании, будет освобождена. Кроме того, при завершении процедуры X, будет освобождена и память, выделенная для строки ‘100$’, так как перестанет существовать единственная ссылка на нее — переменная Str.

Всё вроде бы хорошо. Но до тех пор, пока обе процедуры располагаются в одном исполняемом модуле (EXE-файле). Если например поместить процедуру Y в Dll, а процедуру X оставить в EXE, то будет беда.

Дело в том, что выделением и освобождением памяти для экземпляров динамических строк занимается внутренний менеджер памяти Delphi-приложения. Использовать стандартный менеджер Windows очень накладно. Он слишком универсален, и потому медленный, а строки очень часто требуют перераспределения памяти. Вот разработчики Delphi и создали свой. Он ведет списки распределенной и свободной памяти своего приложения. Так вот, вся беда в том, что Dll будет использоваться свой менеджер памяти, а EXE свой. Друг о друге они ничего не знают. Поэтому, попытка освобождения блока памяти выделенного не своим менеджером приведёт к серьезному нарушению в его работе. Причем, это нарушение может проявиться далеко не сразу, и довольно необычным образом.

В нашем случае, память под строку ‘100’ будет выделена менеджером EXE-файла, а освобождаться она будет менеджером DLL. То же произойдет и с памятью под строку ‘100$’, только наоборот.

Для преодоления этой проблемы, разработчики Delphi создали библиотеку BORLNDMM.DLL. Она включает в себя еще один менеджер памяти :). Использование же модуля ShareMem, приводит к тому, что он заменяет встроенный в EXE (DLL) менеджер памяти на менеджер расположенный в BORLNDMM.DLL. Т.е., теперь и EXE-файл и DLL, будут использовать один, общий менеджер памяти.

Здесь важно отметить то, что если какой-либо из программных модулей (EXE или DLL) не будут иметь в списке импорта модуля ShareMem, то вся работа пойдет насмарку. Опять будут работать несколько менеджеров памяти. Опять будет бардак.

Можно обойтись и без внешнего менеджера памяти (BORLNDMM.DLL). Но для этого, надо например заменить встроенный в DLL менеджер памяти, на менеджер, встроенный в EXE. Такое возможно. Есть даже соответствующая реализация от Emil M. Santos, называемая FastShareMem. Найти ее можно на сайте http://www.codexterity.com. Она тоже требует обязательного указания ее модуля FastShareMem в списках используемых модулей EXE и DLL. Но, она по крайней мере не требует таскать за собой ни каких дополнительных DLL’лек.

Ну вот, наконец-то и все. Теперь, Вы знаете о строках почти столько же как я :).

Конечно, этим тема не исчерпывается. Например, я ничего не рассказал о мультибайтовых строках (MBCS) используемых для мультиязыковых приложений. Может и еще что-то забыл рассказать. Но, не расстраивайтесь. Я свои знания получал, изучая книги, тексты своих и чужих программ, код сгенерированный компилятором, и т.п. Т.е., все из открытых источников. Значит это все доступно и Вам. Главное, чтобы Вы были любознательными, и почаще задавали себе вопросы «Как?», «Почему?», «Зачем?». Тогда во всем сможете разобраться и сами.

Константы и переменные Delphi

Работа с Delphi. Константы и переменные.

Константы — это параметры (объекты) программы, которые не могут из­менять своё значение в ходе выполнения программы.

Как мы уже знаем, все числа являются числовыми константами. Из чисел, знаков операций, идентификаторов некоторых стандартных функций и круглых скобок можно составлять константные выражения:

Точно так же из любых символов мы можем составить символьные (один любой символ) и строковые константы (любое количество любых симво­лов, в том числе и ни одного). Такие константы заключаются в одинарные (не двойные!) кавычки:

’G’ ’R’ ’7’ ’Ж’ ’Э’ — символьные константы

’’ — пустая строка, в которой нет ни одного символа

’Delphi’ ’G’ ’Constant’ ’Строковая константа’ — строковые кон­станты

Строковые и символьные константы можно соединять знаком +:

’Delphi’ + ’ — ’ + ’ это наш выбор! ’

Значением этого выражения будет строка «Delphi- это наш выбор!»

’205’ ’14.007’ ’2 + 2’ — тоже строковые константы! Их значени­ями являются именно строки, а не числа, поэтому значение выражение ‘2 + 2’ вовсе не 4!

Если в строковой константе имеется одиночная кавычка, то её следует по­вторить дважды.

Кроме того, существуют логические константы True(соответствует зна­чению истина), False(ложь), а также константа nil (0, используется как значение указателей).

Такие явные константы и константные выражения можно использовать в любых операторах и для этого их не нужно объявлять.

Переменные — это параметры (объекты) программы, которые могут из­менять своё значение в ходе выполнения программы.

Физически переменная представляет собой область памяти (её размер за­висит от типа переменной; в этих ячейках памяти хранится значение пе­ременной), связанную с её идентификатором.

Как и все другие объекты программы, до первого использования перемен­ные должны быть объявлены. Переменные описываются в разделе объяв­ления переменных модуля или подпрограммы. Он начинается зарезерви­рованным словом var (от слова variable — переменная), за которым следуют объявления переменных.

При объявлении переменной указывается её имя, которое отделяется двоеточием от типа. Каждое объявление завершается точкой с запятой:

Илон Маск рекомендует:  mysql_connect - Открывает соединение с сервером MySQL
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL