Урок Delphi 4

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




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Данные в компьютере можно рассматривать как ячейки памяти, имеющие свои имена (идентификаторы). Все данные в программе на языке 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 или просто использовать непосредственно в выражениях.


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

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

'это текстовая строка'
Если текст должен содержать сам символ кавычки, то его надо повторить дважды:
'это '' - символ одиночной кавычки'
Строка может быть и пустой, не содержащей символов. Тогда она состоит из двух идущих друг за другом без пробела кавычек. Естественно, строка может состоять и только из одних пробелов.
   Самый популярный строковый тип - String. Строка типа String может содержать переменное количество символов объёмом до 2 Гбайт. Если нужно ограничить размер строки фиксированным значением, то после ключевого слова String в квадратных скобках указывается число, определяющее количество символов в строке: String[50]. Более полно работа со строками Delphi описывается далее.
   Одиночный символ имеет тип 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 (Ложь). При этом True > False.

   Теперь, используя компоненты, их свойства и события, вводя собственные переменные, можно конструировать программы, содержащие вычисления. Осталось узнать, как вычисленное значение вывести на экран.
Про консольные программы я здесь не говорю! А в нормальных оконных 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 использовались для наглядности. Можно обойтись одной строчкой:

   Label1.Caption:=IntToStr(StrToInt(Edit1.Text)+StrToInt(Edit2.Text));

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


Знакомство с событиями Delphi           В начало урока          Структурные типы данных 

Уроки Delphi начинающим



Вопросы и комментарии (120)      Решение задач в Delphi

Дмитрий, добавлено 2.10.09, 14:41:29 
Спасибо за ваши уроки, я сам школьник и хочу стать программистом, не то что бы профессия солидная просто интересно, о такой работе не пожалеешь.
dEpdribeKer, добавлено 12.11.09, 05:59:57 
Отличный сайт и материалы очень познавательные
Макс, добавлено 27.01.10, 02:44:58 
чет у меня не пашат :( может я что не так делаю ? повторил оперцию раз двадцать ни как, программа стартует а ,не чего не выводит.
Ольга, добавлено 29.01.10, 19:21:21 
Огромное спасибо за Ваш труд!
Макс, добавлено 31.01.10, 16:01:36 
Ура ! заработало!!! Спасибо огромное (присоединяюсь к словам Ольги)
Sayuri Sawatari, добавлено 21.05.10, 16:43:43 
ya tozh delayu kak nado i u menya pishet : Project Project1.exe raised exception class EConvert Error with message ''' is not a valid integer value'. Process stopped.
Sayuri Sawatari, добавлено 21.05.10, 16:44:28 
Chto delat'???
Автор, добавлено 21.05.10, 17:35:17 
Вы пытаетесь преобразовать пустую строку как целую величину. Вставьте что-нибудь в функцию преобразования.
Михаил, добавлено 24.07.10, 16:39:46 
Подскажите, пожалуйста, как сделать запись с вещественной переменной?
type
Real60 = 0..1124800395214848*1,0;
не получается записать, на запятую ругается
Автор, добавлено 24.07.10, 19:52:06 
Вообще, разделитель целой и дробной частей может быть как запятая, так и точка, зависит от настроек компьютера. В Delphi есть встроенная константа DecimalSeparator, принимающая соответствующее значение. Так что или просто используйте точку, или для универсальности - эту константу.
ru-admin, добавлено 4.09.10, 23:23:36 
фигня, даже 5% не сказали о типах данных
Автор, добавлено 5.09.10, 06:01:56 
Приведите, пожалуйста, формулу, по которой Вы вычисляли количество процентов...
А я привёл те типы данных, которые считаю основными. Конструирование других типов на их основе - в следующем уроке. Да и вообще для новичков, кому и предназначен сайт, полного описания не требуется. Сайт именно для начинающих, и я не ставлю цель запудрить им мозги на первых же шагах.
Сергей, добавлено 27.09.10, 08:37:07 
не чего не пойму зачем тут кнопка Button когда результат и так сразу выводиться на Label и пожалуйста у точните где это все прописывать надо по сле VAR form
Автор, добавлено 27.09.10, 09:01:49 
Это нужно вставлять в обработчик нажатия на кнопку. Без кнопки никак. Секцию var можно разместить после Form - тогда переменные будут глобальными, доступными на протяжении всего времени работы программы, а можно перед begin обработчика - тогда они будут локальными, доступными только внутри этого обработчика, и будут существовать только во время вычисления результата.
Андрей, добавлено 3.11.10, 21:40:22 
Скажите, пожалуйста, как ограничить количество знаков в дробной части числа? В Паскале можно было
в операторе вывода задать, например, n:0:3. т.е. три знака после запятой. Я вывожу данные в таблицу
компонента StringGrid.

Автор, добавлено 3.11.10, 22:35:38 
Нужно написать функцию, копирующую в результат только нужное количество знаков. В Уроке "Работа со строками" я привёл мой вариант.

Андрей, добавлено 6.11.10, 10:20:35 
Спасибо большое!
Автор, добавлено 6.11.10, 12:39:32 
Всегда пожалуйста, тёзка! ))
Евгений, добавлено 15.11.10, 13:30:04 
Скажите пожалуйста,как мне задать деление?
Например А разделить на В;
Пробовал := A/B; -выдает ошибку. Помогите пожалуйста!
Автор, добавлено 15.11.10, 15:10:26 
Напрасно вы не указали, какую именно ошибку.
Наверняка переменная, куда вы хотите записать результат - целого типа. А результат деления - всегда нецелый тип, даже если A=10 а B=5. Если вым необходимо таки, чтобы результат был точно целым, используйте функцию округления Round;
Евгений, добавлено 15.11.10, 15:48:24 
Спасибо! Я понял.
ильдар, добавлено 21.11.10, 19:26:22 
а где можно скачать Delphi?
Автор, добавлено 21.11.10, 20:02:46 
А где все всё качают? Например сайт tfile ru.
ильдар, добавлено 23.11.10, 20:17:15 
Delphi и Delphi7 отличаются?
Автор, добавлено 23.11.10, 20:52:25 
Delphi7 - нормальный вариант, в Delphi5 не было вкладки Indy, на которой компоненты для работы в интернете. Хотя любой пакет можно и отдельно установить.
Сергей, добавлено 8.12.10, 16:32:59 
как делить?
Label1.Caption:=IntToStr(StrToInt(Edit1.Text)/StrToInt(Edit2.Text)); не пашет
прочел где то что причина в том что ре3ультат деления real
ПС делаю кальк
Автор, добавлено 8.12.10, 16:39:22 
Ну всё правильно, любое деление, тип результата - Real. Соответственно, функция IntToStr не подходит, используйте FloatToStr. Длинный хвост после запятой обрубайте функцией, описанной на странице про работу со строками.
Никита, добавлено 3.01.11, 00:46:42 
Дмитрий я тоже школьник и хочу стать программистом
Егор, добавлено 10.01.11, 20:44:39 
Сайт отличный. Я хоть и чайник начинающий но со многим разобрался, вот только бы про масивы побольше. Очень прошу!!!

Автор, добавлено 10.01.11, 20:52:51 
Егор, читайте про массивы и другие типы данных в следующем уроке структурные типы данных.
Олег, добавлено 30.01.11, 16:47:53 
В общем интересно. Но один огромный минус - нет ПОЛНОЦЕННЫХ примеров в отладчике. Порой не понятно где и что пишется.
Автор, добавлено 30.01.11, 17:34:36 
Согласен, примеров мало, хочу это изменить тоже. Но что вы имеете в виду под словами "примеров в ОТЛАДЧИКЕ"? При чём тут отладчик???
Антон, добавлено 9.02.11, 21:00:14 
Где-то там выше говорлось про разделение целой части числа и дробной при помощи точки. Я написал программу, ссылающуюся на текст в Edit1 и если я ввожу там дробь через точку(.), то у меня выскакивает ошибка о числе с плавающей точкой. Если же я ввожу число через запятую (,), то все великолепно работает. Может я чего не так понял, но вы утверждали обратное.
Автор, добавлено 9.02.11, 22:23:35 
Антон, в общем случае символ, означающий разделение целой и дробной частей в числе, зависит от настроек Windows. Можно и точку и запятую выбрать. А поскольку на всех не угодишь, то приходится это учитывать в программе. Для такого учёта в Delphi введена константа DecimalSeparator типа Char, имеющая именно значение текущего разделителя. Поэтому необходимо проверять вводимые символы, и если вводятся такие символы как (Б б Ю ю , . < >), то программа должна их заменять на эту константу. Вот и не будет ошибок. На этом сайте об этом написано неоднократно. Например, статья по адресу /digit.php
макс добавлено 26.02.11, 12:38:08 
С этого урока уже не все понятно сразу.
Назия добавлено 16.04.11, 18:04:00 
Сайт отличный. Огромное спасибо.
Игорь добавлено 19.04.11, 17:50:55 
Отличный сайт!
Новичек, добавлено 22.04.11, 20:05:34 
Сделал все правильно но все равно выскакивает ошибка и красная строка показывает на VAR а у меня там все правильно прописано подскажите
с чем это связанно.
Автор, добавлено 22.04.11, 21:26:45 
Вот мне например отсюда не видно, что именно у вас, как вы утверждаете, правильно прописано. Привели бы исходник, в чём ошибка. А так, извините, я не телепат...
Димарик, добавлено 24.04.11, 13:40:11 
Автору вобще огромный респект) спасибо за такие отличные уроки, я в колледже делфи не понимал, у нас училка его на дом обучение дала, и спрашивала каждый раз много, а здесь все понятно написано. огромное спасибо)
Ленка, добавлено 13.05.11, 14:39:50 
Ура, подумала немного и получилось!!!)))
Олег, добавлено 27.05.11, 16:40:13 
Label1.Caption :=IntToStr(StrToInt(Edit1.Text+Edit2.Text) )-а почему нельзя написать вот так?, я попробовал но эффект другой, а можете объяснит почему?

Автор, добавлено 27.05.11, 17:38:29 
Если сложить Edit1.Text (например там "4") и Edit2.Text (например там "5"): Edit1.Text+Edit2.Text, то получится не 9, а 45. Почему?
Потому что если сложить Edit1.Text (например там "A") и Edit2.Text (например там "B"), то получится "AB".
Потому что если сложить Edit1.Text (например там "хочу") и Edit2.Text (например там "миллион"), то получится "хочумиллион" - и даже без пробела.
Чтобы складывались числа, нужно сначала текст в число перевести.
Аноним, добавлено 10.06.11, 22:22:01 
Автор, скажи пожалуйста для чего здесь
Label1.Caption:=IntToStr(StrToInt(Edit1.Text)+StrToInt(Edit2.Text));
нужен IntToStr ?

Автор, добавлено 10.06.11, 22:34:32 
Как говорится, статью-то читать не пробовали?
Аноним, добавлено 10.06.11, 22:37:33 
Нуу я так то раз 10 прочитал... но всё равно не понел =(
Автор, добавлено 11.06.11, 02:43:21 
Несколько раз указано, что Caption имеет тип String, а сумма в скобках - по определению число, вот и переводим оператором IntToStr целое число в строку.
Аноним, добавлено 11.06.11, 09:40:50 
ясно... теперь понел) просто я подумал что IntToStr относится только к Edid1 а не ко всей сумме в скобках =) спс
Азат, добавлено 23.06.11, 09:54:56 
Спасибо! Вначале не получалось потом долго писал запоминал и искал ошибки и всё получилось прикольно я сделал мини сложитель)
Михаил, добавлено 24.06.11, 15:15:37 
спасибо)))
Валя-Валенок, добавлено 15.08.11, 16:04:39 
Огромное вам спасибо за столь подробный урок. И отдельное спасибо, что не расписали куда и что вставлять, лично мне это дало возможность во всём разобраться почти что самому. Так и должен поступать настоящий учитель: направить ученика в нужном направлении, чтобы в итоге он сам дошёл до желанной цели.Браво!
лена, добавлено 17.08.11, 19:46:14 
в этом уроке показаны основыне и часто используемые типы данных. внесите ясность, пожалуйста: какие из типов (отдельно для вещественных и для целых) являются самыми большими?
Илья, добавлено 27.10.11, 22:40:27 
ужасный урок.
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 ;
Так же вызовет ошибку, потому что не ОБЬЯСНЕНО ГДЕ ИМЕННО ЭТО ПИСАТЬ. В форме предыдущего примера туева куча строк. Вы действительно думаете что начинающему дельфисту будет ясно куда вставлять этот кусок кода?? Если да, то тогда такому читателю нечего было бы здесь делать, а если это всё же и вправду мануал для новичков, то он написан ужасно. Вместо обьяснения пошагового освоения дельфи, начинаете с сложных элементов вроде окон и кнопок, и переходите к частным случаям основ. вобщем хреновый урок
Автор, добавлено 28.10.11, 06:02:38 
Во, по настоящему конструктивный комментарий! Спасибо за замечание. Хотя поначалу мне и непонятно было, почему Форму и кнопки вы называете сложными элементами. Если вы такой уж новый новичок, то вам и вправду здесь делать нечего - ступайте на первый урок Delphi!

А если серьёзно, то если начинать с первого урока, то уже неоднократно показано, что после щелчка по кнопке на Форме попадаешь в редактор кода и просто пишешь именно в том место, где курсор оказался - и ничего никуда вставлять не надо. А предыдущий пример вообще не предназначен для исполнения - просто показано, что данные необходимо преобразовывать. Короче, и мозги пока никто тоже не отменял.

Тем не менее, посмотрю, можно ли что-то изменить.
Кирилл, добавлено 21.11.11, 11:50:40 
И в правду куда вставлять этот кусок? (начинал с 1 урока)
Автор, добавлено 21.11.11, 13:18:38 
Вот это:

procedure TForm1.Button1Click(Sender: TObject);
begin

end;

генерирует сама Delphi при двойном щелчке по кнопке на Форме. А это

var A, B, C: Integer;

тогда вставляется между procedure и begin (блин, неужели не видно???)

А это

A := Edit1.Text;
B := Edit2.Text;
C := A+B;
Label1.Caption := IntToStr(C);

между begin и end. И слова "начало кода" и "конец кода" показывают что именно именно вам нужно написать. Не принимаю упрёков в непонятности написанного. Просто нужно не просто читать, а делать. Тогда и эти вопросы сами отпадут.


Дмитрий, добавлено 4.12.11, 17:21:49 
Как сделать так чтобы в строку Edit можно было ввести значение типа real к примеру число равное 0.1
Автор, добавлено 4.12.11, 17:51:07 
У меня есть статья В Edit только числа. Там всё описано.

Видимо, вопрос в запятой или точке, которые могут неправильно интерпретироваться. Просто нужно менять символы '.' или ',' на встроенную в Delphi константу DecimalSeparator - разделитель целой и дробной частей. Делайте это в обработчике OnKeyPress:

if ((Key=',')or(Key='.')) then Key:=DecimalSeparator;

Но могут быть вместо точки или запятой быть введены и другие символы (Б, Ю, <, >, ? и другие). В вышеназванной статье проверка на это сделана получше, через множества.
Антон, добавлено 5.12.11, 19:16:11 
Скажите, почему, когда я пытаюсь объявить переменную ''c'' типа real, выдает ошибку: illegal character in input file: 'c'($F1)
Антон, добавлено 5.12.11, 19:17:53 
Извиняюсь тип переменной не real, она относится к двумерному массиву array[1..3, 1..4] of real.
Автор, добавлено 5.12.11, 19:43:02 
Трудно сказать не видя исходника. Ясно только что массив неправильно объявили. Давайте сюда ваше объявление этой переменной.
Антон, добавлено 5.12.11, 20:29:43 
type matrix = array[1..3, 1..4] of real;
var a, b, с, d, e, f : matrix;
Самое интересное ни на одну из остальных переменных он не ругнулся, только на с.
Автор, добавлено 5.12.11, 20:45:32 
Даже смешно! У вас 'с' русская!
Антон, добавлено 5.12.11, 21:01:20 
Блин!!!!!! И правда, у меня стоит программа-автопереводчик раскладки, вот и перевела ХDDD.
Илья, добавлено 2.01.12, 20:49:04 
подскажите плиз, как считать цифры с изображения? в частности в одной игре есть координаты местонахождения персонажа (при движении меняются, но всегда в одном месте экрана написаны). Как мне считывать эти цифры?
п.с. Вроде есть же боты которые коды от ботов на сайтах обходят (считывают изображение), а тут и цифры то вполне читаемые (не то что на этих "защитах от ботов")
Автор, добавлено 3.01.12, 06:24:39 
Это просто! Подключите программу распознавания текста типа файнридера, или свою напишите.
Я, добавлено 18.01.12, 22:39:13 
Автору огромное спасибо за проделанную работу!! Все четко, правильно, а главное доступно! Желаю успехов в деле!!
Читала коменты, боже.. если вы не можете норм прочитать работу и понять, программирование это далеко не ваше...не позорьтесь
Михаил, добавлено 28.02.12, 21:58:39 
Спасибо за уроки!
Только не могу разобраться, делфи не на что не ругается, но после ввода данных в edit4 и edit5 при нажатии Button2 - в Label3 ответ не появляется, а в варианте A+B=C всё работает

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c : integer;
begin
a:= StrToInt(Edit2.Text);
b:= StrToInt(Edit3.Text);
c:= a+b;
Label2.Caption:= inttostr (c);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Label3.Caption:=inttostr(strtoint(edit4.Text)+strtoint(edit5.Text));
end;
Автор, добавлено 29.02.12, 06:21:39 
Скопировал ваши процедуры. Всё работает. Может, у вас Label3 так расположена, что её не видно? Или размер равен нулю? Удалите, и расставьте компоненты заново.
Михаил, добавлено 29.02.12, 11:29:59 
На работе написал всё заново - работает, вечером дома проверю. Спасибо!
Школьник, добавлено 22.03.12, 22:21:43 
как перемножить два динамических массива ?
Автор, добавлено 22.03.12, 22:31:45 
В математике это называется матрицы. Вам что, нужен алгоритм перемножения матриц?
Школьник, добавлено 22.03.12, 22:51:57 
да,Если можно...
Автор, добавлено 23.03.12, 05:25:16 
Если вы сами ничего не сделали, то обратитесь по ссылке "Решение задач". Я попробую.
Александр , добавлено 26.04.12, 14:42:19 
А можно вопрос ради интересса? А как сделать через буквы, просто на строчке С= В+С ошибка
Автор, добавлено 26.04.12, 16:34:49 
А где это у меня такая строчка? Пожалуйста, скопируйте сюда участок текста с этой строчкой, а то я не могу найти...
Александр, добавлено 26.04.12, 19:17:33 
извините писал с телефона, не увидел что неправильно. уже разобрался во всем. большое спасибо за то что вы делаете! интересно, а вы сейчас продолжаете писать новые статьи?

Автор, добавлено 26.04.12, 21:04:15 
Да, потихоньку. Для новичков уже мало что требуется, а в дебри влезать - только запутать.
Екатерина, добавлено 10.05.12, 18:46:49 
Подскажите пожалуйста, как уменьшить количество знаков после запятой в рассчётах
Автор, добавлено 11.05.12, 00:23:30 
На странице "Работа со строками" дана функция, выводящая заданное количество цифр после запятой.
Андрей, добавлено 12.05.12, 21:38:32 
Доброе время суток! помогите, пишу программу хотя я новичок в этом, при сравнении вводимого числа (число 0,45lt;a>0,5)при ошибочном вводе выскакивает сообщение, но когда я ввожу число меньше 0,45 все работает,как надо.А когда больше 0,5 сообщения нет об этом,но выскакивает сообщение, что число меньше(0,45),хотя при этом ввожу числа от 0,5 до 0,99, но когда число больше 1, все работает,не могу понять почему так происходит.помогите в этом разобраться. СПАСИБО!!!
procedure TForm1.Button1Click(Sender: TObject);
begin
 if edit1.Textshowmessage('число меньше 0,45');
edit1.Clear;
edit1.SetFocus;
end;
if edit1.Text>label2.Caption then begin
showmessage('ЧИСЛО БОЛЬШЕ 0,5');
edit1.SetFocus;
end;
end;
end.
Автор, добавлено 12.05.12, 21:44:04 
Нельзя сравнивать строки как числа!!! Да, сравнение не выдаст что это ошибка, но сравнение строк происходит по другим, не математическим правилам, а по правилам алфавита. Не будем вдаваться, а просто воспользуйтесь переводом строк в числа. Пример: StrToFloat('3.14')=3.14;
Андрей, добавлено 12.05.12, 22:02:15 
все равно не работает,
даже если пишу
if strtofloat(edit1.text)<'0.45' then begin
showmessage('');
end;
if strtofloat(edit1.text)>'0.45';
showmessage('');
end;
все равно сообщение выскакивает о том, что число больше числа 0,5 тогда. когда вводишь число, например: 0,51 и т.д. , по логике должно ведь выскакивать при вводе всех чисел которые больше 0,5,а при вводе целого числа все работает, при вводе чисел от 0,1 до 0,45.
Автор, добавлено 12.05.12, 22:12:21 
Вы опять сравниваете strtofloat(edit1.text) - это число, с '0.45' - это текст. Кавычек не нужно:

if strtofloat(edit1.text)<0.45 then
Андрей, добавлено 12.05.12, 22:31:04 
спасибо вам большое за ваши труды!!!
Андрей, добавлено 13.05.12, 10:46:51 
Огромное спасибо за урок!Программа работает.
Аноним, добавлено 28.05.12, 13:36:08 
Здравствуйте)))поскажите плиз как мне поступит....мне нужно чтобы если я ввела в Edit1 номер телефона (например код казани и номер телефона) и нажала на кнопку то у меня вышло сообщение что это номер казани, а если ввела не казанский код то никакого сообщения нет.

Автор, добавлено 28.05.12, 14:23:53 
Это делается так. Сначала определяется как должен выглядеть номер. Вот например так:

(+7)_843_хх_хх_хх

 Или так:

+7(843)хх_хх_хх

"х" я обозначил любые числа, а _ (подчёркивание) пробел.

Или ещё по-другому. Это должен определить программист, и контролировать ввод, а то пользователь такого навводит, что невозможно будет выделить код из общего текста.
Далее, смотрим позицию, на которой находится последовательность _843_ или (843). В первом случае это 5, во втором - 3 (посчитайте сами!) Обозначим нужную последовательность буквой S, а позицию числом N.

И пишем

if pos(S, Edit1.Text)=N
  then ShowMessage('Это казанский номер');

Вот как-то так.
Аноним, добавлено 28.05.12, 14:47:47 
procedure TForm1.BitBtn1Click(Sender: TObject);
var s,n:integer;
begin
s:=843;
n:=1;
if pos(S, Edit1.Text)=n
  then ShowMessage('Это казанский номер');
end;

Написала так и вышла ошибка


[Ошибка] Unit1.pas(33): Incompatible types
Автор, добавлено 28.05.12, 14:55:56 
Нужно
S:='843';

То есть в кавычках.
Автор, добавлено 28.05.12, 14:56:55 
О, да у вас S как Integer, а нужно String.
Аноним, добавлено 28.05.12, 14:59:19 
Уии!!!!работает!!!!!))))а что если использовать MaskEdit?
Аноним, добавлено 28.05.12, 15:00:34 
(___)___-____
Автор, добавлено 28.05.12, 15:19:36 
Именно про это я уже написал. Измените имя компонента на Edit1 - и вообще менять ничего не придётся.
Новичок, добавлено 21.07.12, 13:07:22 
Здравствуйте!
Хочу для практики попробовать написать калькулятор. Столкнулся с такой проблемой:
не получается в label одновременно отобразить то, что введено в edit и знак действия, соответствующий нажатой кнопке.
Автор, добавлено 21.07.12, 17:07:16 
Почему? Что и как вы делаете?
Новичок, добавлено 21.07.12, 19:18:00 
я пытался сделать это вот так:
в события кнопки на onClick писал
label1.Caption:=(strtoint(edit1.Text), '+'); //для знака сложения

и ещё пара вопросов: я так понимаю, что слагаемые нужно помещать в специальные контейнеры, в которых они будут хранится, до завершения операции (нажатия кнопки "равно") как это можно сделать; второе - после того как я нажимаю кнопку соответствующую знаку действия, в label должно отображаться первое число и знак действия, а в edit должно быть пусто - возможно ли такое или есть какой-нибудь другой способ?
Автор, добавлено 21.07.12, 21:11:15 
Вы пишете:

label1.Caption:=(strtoint(edit1.Text), '+');

Это вообще не пойми что написано, если, конечно, у вас это не описка. Нужно так:

Label1.Caption:=Edit1.Text+'+';

А если нужно, чтобы эдит стёрся, то добавить

Edit1.Text:='';

Но перед стиранием нужно сохранить значение в контейнер, некую переменную:

X1:=StrToFloat(Edit1.Text);

Автор, добавлено 21.07.12, 21:40:46 
Если вы хотите для практики что-то сделать самостоятельно, а я вдруг напишу пару процедур, решающих данную задачу, я наверное окажу медвежью услугу...

Но подсказка. Если вы жмёте например на +, что должна делать программа, а вдруг ранее уже была введена операция? Программа должна выполнить эту операцию, и перейти к той, что вы только что ввели, то есть только что подсчитанный результат будет первым операндом, следующая операция - сложение, и ждём второй операнд, который вводится в эдит.

То есть кроме контейнера для результата нужно ввести контейнер для символа ранее введённой операции.

В общем, ничего не сможете - пишите.
Тимур, добавлено 10.09.12, 20:21:41 
Огромное спасибо автору!
Леонид, добавлено 27.09.12, 22:19:35 
С еттоого урока я ничево нипонял вовшею
Леонид, добавлено 27.09.12, 22:44:10 
С етоого урока я ничево нипонял что нужно вводить после слова integer.Я вовще ни чево не смог сделать.
Леонид, добавлено 27.09.12, 22:47:56 
А не спасибо разобрался всё работает.

Антон, добавлено 19.04.13, 21:18:25 
procedure TForm1.Button1Click(Sender: TObject);
Почему у меня ошибка?(
Я не очень понял этот урок(((
Автор, добавлено 19.04.13, 21:59:23 
У вас кнопка как называется? Свойство Name посмотрите. У меня Button1, как ваша система её обозвала?
Павел, добавлено 23.05.13, 18:19:05 
Здравствуйте, никак не могу разобраться - Выручайте:
procedure TForm1.FormCreate(Sender: TObject);
var a:real;
begin
a:=strtofloat('1,1');
label1.Caption:=floattostr(strtofloat('1,1')-a);
end;

Результат: -8,87961579265628E-17
Почему не 0?
Автор, добавлено 23.05.13, 18:32:10 
Потому что 0 - это целое число, в природе отсутствующее. А вы объявили a: Real, ну и получите... что-то реальное. А вообще, конечно, странно. Но такова уж система.
Саня, добавлено 28.05.13, 04:28:48 
А можно вот тут:

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

  Label1.Caption:=IntToStr(StrToInt(Edit1.Text)+StrToInt(Edit2.Text)); ..."

пояснить(для тугодумов)))) что "происходит" в скобках - понятно что это - "перевращения" string в integer - и обратно - но то что вот тут "...IntToStr(StrToInt(Edit1.Text)+StrToInt(Edit2.Text))..." эти самые "преврвщения" используются в скобках как части математического примера - вызывает когнитивный диссонанс поначалу - так как не ожидаешь что "переформатирования" будут перемножаться на свойства))) Сейчас то до меня дошло почему одно "переформатирование" - умножается на скобку - в которой в свою очередь складываются свойства подвергшиеся другому "переформатированию" - но когда не дошло - в начале т.е - заставило об это место "споткнуться". Может для новичков стоит пояснить что в этом месте с скобках происходит?))). За сайт ещё раз выражаю благодарность))).
Автор, добавлено 28.05.13, 07:19:10 
Саня, другого способа нет освоить что-либо - только самому разбираться. Возможно, это и есть минимальный "порог" для входа в тему, самому понять азы. Смог - входи...

Читал как-то фантастику про школу телепатов. Сидят в приёмной кандидаты и ждут, пока их вызовут. А в это время секретарша им телепатирует:"все кто меня слышит - могут зайти". Порог, отбор способных.
Олег, добавлено 13.08.13, 13:34:09 
Спасибо большое! Все получилось быстро и эффективно!
Вовка, добавлено 19.08.13, 15:42:22 
Автор, Андрей, все коменты просмотрел, темы проглядел, но так и не понял, как сделать, чтобы у меня умножались данные из edit1 на дробное число. ошибки выдает. пробовал два едит2 значения перемножить, ввел дробное -вывело ошибку
Вовка, добавлено 19.08.13, 16:18:21 
пишет is not a valid integer value
Автор, добавлено 19.08.13, 16:29:12 
Для дробных чисел применяется другая функция преобразования, не StrToInt, а StrToFloat:

var X, A, B: Real;
begin
A:=StrToFloat(Edit1.Text);
B:=StrToFloat(Edit2.Text);
X:=A*B;
Edit3.Text:=FloatToStr(X);
end;
Вовка, добавлено 19.08.13, 16:41:49 
Огромное тебе спасибо! я вчера начал изучать делфи по твоим урокам, сегодня все утро бился, как на дробь умножить.
Вовка, добавлено 19.08.13, 17:06:11 
я переделал ваш кусочек, сделал вот так.спасибо. значит мне надо осваивать функции преобразования...

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=FloatToStr(StrToFloat(Edit2.Text)*StrToFloat(Edit1.Text));
end;
end.

Автор, добавлено 19.08.13, 18:14:41 
Поздравляю! Функции преобразования и работы со строками смотри здесь.
Дмитрий , добавлено 30.09.13, 08:11:02 
Большое спасибо за ваш сайт, очень познавательно и доступно написано)))))
Павел, добавлено 17.11.13, 02:03:00 
Здравствуйте!
Меня давно интересовал вопрос, можно ли как-то проверить, установлено что-либо в ячейке динамического массива или нет?

var Arr: array of Integer;
c: integer;
begin
  c:=7;
  SetLength(Arr,c);
  Arr[0]:=1;
  Arr[2]:=1;
  Arr[3]:=1;
  Arr[5]:=1;
  Arr[6]:=1;
end;

В данном примере заполнены элементы только с индексами 0,2,3,5,6.
Можно ли как-то определить без ошибок, заполнена ли ячейка?
try ... except ... end не предлагать. :)

Спасибо.
Павел, добавлено 17.11.13, 02:04:57 
Хотелось бы что-нить типа такого:

if Arr[1]<>nil then Memo1.Lines.Add('Есть значение')
else Memo1.Lines.Add('Значение отсутствует');

Но данный пример не работает. :(
Автор, добавлено 17.11.13, 06:41:44 
Павел, динамический массив создаётся с нулевыми начальными значениями. Да и в общем случае, при создании переменной она может содержать совершенно случайное значение. То есть вы не сможете определить, занесли вы туда 0 (или что-то ещё) или он там был изначально. Единственный вариант - следить за этим программно. Например, создать ещё один сигнальный массив логического типа, и если элемент основного массива меняется, то и соответствующий элемент сигнального массива меняется с False на True. Потом проверяете сигнальный элемент, и всё понятно, менялся элемент основного массива, или нет.
Оставить комментарий:

Имя  

Текст комментария

  





Интернет-магазин электрооборудования