![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Edit1.text как запретить вводить буквы и разрешить цифры
Officeman © (2005-11-19 22:20:00)есть несколько Edit-ов. пользователь вводит в них ЦИФЕРНЫЕ значения.
Таймер подсчитывает эти значения(суммирует).
вот как бы ОГРАНИЧИТЬ ввод БУКВ.
или в Таймере сделать проверку ЕСЛИ это 'буква' то showmessage('error');
???
Officeman (2005-11-28 07:59:00) [1]уже разобрался! спасибо по поддежку всего ТОПА!
с Уважением, Officeman
Officeman (2005-11-25 15:27:00) [2]to Mike Kouzmine ©
Можно попробовать. я тоже об этом думал =)
to ivc_andr
p.s. как правило пользователь. сначало стирает потом вводит.
так вот когда он сотрёт. по получится текстовове значения ''
ещё надо запретить ввод BACKSPACE-а, или чтоб новые значения записывались сразу ВЗАМЕН СТАРЫМ. т.е. при выделении edit1.setfocus надо чтоб выделялось его значение.
ivc_andr (2005-11-25 11:20:00) [3]procedure TForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not(Key in ['0'..'9',DecimalSeparator]) and (Key <> #8) then Key := #0;
end;
Virgo_Style (2005-11-24 22:06:00) [4]Джо © (24.11.05 19:58) [36]
Тоже вариант. У меня-то Edit'ов всего два %-)
Еще можно было бы подсветку сделать...
Mike Kouzmine (2005-11-24 20:04:00) [5]На онченджь любого едита в цикле проходишь по всем едитам и на связанный с ними лабле отображаешь значение. Для фильтрации ввода используешь маску. Дел на 2 сек.
Джо (2005-11-24 19:58:00) [6]
> [35] Джо © (24.11.05 19:13)
Проиллюстрирую.
Вот как у меня построена обработка ввода в одном приложении (довольно стареньком, но иногда обновляющемся).
Состряпал юнит, занимающийся проверкой:
{
Модуль проверки введенных значений в контролы TCustomEdit
Главная функция: CheckEdits
Принимает открытый массив записей TEditCheckRecord с данными
по проверяемым контролам.
При обнаружении некорректных данных устанавливает фокус на контрол
и генерирует исключение EConvertError с указанным сообщением.
Записи создаются функциями IntEdit и FloatEdit
}
unit InputCheck;
interface
uses SysUtils, Classes, StdCtrls;
type
TStringType = (stInteger, stFloat);
TEditCheckRecord = record
Edit: TCustomEdit;
Kind: TStringType;
Msg: string;
end;
procedure CheckEdits (Params: array of TEditCheckRecord);
function IntEdit (Edit: TCustomEdit; Msg: string): TEditCheckRecord;
function FloatEdit (Edit: TCustomEdit; Msg: string): TEditCheckRecord;
implementation
function IntEdit (Edit: TCustomEdit; Msg: string): TEditCheckRecord;
begin
Result.Kind := stInteger;
Result.Edit := Edit;
Result.Msg := Msg;
end;
function FloatEdit (Edit: TCustomEdit; Msg: string): TEditCheckRecord;
begin
Result.Kind := stFloat;
Result.Edit := Edit;
Result.Msg := Msg;
end;
function CheckString (AString: string; StringType: TStringType): Boolean;
var
IVal: Integer;
FVal: Double;
begin
Assert ( (StringType=stInteger) or (StringType=stFloat),
'Incorrect value of StringType parameter');
case StringType of
stInteger: Result := TryStrToInt(AString,IVal);
stFloat: Result := TryStrToFloat(AString,FVal);
end
end;
procedure CheckEdits (Params: array of TEditCheckRecord);
var
I: Integer;
begin
for I := Low (Params) to High(Params) do
if not CheckString(Params[I].Edit.Text,Params[I].Kind) then
begin
Params[I].Edit.SetFocus;
raise EConvertError.Create(Params[I].Msg);
end
end;
end.
С первого взгяда выглядит немного запутанным или грубоватым? На самом деле все просто.
Вот стандартный код создания модального диалогового окна:
procedure TForm1.Button1Click(Sender: TObject);
var
Dlg: TDlgFrm;
begin
Dlg := TDlgFrm.Create(nil);
try
// ....
if Dlg.ShowModal = mrOK then
begin
// ....
end;
finally
Dlg.Free;
end;
end;
А вот, собственно, обработчик кнопки OK в самом диалоговом окне (кнопка btnCancel.ModalResult=mrCancel, btnCancel.ModalResult=mrNone):
procedure TDlgFrm.btnOKClick(Sender: TObject);
begin
CheckEdits([
FloatEdit(edX,'Некорректное значение X-координаты'),
FloatEdit(edY,'Некорректное значение Y-координаты'),
IntEdit(edScaleFactor,'Некорректное значение масштабного коэффициента')
]);
ModalResult := mrOk;
end;
И всё :) И программисту мороки немного и юзеру удобно и приятно...
Сорри, если пояснения были излишними, просто тема животрепещущая :))
Джо (2005-11-24 19:13:00) [7]
> [32] Virgo_Style © (20.11.05 18:55)
Тоже вариант. Но я от него отказался. Представь, что в окне 10 Эдитов. Не глядя заполнил, посмотрел на кнопку OK - заблокрировано. Приходится долго и нудно перепроверять каждый Эдит, выискивая некорректное значение. Имхо, удобнее предоставить пользователю вводить, что ему хочется. А при попытке закрытия окна кнопкой OK указывать, в каком поле ошибка.
Имхо, но у меня это, в некотором роде, "выстраданный" вариант :)
Separator (2005-11-24 19:02:00) [8]Писал ведь, можно использовать StrToIntDef()
i:= StrToInt Def(u2_zlost.Text, 0)
Если в тексте не цифровое значение, то iприсваевается 0
Officeman (2005-11-24 14:50:00) [9]нет. это не катит!
ТЗ
пользователь вводит значения в Edit1,....Edit 20
(в разнобой), и получает сразу результаты в Label1...label20, (вычисления)
потом ещё раз вычисления. и вы получаем один результат в Result.caption
Пользователь Должен видеть изменения Result после КАЖДОГО введённого или изменённого значения, а каждый раз жимкать кнопку "ОК" - это .....о !
Вот и парюсь над этими Эдитами. последний вариант такой:
begin
try
if i=StrToInt(u2_zlost.Text) then begin
end;
except begin
u2_zlost.Text:='0';
ShowMessage('Тут цифра нужна');
end;
end;
LVu2.Items.Item[12].SubItems[3]:=u2_zlost.Text;
end;
Если менять текущее значение то всё хорошо.
а если СНАЧАЛО нажать BackSpace и потом введоть цифры, то
пополучается что Edit1.text:='' , а это влёчет ошибку за собой ошибку при расчётах. всё зацикливается и прога ПАДАЕТ (
ДВа вариата:
-обработку при расчётах поставить
-обработку при вводе значений в Edit-ы
Если выйдет по нормальному. то сделаю свою плавающую панельку Калькулятор(с цифрами от 0-9).
Хотелось бы найти более верный способ.
с Уважением, Officeman
Virgo_Style (2005-11-20 18:55:00) [10]Джо © (20.11.05 18:52) [31]
У меня в некотором роде промежуточный вариант - при изменении проверяется корректность, если данные некорректны, то соответствующие кнопки блокируются.
Джо (2005-11-20 18:52:00) [11]Не знаю, оффтоп или нет...
Лично я давно отказался от этой идеи контроллировать вводимые данные в процессе ввода. Программировать неудобно, а смысла никакого нет. Проверяю ввод на корректность при нажатии кнопки OK и выдаю соответствующие предупреждения. И все.
begin...end (2005-11-20 18:42:00) [12]> Officeman (20.11.05 14:25) [23]
SetWindowLong(Edit.Handle, GWL_STYLE, GetWindowLong(Edit.Handle, GWL_STYLE) or ES_NUMBER)
Однако при этом можно будет вставить любой текст из буфера обмена.
tesseract (2005-11-20 18:30:00) [13]
> Edit1.text как запретить вводить буквы и разрешить цифры
TspinEdit на Samples.
default (2005-11-20 15:44:00) [14]Separator © (20.11.05 15:34) [27]
TMaskEdit
Separator (2005-11-20 15:34:00) [15]
> default © (20.11.05 14:38) [24]
>
> перекрывай в потомке
> procedure CreateParams(var Params: TCreateParams);
>
Я перекрыл в потомке CreateParams, все нормально работает, но если я хочу ввести дробное значение?
Officeman (2005-11-20 15:29:00) [16]=) кто нибудь ответит на мой второй пост про ListView. Буду очень признателен
Oni (2005-11-20 15:25:00) [17]Separator © (20.11.05 12:41) [15]
Мы не занем какое конкретное ТЗ дано автору.
А пользователи бывают... мда...
default (2005-11-20 14:38:00) [18]перекрывай в потомке
procedure CreateParams(var Params: TCreateParams);
Officeman (2005-11-20 14:25:00) [19]to MBo, подскажи как ?
у Эдита нет свойства Style
MBo (2005-11-20 14:07:00) [20]Установить Edit-у стиль ES_NUMBER