Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.035 c
5-1116060349
Нулевой
2005-05-14 12:45
2005.12.11
Как из ComboBox сделать DBLookUpComboBox?


1-1131803201
Dmitrich
2005-11-12 16:46
2005.12.11
Мышка


2-1132223758
DeeperMD
2005-11-17 13:35
2005.12.11
TComPort - ComDataPacket


3-1130269286
Павел
2005-10-25 23:41
2005.12.11
shadow


14-1132148771
Yuri Btr
2005-11-16 16:46
2005.12.11
Проблема с RadioEthernet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский