Текущий архив: 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.56 MB
Время: 0.04 c