Spinedit delphi где находится
Перейти к содержимому

Spinedit delphi где находится

  • автор:

SpinEdit. Самозванец с плавающей запятой

SpinEdit Imposter

SpinEdit с плавающей запятой нужен, порой, как воздух. Но стандартный SpinEdit оперирует только целочисленными значениями. Поэтому для вещественных значений, либо пишется имитатор в связке Edit + UpDown, либо используется JvSpinEdit, либо cxSpinEdit, либо аналогичное. Хотя, стандартный SpinEdit отлично подходит для этих целей.

Предисловие

Delphi — удивительно продуманная среда. Механизм компонентов — просто шедевр инженерной мысли. Создание, установка и использование компонент — поразительно прост. Из-за этого компонент развелось немыслимое количество. Качество в 90 % случаев оставляет желать лучшего. Монстры на этом рынке стали безразмерно дороги и бесконечно объемны.

Мне периодически нужны разные «усовершенствования» стандартных компонент. Например, SpinEdit с плавающей запятой. Ради этого ставить Developer Express? Пугать заказчика ценником? Хотя, там дел на копейку.

Писать свои компоненты, дело приятное, но бессмысленное. Компонент, засоряющий собой палитру, имеет ряд неприятных свойств:

  • он быстро устаревает;
  • он оказывается всегда недоделанным;
  • изменения ради одного проекта, могут негативно сказаться на других проектах.

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

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

Когда-то описал на habr’е метод «воровства личности» у стандартного Memo с целью сделать у него вертикальное выравнивание и TextHint. Если вкратце, то суть в том, что копирую свойства у стандартного, созданного в дизайне Memo, уничтожаю и заменяю его своим компонентом. В коде все обращения к этому Мemo остаются без изменения, но это уже не TMemo. Это — самозванец, прикинувшийся TMemo.

В последствии, метод стал частью «философии такеров». Классы, которые отбирают свойства у компонентов, созданных в дизайне, и могут даже заменить их, назвал «такерами». Это — не обязательно компонент, но сейчас речь пойдет именно о компоненте, который не регистрируется в палитре, не придерживается правил хорошего тона. Он реализует ряд отсутствующих у оригинала свойств и необходимый для проекта функционал. Это ни в коем случае не helper, это полноценный класс, со своими внутренними полями и методами.

Конечная цель

В итоге хочется получить возможность манипулировать вещественными числами в стандартном SpinEdit. Также, неплохо было бы иметь горизонтальное и вертикальное выравнивание. И текстовую подсказку TextHint.

Что не так с выравниванием. Вы замечали, что численные значения принято выравнивать по правому краю? Стандартный SpinEdit так не умеет, выравнивает по левому. Если задать высоту побольше, значение будет прилеплено к верхнему краю, а это выглядит некрасиво. Хочется выравнивать как минимум по центру.

Зачем нужна текстовая подсказка. Если удалить значение из SpinEdit, то поле ввода останется пустым. Тут надо показывать либо актуальное значение, либо текстовую подсказку. Для такого случая нужно предусмотреть в свойствах значение по умолчанию. Как раз на случай пустой строки.

Для вещественных значений не помешает строка формата. Потому что результат функции FloatToStr может выдать такой хоровод цифр после запятой, что значимая часть числа просто не вместится в поле ввода. А также, формат необходим, чтобы избежать дерганий при правостороннем выравнивании. Число может быть сейчас 1.5, в следующий раз 1.501. Так вот, чтобы значение выводилось ровно, и запятая всегда была на одном месте, имеет смысл указать формат ###,##0.000. В этом случае всегда имеем три знака после запятой и комфортный вывод.

Итак, надо сделать свойства MinValue, MaxValue, Value и Increment вещественными, типа Extended. Добавить в список свойств значение по умолчанию, строку формата, горизонтальное и вертикальное выравнивание.

Было бы очень хорошо, если подобной операции превращения в «вещественный» SpinEdit можно было подвергнуть Edit и другие компоненты. Потому что Edit часто используется как альтернатива SpinEdit’у для ввода чисел с плавающей запятой.

Наследник SpinEdit

Чтобы в run-time компонент стал другим, существует всем известный прием. Назвать новый компонент также, как существующий. Тогда в дизайне оперируем со стандартным, назначаем свойства, работаем с географией расположения, обрабатываем свойства. А в run-time создается уже наш компонент.

Если «наш» компонент написан аккуратно, то способ вполне рабочий. Единственная неприятность — не забыть поставить в предложении uses модуль с реализацией «нашего» класса ПОСЛЕ модуля с оригинальным компонентом. Компилятор возьмет последнее описание и создаст уже «наш» компонент вместо стандартного.

Так вот, мы так делать не будем. Мы пишем честного самозванца. Поэтому класс будет называться TIPSpinEdit. И порожден он будет от стандартного TSpinEdit. Потому что если пишем новый класс, то и называться он будет как новый класс. В этом случае становится глубоко фиолетово на каком месте он стоит в предложении uses. Например, блок interface модуля главной формы из примеров выглядит так:

Справочник по компонентам Delphi. Часть 2
Страница 23. Компонент TSpinEdit

Этот компонент представляет собой комбинацию обычного редактирующего элемента и кнопки со стрелками вверх и вниз (TSpinButton). Такие элементы управления стали практически повсеместными для редактирования числовых величин. При большом изменении величины удобней набрать ее в редакторе заново, а в случае небольшого — скорректировать несколькими нажатиями стрелок. Свойства компонента приведены в таблице:

(Ro) property Button: TSpinButton;

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

(Pb) property EditorEnabled: Boolean;

В состоянии False запрещает изменение значений в редакторе.

(Pb) property Readonly: Boolean;

В состоянии False полностью запрещает изменение значений (при помощи кнопок и редактора).

(Pb) property MinValue: Longint;

Содержит минимальное допустимое значение.

(pb) property MaxValue: Longint;

Содержит максимальное допустимое значение.

(Pb) property MaxLength: Integer;

Содержит значение максимального количества символов (цифр, знаков '-' и '+')в редакторе.

(fb) property Increment: Longint;

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

(Pb) property Value: Longint;

Содержит текущее значение.

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

(РЕ) property OnDblClick: TNotifyEvent;

Если щелчок произошел над областью кнопки, то возникают специфические для нее события OnUpClick или OnDownClick, а в самом компоненте только отражается произошедшее изменение:

Событие OnChange возникает также при редактировании текста (если оно не запрещено). Если нажать и не отпускать одну из кнопок, то в это время соответствующие события происходят периодически (период 400 мс).

В эту группу входят только три компонента — TDrawGrid, TStringGrid и TOutline. Это, если можно так выразиться, элементы управления "второго поколения" — они решают гораздо более сложные задачи, чем традиционный набор средств Windows, но при этом и устроены намного сложнее.

Spinedit delphi где находится

Основы алгоритмизации и программирования — Учебное пособие (Струков В.М.)

3. простейший ввод/вывод данных

Надо сказать, что ввод данных с клавиатуры и вывод данных на экран дисплея в Delphi существенно отличается от того, как это делалось в Turbo Pascal. Это связано с тем, что стандартные встроенные средства Turbo Pascal (операторы Read, Write) предназначены для работы в интерфейсе командной строки. Приложения же, разрабатываемые в среде Delphi, предназначены для работы в среде Windows, т. е. в диалоговом оконном пользовательском интерфейсе. А в этом случае операторы Read и Write уже не используются. Здесь используются именно диалоговые средства оконного типа, на описании которых мы и остановимся ниже.

3.1.Простейший ввод данных

Простейший ввод данных в Delphi (ввод скалярных значений) можно осуществлять, по меньшей мере, четырьмя способами:

С помощью функции InputBox (невизуальным способом);

С помощью визуального компонента Edit;

С помощью визуального компонента SpinEdit;

Простейший ввод данных с помощью функции InputBox

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

где: <имя_пер.> — имя переменной типа string, в которую будет занесено введенное значение;

<заголовок> — заголовок окна, расположенный в верхней его строке;

<подсказка> — текст, который выводится над строкой ввода данных;

<значение> — это текст, который появляется в строке ввода в момент его появления на экране.

Функция InputBox возвращает значение типа string.

s:=InputBox(‘Ввод данных’,’Введите число’,’’);

Сразу после обращения к функции InputBox на экране появляется окно следующего вида:

После того как в поле ввода будет введено число, нужно щелкнуть одну из кнопок – Ok или Cancel. При нажатии кнопки Ok в переменную s будет занесено введенное в поле ввода значение. Если же будет нажата кнопка Cancel, то ей будет присвоено значение параметра <значение>.

ЗАМЕЧАНИЕ 1. Функция InputBox возвращает строковое значение, поэтому в том случае, когда вводится число, непосредственно использовать ее в арифметических выражениях нельзя. Предварительно нужно преобразовать введенное число из строкового представления в числовое .С этой целью можно воспользоваться одной из функций преобразования — StrToInt или StrToFloat, например:

k:= StrToInt(InputBox(‘Ввод данных’,’Введите число’,’’));

ЗАМЕЧАНИЕ 2. Функция InputBox не является компонентом и ее окно нельзя разместить на форме так, как это делается с визуальными компонентами. Ее активизация осуществляется только путем вызова как это сделано в предыдущем примере.

Простейший ввод данных с помощью компонента Edit

Для реализации этого способа используется визуальный компонент Edit — из палитры Standard.

Компонент Edit предназначена для ввода текстовой или числовой информации, которая может помещаться в одну строку, и по сути представляет собой однострочный редактор. В строке ввода с текстом можно выполнять все простейшие операции редактирования текста: выделение, удаление, копирование. Для их выполнения в классе TEdit имеются соответствующие методы.

Основными свойствами этого компонента являются:

AutoSize:Boolean — предназначается для автоматического формиро-вания размеров компонента по его содержимому;

ParentFont, ParentColor:Boolean — для включения механизма наследования соответствующего признака от родительских объектов;

MaxLength:integer — определяет максимальную длину текстовой строки. Если равно 0, то длина строки не ограничена;

Text:string – в этом свойстве в виде текста содержится отображаемое в поле ввода значение.

Информация, вводимая пользователем в окне ввода компонента Edit, записывается в переменную, которая соответствует свойству Text. Значение этого свойства можно сформировать на этапе визуального конструирования с помощью инспектора объектов либо во время выполнения программы. Во втором случае (для получения данных из диалогового окна Edit) в тексте программы – обработчика какого либо события можно использовать следующий прием:

ЗАМЕЧАНИЕ. Свойство Text возвращает значение типа string. Поэтому, если мы хотим воспользоваться этим компонентом для ввода числовых значений, необходимо воспользоваться функциями преобразования типа: Val, StrToFloat или StrToInt. StrToInt преобразуют текст в целочисленное значение, а StrToFloat преобразует текст в вещественное значение;

ЗАМЕЧАНИЕ 1. Для ввода паролей используется свойство PasswordChar типа Char, которое задает символ, отображаемый в поле ввода при нажатии любой клавиши, например:

При этом на экране в окне ввода будет отображено не слово Вулкан, а соответствующее количество звездочек — ******.

ЗАМЕЧАНИЕ 2. Для ввода информации по задаваемому шаблону можно использовать компонент MaskEdit, который позволяет ограничить количество и тип вводимых символов. Этим компонентом удобно пользоваться для ввода даты, времени, телефонного номера и т.п.

ЗАМЕЧАНИЕ 3. Для проверки вводимой информации можно исполь-зовать обработчики событий, например, обработчик события OnKeyPress.

Procedure Tform1.Edit1KeyPress(Sender:Tobject; var Key:char);

If (Key<’0’) or (Key>’9’) Then Key:=#0;

В этом случае для редактора Edit1 установлено разрешение ввода только цифр.

Ввод целых чисел с помощью компонента SpinEdit

Компонент SpinEdit находится в палитре Samples

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

путем ввода с клавиатуры;

с помощью стрелок.

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

Основными свойствами этого компонента являются:

Increment:integer – задает шаг, на величину которого изменяется (увеличивается или уменьшается) щелчком левой кнопкой мыши по одной из стрелок («вверх» или «вниз») вводимое значение; по умолчанию шаг приращения равен 1;

MaxLength:integer – задает максимальное количество символов, которое может быть введено в окно ввода; если введенное количество символов будет больше, чем MaxLength, то оно автоматически будет уменьшено до MaxLength; если MaxLength установить меньшим или равным 0 (например, -1 или -25), то контроль количества введенных символов будет отключен;

MaxValue:integer – задает максимальное значение числа, которое может быть введено в поле ввода;

MinValue:integer – задает минимальное значение числа, которое может быть введено в поле ввода;

Value:integer – задает минимальное значение числа, которое может быть введено в поле ввода;

ReadOnly:boolean – разрешает (false) или запрещает (true) ввод данных в поле ввода SpinEdit.

ЗАМЕЧАНИЕ 1. Если MaxValue= MinValue, то диапазон вводимого значения ограничивается только диапазоном представления значений типа integer.

ЗАМЕЧАНИЕ 2. Если введенное значение больше, чем MaxValue, то оно автоматически уменьшается до значения MaxValue.

ЗАМЕЧАНИЕ 3. Если введенное значение меньше, чем MinValue, то оно автоматически увеличивается до значения MinValue.

Достоинством использования компонента SpinEdit по сравнению с компонентом Edit при вводе целых чисел является отсутствие необходимости преобразования введенного значения к целому типу.

Пример возможного использования компонента SpinEdit:

3.2. Простейший вывод данных на экран

Рассмотрим следующие способы вывода данных в Delphi:

С использованием стандартных процедур ShowMessage и MesssageDlg.

С использованием окна вывода компонента Label.

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

Самым простым способом вывода текстових сообщений пользователю в Delphi является использование процедуры ShowMessage.

Формат обращения к процедуре ShowMessage имеет следующий вид:

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

После выполнения этого оператора на экране появится следующее окно:

Целесообразно использовать эту процедуру для вывода информационных или предупреждающих сообщений.

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

Формат обращения к функции MessageDlg:

Здесь R – переменная типа Word,

<Тип> — тип сообщения (информационный, предупредительный или др.): MtError, MtInformation, MtConfirmation, MtWarning;

<Кнопки> — число и вид кнопок. На этом месте записываются заключённые в квадратные скобки именованные константы, задающие вид и количество кнопок, например: MbOk, MbCancel].

Возможно использование следующих именованных констант: MbYes, MbNo, MbHelp, MbRetry.

<Контекст> — определяет номер экрана справочной системы, который появляется при нажатии клавиши F1 (если справка не нужна, то в этом месте ставится 0).

Возвращаемые значения: Mb меняется на Mr. Для определения, какая именно кнопка была нажата, можно использовать следующий оператор:

R:=MessageDlg(‘Возможна ошибка!’,MtWarning,[MbOk, MbCancel],0);

При выполнении этого оператора на экране появится окно следующего вида:

ЗАМЕЧАНИЕ. Если с помощью описанных процедур требуется вывести числовое значение, то его предварительно необходимо преобразовать в текстовое представление с помощью процедур Str, IntToStr, FloatToStr, например:

Вывод сообщений с помощью компонента Label

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

ЗАМЕЧАНИЕ 1. Для вывода числовых значений они должны быть предварительно преобразованы в текстовое представление с помощью процедур Str, IntToStr, FloatToStr, например:

ЗАМЕЧАНИЕ 2. Компонент Label можно использовать для вывода многострочных сообщений. Для этого используют управляющий символ ‘переход в начало следующей строки’ — #13.

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

Ввод значений с помощью компонента LabeledEdit

Ввод значений с помощью компонента Edit неудобен тем, что для обозначения его назначения необходимо использовать еще одну компоненту – Label. Для устранения этого маленького неудобства в поздних версиях Delphi в палитру Additional введен комбинированный компонент – помеченное поле ввода – LabeledEdit .

Кроме характерных для компонентов Edit и Label свойств, таких как Caption и Text, этот компонент обладает таким свойством как LabelPosition, которое определяет положение метки (обозначения) поля ввода – сверху (lpAbove), снизу (lpBelow), слева (lpLeft) или справа (lpRight). Свойство Caption является составной частью комплексного свойства EditLabel.

Spinedit delphi где находится

ProgressBar1.Step:=20; for i:=1 to 5 do begin RunLongProc(i); ProgressBar1.StepIt; end;

Таблица 13.1. Свойства компонента TrackBar

Свойство Тип значений Описание
Frequency Integer Определяет величину интервала между рисками
LineSize Integer Определяет величину приращения при управлении ползунком с клавиатуры клавишами-стрелками
PageSize Integer Определяет величину приращения при управлении ползунком с клавиатуры клавишами PageUp и PageDown
SelEnd Integer Определяет позицию окончания выбранного диапазона
SelStart Integer Определяет позицию начала выбранного диапазона
SliderVisible Boolean Определяет, должен ли отображаться сам ползунок
ThumbLength Integer Определяет размер ползунка
TickMarks TTickMark Определяет расположение рисок. Допустимые значения: tmBottomRight, tmTopLeft и tmBoth
TickStyle TTickStyle Определяет способ вывода рисок. Допустимые значения: tsNone, tsAuto и tsManual

TrackBar1.TickStyle:=tsManual; TrackBar1.SetTick(4); TrackBar1.SetTick(7);

  • Для компонента TrackBar1 установим свойство Orientation в trVertical, а свойствам Min, Max и Position назначим значения 6, 12 и 10, соответственно. Кроме того, установим для него свойства SelEnd и SelStart в 11 и 9, а TickMarks — в tmBoth;
  • Для TrackBar2 ограничимся изменением значения его свойства ThumbLength с 20 на 15;
  • Индикатор ProgressBar1 оставим вообще без изменений.

Форма Delphi с 2 ползунками и 1 индикатором

procedure TForm1.TrackBar2Change(Sender: TObject); begin ProgressBar1.Position:=TrackBar2.Position*TrackBar1.Position; Form1.Caption:=IntToStr(ProgressBar1.Position); end;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *