Программирование / Помощь по Delphi
« : 27 Февраля 2009, 11:09:59 »Хочу наконец научиться создавать собственные компоненты. А конкретнее, собираюсь создать небольшой простенький компонент (HexEasy), который бы позволял работать с числом как в десятичном, так и в шестнадцатеричном представлениях. Не мудрствуя, в качестве базового взяла Edit. Сочла наиболее удобным создать отдельное поле (FValue: Integer), непосредственно содержащее число, десятичное или шестнадцатеричное изображение которого выведено на монитор. По моей задумке, когда фокус находится на данном компоненте, любое нажатие клавиши должно либо игнорироваться, либо приводить к изменению данной переменной. Т.е. обработка события KeyPress должна состоять как бы из трёх этапов:
1. Предварительный анализ введённого символа на его допустимость.
2. Изменение свойства Text элемента.
3. Анализ изменённого свойства Text: преобразование его в значение FValue и в случае необходимости дальнейшая корректировка.
Я пыталась это сделать примерно таким образом:
procedure THexEasy.KeyPress (var key: Char);
begin
. . . . . . . . . . . . //предварительная обработка символа key
inherited KeyPress(key);
If Text='' then begin
FValue := 0;
EXIT;
end;
FValue := StrToInt(Text);
If FValue>FValueMax then begin //если число больше максимально допустимого...
FValue := FValueMax;
Text := IntToStr(FValue);
end; //всё это упрощённо, когда работа идёт с десятичным числом
end;
Но в результате вставки в программу примерно такого кода обнаружилось, что свойство Text компонента изменяется лишь после того, как данная процедура полностью закончит свою работу. Т.е. анализируемое в последней части свойство Text имеет содержание, которое было до того, как пользователь нажал клавишу, а мне нужно обработать именно последствия нажатия. Можно ли как-то форсировать изменение свойства Text?
Никогда не создавала компоненты и даже классы, не ругайтесь сильно, если где-то глуплю.