- •Палитра компонент Объекты и компоненты
- •Компоненты ввода и отображения текстовой информации Отображение текста в надписях Компонент Label(метка)
- •Компонент StaticText(меткаcбордюром)
- •Компонент Panel (панель)
- •Окна редактирования Компонент Edit(окно редактирования)
- •Компонент MaskEdit (окно маскированного редактирования)
- •Компонент LabeledEdit (окно редактирования с привязанной к нему меткой)
- •Многострочные окна редактирования Компонент Memo (многострочное окно редактирования)
- •Компонент RichEdit(многострочное окно редактирования в форматеRtf)
- •Компоненты выбора из списков Компонент ListBox(окно списка)
- •Компонент ComboBox (редактируемый список)
Окна редактирования Компонент Edit(окно редактирования)
Страница Standard
Отображение, ввод и редактирование однострочных текстов. Имеется возможность оформления объемного бордюра.
Свойства
Text– содержит вводимый и выводимый текст. Это свойство можно устанавливать в процессе проектирования или задавать программно. Выравнивание текста невозможно. Перенос строк тоже невозможен. Текст, не помещающийся по длине в окно, просто сдвигается и пользователь может перемещаться по нему с помощью курсора.
Окно редактирования снабжено многими функциями, свойственными большинству редакторов. Например, в нем предусмотрены типичные комбинации "горячих" клавиш: Ctrl-C - копирование выделенного текста в буфер обмена Clipboard (команда Copy), Ctrl-X - вырезание выделенного текста в буфер Clipboard (команда Cut), Ctrl-V - вставка текста из буфера Clipboard в позицию курсора (команда Paste), Ctrl-Z - отмена последней команды редактирования.
При использовании окон редактирования для вывода, ввода и редактирования чисел необходимо использовать функции взаимного преобразования строк и чисел.Для вывода это функции FloatToStr(Value: Extended): string и IntToStr(Value: Integer): string. При вводе это функции StrToFloat(const S: string): Extended — преобразование строки в значение с плавающей запятой, и StrToInt (const S: string): Integer — преобразование строки в целое значение. Если вводимый текст не соответствует числу (например, содержит недопустимые символы), то функции преобразования генерируют исключение EConvertError.
Кроме того определены функции TryStrToInt(const S: string; out Value: Integer): Boolean
и TryStrToFloat(const S: string; out Value: Extended): Boolean, которые преобразуют строку S в целое или вещественное число. Если Sневозможно пребразовать, то функции возвращаютfalse, иначеtrue.
Более подробно см. файл 'Пр 4 Функции обработки строк.doc'
AutoSize: Booleanпозволяет автоматически подстраивать высоту (но не ширину) окна под размер текста.
AutoSelect:Booleanопределяет, будет ли автоматически выделяться весь текст при передаче фокуса в окно редактирования. Его имеет смысл задавать равным true в случаях, когда при переключении в данное окно пользователь будет скорее заменять текущий текст, чем исправлять его.
SelLength: integer,SelStart:integer,SelText:string – свойства только времени выполнения,определяющие соответственно длину выделенного текста, позицию перед первым символом выделенного текста и сам выделенный текст. Если выделенного текста нет, то свойствоSelStartпросто определяет текущее положение курсора.
Примеркопирования выделенного текста изEdit1 вEdit2
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := Edit1.SelText;
end;
MaxLength: Integer – определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. В противном случае значение MaxLength указывает максимальное число символов, которое может ввести пользователь.
Modified:Boolean– свойство времени выполнения, показывает, проводилось ли редактирование текста в окне. Если вы хотите использовать это свойство, то в момент начала работы пользователя с текстом Modified надо установить в false. Тогда при последующем обращении к этому свойству можно по его значению (true или false) установить, было или не было произведено редактирование.
PasswordChar:Char– позволяет превращать окно редактирования в окно ввода пароля. По умолчанию значение PasswordChar равно #0 - нулевому символу. В этом случае это обычное окно редактирования. Но если в свойстве указать иной символ (например, символ звездочки "*"), то при вводе пользователем текста в окне будут появляться именно эти символы, а не те, которые вводит пользователь. Тем самым обеспечивается секретность ввода пароля.
Методы
procedure Clear; – Удаляет текст из окна.
procedure ClearSelection; – Удаляет текст, выделенный в окне.
procedure SelectAll; – Выделяет весь текст в окне редактирования.
procedure CopyToClipboard;– Копирует выделенный текст в компоненте редактирования в Clipboard в формате CF_TEXT
procedure CutToClipboard;– Переносит выделенный текст в Сlipboard в формате CF_TEXT и уничтожает его в окне
procedure PasteFromClipboard; – Переносит в окно текст из буфера Clipboard
procedure ClearUndo;– Очищает буфер отмены команд редактирования, так что никакие изменения в тексте после этого не могут быть отменены.
procedure SetFocus; – Передает фокус элементу, активизирует его.
function Focused: Boolean;– Определяет, инициирован ли оконный компонент (имеет ли входной фокус), то есть является ли оконный компонент активным.
События
OnKeyPress– Событие наступает, если компонент находится в фокусе при нажатии пользователем клавиши символа. В обработчике можно распознать вводимый символ и при необходимости изменить его или запретить его ввод.
Обработчик этого события имеет параметр Keyтипа Char. Этот параметр соответствует символу нажатой клавиши.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
end
При этом различаются символы в верхнем и нижнем регистрах и символы кириллицы и латинские. Клавиши, не отражаемые в кодах ASCII (функциональные клавиши и такие, как
Shift, Alt, Ctrl), не вызывают этого события. Поэтому нажатие таких комбинаций клавиш, как, например, Shift-A, генерирует только одно событие OnKeyPress, при котором параметр Key равен ‘А’. Для того чтобы распознавать клавиши, не соответствующие символам, или комбинации клавиш, надо использовать обработчики событий OnKeyDown и OnKeyUp.
Следует отметить, что событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift. Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событиеOnKeyPress может не наступить (произойдут только событияOnKeyDown при нажатиии OnKeyUp при отпускании) или, если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событиеOnKeyPress при нажатии символьной клавиши не наступает. А при нажатой клавише Ctrl событиеOnKeyPress при нажатии символьной клавиши наступает, но
символ не распознается.
Поскольку параметр Key передается в обработчик как var, его можно измеять, передавая для дальнейшей стандартной обработки другой символ, как в приведенных ниже примерах.
Примеры
1. Пусть вы хотите, чтобы пользователь не мог вводить в окно редактирования Editl какие-либо символы, кроме цифр. Это можно сделать, написав дляEditl следующий обработчик событияOnKeyPress:
procedure TForm1. Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9']) then key:=#0;
end
Этот оператор трансформирует все не цифровые символы в нулевые и они не будут отражаться в окне редактирования, но не позволяет стирать введенные символы. Чтобы обеспечить возможность стирать символы перепишем опрератор в виде:
if not (key in ['0'..'9', #8]) then key:=#0;
Если на форме расположено несколько окон редактирования предназначенных для ввода целочисленной информации, то целесообразно в инспекторе объектов один и тот же обработчик события OnKeyPress назначить для всех необходимых компонент Edit.
2. Следующий обработчик позволяет вводить в окно редактирования только числа
(целые или вещественные).
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9' : ; // цифры и <Back Space>
'.',',': // разделитель целой и дробной частей числа
begin
// if Key <> DecimalSeparator then
Key := DecimalSeparator; // заменим разделитель на допустимый
if Pos(DecimalSeparator,Edit1.Text) <> 0
then Key := Chr(0); // запрет ввода второго разделителя
end;
'-': // минус можно ввести только первым симвом, т.е. когда ячейка пустая
if Length(Edit1.Text) <> 0
thenKey:=Chr(0);
else // остальные символы запрещены
key := Chr(0);
end;
end;
Очевидным недостатком этого обработчика является невозможность поставить знак "-", если одна или несколько цифр числа уже введены, а также, невозможность ввести число в форме с порядком.
Вариант обработки события OnKeyPress, предложенный студентами ПЗ-08-1:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,#48..#57:
if ((Edit1.SelStart=0)and(Edit1.SelLength=0)) and (pos('-',Edit1.Text)<>0) then Key := #0;
'-':
if ((pos('-',Edit1.Text)<>0)and(pos('-',Edit1.SelText)=0))or(Edit1.SelStart<>0) then
Key:=#0;
'.',',': begin
Key := DecimalSeparator;
if ((pos(DecimalSeparator,Edit1.Text)<>0)and(pos(DecimalSeparator,Edit1.SelText)=0))or
((pos('-',Edit1.Text)>Edit1.SelStart)and(Edit1.SelLength=0)) then Key:=#0;
end;
else Key := #0;
end;
end;
Если на форме расположено несколько окон редактирования, предназначенных для ввода вещественных чисел, то можно написать один обработчик, используя параметр Sender и применить этот обработчик для нескольких компонентов.
Параметр Sender типаTObjectпередается во все обработчики событий и содержит указатель на компонент, в котором произошло событие. Он не требуется, если пишется обработчик события для одного конкретного компонента. Однако часто один обработчик применяется для нескольких компонентов. ТогдаSender можно использовать для распознавания источника события. Правда, поскольку типTObject не имеет никаких полезных для пользователя свойств и методов, то объектSender следует рассматривать как объект производного отTObject типа. Если надо применить к источнику события некоторый метод или обратиться к какому-то свойству, можно использовать операцию as. Например
(SenderasTEdit).Text.
Таким образом, в предложенных выше обработчиках достаточно заменить обращения к компоненту по имени Edit1, на конструкцию (SenderasTEdit) и применить этот обработчик ко всем необходиммым окнам редактирования
3. Приведенный ниже оператор обработчика события OnKeyPress переводит символы в верхний регистр, независимо от того, в каком регистре набрал их пользователь:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
key:=UpCase(key); // или key:=UpperCase(key)[1];
end
(функция UpCaseполучает и возвращает символ, а функцияUpperCase–строку)
Этот оператор действует только на латинские символы. Приведенный ниже аналогичный оператор действует и на латинские символы, и на символы кириллицы
key:=AnsiUpperCase(key)[1];
OnChangeНаступает, когда текст в окне может быть изменился. Свойство Modified показывает, действительно ли произошло изменение. Свойство Text отображаетизмененный текст.
С помощью обработчика события ОnСhange программа может контролировать вводимый пользователем текст и при необходимости фильтровать его, игнорируя недопустимые символы. В следующем примере, предложенном студентами гр. ПЗ-08-1 Оробец Артемом и Двойнишниковым Максимом, выполняется фильтрация всех символов, которые не соответствуют правильному представлению вещественного числа:
type
TfMain = class(TForm)
Edit1: TEdit;
procedure Edit1Change(Sender: TObject);
private
sOld: string;
public
end;
var
fMain: TfMain;
implementation
{$R *.dfm}
procedure TfMain.Edit1Change(Sender: TObject);
var z, j : Integer;
s: String;
d: extended;
begin
j := (Sender as TEdit).SelStart;
s := (Sender as TEdit).Text;
z := Pos(',', s);
if z>0 then s[z]:=DECIMALSEPARATOR
else
begin
z:=Pos('.', s);
if z>0 then
s[z]:=DECIMALSEPARATOR;
end;
(Sender as TEdit).Text := s; //Здесь возникает событие OnChange, если была выполнена замена
//на допустимый разделитель
(Sender as TEdit).SelStart := j;
if length(s) < 2 then
s := s + '0';
if not trystrtofloat(s,d) then
begin
(Sender as TEdit).Text := sOld; //Здесь опять возникает событие OnChange
(Sender as TEdit).SelStart := j-1;
end
else
sOld := (Sender as TEdit).Text;
end;
Задание Продумайте и предложите свой обработчик для фильтрации недопустимых символов при вводе вещественного числа
