Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

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

 
Officeman   (2005-11-19 22:20) [0]

есть несколько Edit-ов. пользователь вводит в них ЦИФЕРНЫЕ значения.
Таймер подсчитывает эти значения(суммирует).

вот как бы ОГРАНИЧИТЬ ввод БУКВ.

или в Таймере сделать проверку ЕСЛИ это "буква" то showmessage("error");

???


 
Oni   (2005-11-19 22:53) [1]

TMaskEdit вместо TEdit подойдёт?
У него есть свойство EditMask,где можно выбрать вводимые в Edit символы


 
Дева ©   (2005-11-19 23:22) [2]

Или через обработку исключительной ситуации :)


 
Oni   (2005-11-19 23:55) [3]

Тогда уж лучше введённый текст на цифры-буквы проверять


 
Officeman   (2005-11-19 23:56) [4]

to Oni,  нет это неподходит!

to Дева, канечно я думал об этом

на событии  TEdit.onChange

Хотелось бы прописать так

если     edit1.text    есть БУКВА тогда  SHOWMESSAGE ОШИБКА

как написать, правильно сравнить что "это текст или это не текст"

if  edit1.text=Char(256) then

;)    ?????????????????????????????????


 
Сайбель Алексей ©   (2005-11-19 23:58) [5]

У тебя таймер каждый отрезок времени проверяет значения в эдитах и суммирует их??

Для того, чтобы ограничить ввод букв, нужно посадить проверку на событие OnKeyPress у TEdit"a, которое обрабатывается при нажатие клавиши в эдите
 if not (key in [ #48..#57,#8,",","."])
   then key:=#0


 
Officeman   (2005-11-20 00:04) [6]

=)))))))

все коды проверять?  я попробую только цифры проверять.
или сделаю на форме дополнительные кнопки (вверх,вниз) для выбора цифрового значения.


 
Сайбель Алексей ©   (2005-11-20 00:09) [7]


> все коды проверять?  

Это вопрос мне?
Из поставленно задачи:

> вот как бы ОГРАНИЧИТЬ ввод БУКВ.

Ответ на нее: Сайбель Алексей © [5]
OnKeyPress
if not (key in [ #48..#57,#8,",","."])//если вводимый символ не цифра от 0..9, либо Backspace, либо . ,
  then //тогда что угодно, хотьб ShowMessage("Разрешен ввод только цифр!") хотя это не удобно с точки зрения пользователя


 
Oni   (2005-11-20 00:09) [8]


try
 i:=StrToInt(Edit1.Text);
 except ShowMessage("Error")
end;


 
Officeman   (2005-11-20 00:21) [9]

=))))))

to Oni,  хорошая шутка.

to Сайбель Алексей
в общем и целом она работает. НОООООООООО

Только всё равно ОДНА  БУКВА вводится, и после этого ничего недаёт вводить. я продовал ставить и edit.clear;  =) всё равно одна буква остаётся.


 
Officeman   (2005-11-20 00:31) [10]

TO        ONI            - GOOD     IDEA    


procedure TForm2.Edit2Change(Sender: TObject);
begin
try
if i=StrToInt(Edit2.Text) then begin
end;
except ShowMessage("Error")
end;
end;


 
Сайбель Алексей ©   (2005-11-20 00:44) [11]

2 Officeman [9]

> Только всё равно ОДНА  БУКВА вводится

Добавь в код как было в [5] then key:=#0.

В целом вижу полное не понимание сути:
Во первых не использйте try except end;
То, что написано в Oni [8] полная ерунда.
Во вторых сообщение об ошибке не удобно для пользователся -  лучше предотвращать появление самой ошибки, просто используй [5].

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

Читайте книги, в них знания.


 
Officeman   (2005-11-20 01:11) [12]

да не, номер [10] - ништяк работает. Багов нет.
а если пользователь вводит БУКВУ я даю:  
ShowMessage("Тут ЦИФРА нужна");
и возвращаю
Edit2.text:="0";  //ноль


 
Separator ©   (2005-11-20 08:40) [13]

[10 ]НЕЛЬЗЯ ТАК ДЕЛАТЬ!!!!!!!!!!!!!!

Зачем плодить лишние исключительные ситуации?

И вообще старайтесь try ... except использовать только в процессе отладки, правильно работающая программа не должна генерировать исключения.

Вот, по моему, одно иг правильных решений:


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
   i: Integer;
begin
   if not(Key in [ #48..#57, #8, ".", ","])
       then Key:= #0
       else if Key in [".", ","] then begin
           Key:= DecimalSeparator;
           for i:= 1 to Length((Sender as TEdit).Text) do
               if (Sender as TEdit).Text[i] = Key then begin
                   Key:= #0;
                   Break
               end
       end
end;



 
Oni   (2005-11-20 12:33) [14]

[13]
Больше кода... а результат тот-же,
я думаю автору важнее получить результат,
а не беспокоится о надежности программы, которая
имхо из-за использования try...except станет только
стабильней.


 
Separator ©   (2005-11-20 12:41) [15]

нет

Во первых найдите пользователя, которому нравится нажимать на кнопку Ok во всяких окошках об ошибках, проще вообще запретить ввод не нужных символов


 
Separator ©   (2005-11-20 12:53) [16]

С помощью зарезервированных слов try (попробовать), except (исключение) и end реализуется так называемый защищенный блок. Такими блоками программист может защитить программу от краха при выполнении потенциально опасного участка

А где здесь опасный участок?


 
Anton_K ©   (2005-11-20 13:01) [17]


> А где здесь опасный участок?

Тут i:=StrToInt(Edit1.Text), так как в Edit1 может быть и не число.


 
Anton_K ©   (2005-11-20 13:03) [18]


> Во первых найдите пользователя, которому нравится нажимать
> на кнопку Ok во всяких окошках об ошибках

Если эти ошибки обрабатывать в try...except, то никаких окошек не будет.


 
Developerr ©   (2005-11-20 13:22) [19]

Проще всего установить Библиотеку RX или Jedi VCL и воспользовать компонентом RxCalcEdit или JvCalEdit и будет Вам счастье.


 
Officeman   (2005-11-20 13:33) [20]

to Developerr, согласен  RxCalcEdit  и ... ! вещи замечательная. но кому как . быстрее вручную ввести. чем нажимать дополнительно кнопки. конечно зато все баги уходят... хм. подумаю. .. rxlib стоит давно. я и забыл что у него есть аткой компонент.

to Separator, я не вывожу ошибку на экран. я ставлю edit2.text:="0";
чтобы исключить ошибку при

Тут i:=StrToInt(Edit1.Text), так как в Edit1 может быть и не число.


 
Separator ©   (2005-11-20 13:51) [21]

Вот блин.

используйте тогда StrToIntDef(Edit1.Text, 0)

Тогда вообще ничего не нужно использовать, если в TEdit1.Text будет не число, то в результате вернется 0


 
MBo ©   (2005-11-20 14:07) [22]

Установить Edit-у стиль ES_NUMBER


 
Officeman   (2005-11-20 14:25) [23]

to MBo, подскажи как ?

у Эдита нет свойства Style


 
default ©   (2005-11-20 14:38) [24]

перекрывай  в потомке
procedure CreateParams(var Params: TCreateParams);


 
Oni   (2005-11-20 15:25) [25]

Separator ©   (20.11.05 12:41) [15]
Мы не занем какое конкретное ТЗ дано автору.
А пользователи бывают... мда...


 
Officeman   (2005-11-20 15:29) [26]

=) кто нибудь ответит на мой второй пост про ListView. Буду очень признателен


 
Separator ©   (2005-11-20 15:34) [27]


> default ©   (20.11.05 14:38) [24]
>
> перекрывай  в потомке
> procedure CreateParams(var Params: TCreateParams);
>

Я перекрыл в потомке CreateParams, все нормально работает, но если я хочу ввести дробное значение?


 
default ©   (2005-11-20 15:44) [28]

Separator ©   (20.11.05 15:34) [27]
TMaskEdit


 
tesseract ©   (2005-11-20 18:30) [29]


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

TspinEdit на Samples.


 
begin...end ©   (2005-11-20 18:42) [30]

> Officeman   (20.11.05 14:25) [23]

SetWindowLong(Edit.Handle, GWL_STYLE, GetWindowLong(Edit.Handle, GWL_STYLE) or ES_NUMBER)

Однако при этом можно будет вставить любой текст из буфера обмена.


 
Джо ©   (2005-11-20 18:52) [31]

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


 
Virgo_Style ©   (2005-11-20 18:55) [32]

Джо ©   (20.11.05 18:52) [31]

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


 
Officeman   (2005-11-24 14:50) [33]

нет. это не катит!  

ТЗ

пользователь вводит значения в 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


 
Separator ©   (2005-11-24 19:02) [34]

Писал ведь, можно использовать StrToIntDef()


    i:= StrToIntDef(u2_zlost.Text, 0)


Если в тексте не цифровое значение, то i присваевается 0


 
Джо ©   (2005-11-24 19:13) [35]


> [32] Virgo_Style ©   (20.11.05 18:55)

Тоже вариант. Но я от него отказался. Представь, что в окне 10 Эдитов. Не глядя заполнил, посмотрел на кнопку OK - заблокрировано. Приходится долго и нудно перепроверять каждый Эдит, выискивая некорректное значение. Имхо, удобнее предоставить пользователю вводить, что ему хочется. А при попытке закрытия окна кнопкой OK указывать, в каком поле ошибка.

Имхо, но у меня это, в некотором роде, "выстраданный" вариант :)


 
Джо ©   (2005-11-24 19:58) [36]


> [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;

И всё :)  И программисту мороки немного и юзеру удобно и приятно...
Сорри, если пояснения  были излишними, просто тема животрепещущая :))


 
Mike Kouzmine ©   (2005-11-24 20:04) [37]

На онченджь любого едита в цикле проходишь по всем едитам и на связанный с ними лабле отображаешь значение. Для фильтрации ввода используешь маску. Дел на 2 сек.


 
Virgo_Style ©   (2005-11-24 22:06) [38]

Джо ©   (24.11.05 19:58) [36]

Тоже вариант. У меня-то Edit"ов всего два %-)
Еще можно было бы подсветку сделать...


 
ivc_andr   (2005-11-25 11:20) [39]

procedure TForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if not(Key in ["0".."9",DecimalSeparator]) and (Key <> #8)  then Key := #0;
end;


 
Officeman   (2005-11-25 15:27) [40]

to Mike Kouzmine ©

Можно попробовать. я тоже об этом думал =)

to ivc_andr

p.s. как правило пользователь. сначало стирает потом вводит.
так вот когда он сотрёт. по получится текстовове значения ""

ещё надо запретить ввод BACKSPACE-а, или чтоб новые значения записывались сразу ВЗАМЕН СТАРЫМ. т.е. при выделении edit1.setfocus надо чтоб выделялось его значение.



Страницы: 1 2 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.026 c
2-1133113159
Neosted
2005-11-27 20:39
2005.12.11
EXE файл


3-1130156030
napik
2005-10-24 16:13
2005.12.11
Asses


1-1131999469
Razor
2005-11-14 23:17
2005.12.11
Окно, "прозрачное" для кликов мыши


3-1130310225
carmen
2005-10-26 11:03
2005.12.11
Обращение в SQL запросе не по имени поля


14-1132560740
Bazi
2005-11-21 11:12
2005.12.11
BlowFish crypt