Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Edit1.text как запретить вводить буквы и разрешить цифры


Страницы:   1 2 3

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо