Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Вниззаблокировать(запретить) ввод в TEdit Найти похожие ветки
← →
zol (2007-01-02 20:12) [0]Здравствуйте.Подскажите как можно заблокировать(запретить) ввод текста и символов в TEdit.Чтоб в него можно было вводить только цифры и точку(или запятую). короче говоря для ввода с подальшей работой математикu...
← →
Desdechado © (2007-01-02 20:31) [1]TMaskEdit
или делать постпроверку после ввода перед использованием
← →
azl © (2007-01-02 20:34) [2]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var //цифровая маска
vrPos,vrLength,vrSelStart : byte;
const
i : byte=1; //I+1 = количество знаков после запятой (в данном случае - 2 знака)
begin
with Sender as TEdit do
begin
vrLength:=Length(Text); //определяем длину текста
vrPos:=Pos(",", Text); //проверяем наличие запятой
vrSelStart:=SelStart; //определяем положение курсора
end;
case Key of "0".."9" : begin
//проверяем положение курсора и количество знаков после запятой
if (vrPos>0)and(vrLength-vrPos>I)and(vrSelStart>=vrPos) then
Key:=#0; //"погасить" клавишу
end;
",","." : begin
//если запятая уже есть или запятую пытаются поставить перед числом или никаких цифр в поле ввода еще нет
if (vrPos>0)or(vrSelStart=0)or(vrLength=0) then
Key:=#0 //"погасить" клавишу
else Key:=#44; //всегда заменять точку на запятую
end;
#8 : ; //позволить удаление знаков клавишей "Back Space"
else Key := #0; //"погасить" все остальные клавиши
end;
end;
← →
Chort © (2007-01-02 21:00) [3]
> azl © (02.01.07 20:34) [2]
Спасибо! а то случайно ввожу какой-нить знак - и сразу матюки на экране.
← →
zol (2007-01-02 21:02) [4]
> Спасибо! а то случайно ввожу какой-нить знак - и сразу матюки
> на экране.
Присоединяюсь!
← →
Desdechado © (2007-01-02 21:20) [5]azl © (02.01.07 20:34) [2]
//если запятую пытаются поставить перед числом или никаких цифр в поле ввода еще нет
Ненормально. Нормальные системы позволяют вводить числа без лидирующего нуля, например ",9" или "-,04".//всегда заменять точку на запятую
Маньячество. Бедные пользователи.//"погасить" все остальные клавиши
А как насчет Delete, Tab и Esc?
Кстати, плюс и минус ты считаешь лишними при вводе чисел?
← →
Desdechado © (2007-01-02 21:20) [6]я уж не говорю по ctrl-V и shift-ins
← →
zol (2007-01-02 21:35) [7]
> Desdechado © (02.01.07 21:20) [5]
А как действительно можно разрешить ввод "-" или "+"?
← →
Ученик чародея © (2007-01-02 22:26) [8]А может проще проверять весю строку на OnChange?
← →
azl © (2007-01-03 00:03) [9]
> Desdechado © (02.01.07 21:20) [5]
> Ненормально. Нормальные системы позволяют вводить числа
> без лидирующего нуля, например ",9" или "-,04".
Я вообще пользуюсь RxCalcEdit, там можно ставить запятую первой, ноль автоматически добавляется.
Но здесь нет никаких проблем, достаточно убрать или заремить{(vrLength-vrPos>I)and(vrSelStart>=vrPos)}
if vrPos>0 then
Key:=#0; //"погасить" клавишу
> Маньячество. Бедные пользователи.
Причем здесь пользователи? Пользователь может вводить, как точку, так и запятую. Это и сделано для перевода на русскую систему (визуально), в которой вместо точки ставится запятая.
> А как насчет Delete, Tab и Esc?
А зачем гасить Delete, Tab и Esc?
> Кстати, плюс и минус ты считаешь лишними при вводе чисел?
Я не пойму, ты прикалуешься?
Что в лом, добавить знак минус и плюс?case Key of "0".."9","-","+" : begin
← →
MsGuns © (2007-01-03 12:31) [10]function MS_ComFnCheckSymbolForFloatText(Edit: TEdit; Key: Char): Char;
begin
result := Key;
with Edit do
if not (Key in ["0".."9","-",",",Char(VK_BACK),Char(VK_TAB)]) or
((Key=",") and (Pos(Key,Text)>0)) or
((Key="-") and ((Pos(Key,Text)>0) or (SelStart>0))) then result := #0;
end;
Вызов функции в событии OnKeyPress эдита:
Key := MS_ComFnCheckSymbolForFloatText(Key);
← →
Desdechado © (2007-01-03 13:43) [11]azl © (03.01.07 00:03) [9]
> Я не пойму, ты прикалуешься?
Скорее ты прикалываешься. Давать код, не оговаривая границы его применения, не вежливо.
> А зачем гасить Delete, Tab и Esc?
Вот и я спрашиваю: зачем? Ведь ты//"погасить" все остальные клавиши
> Что в лом, добавить знак минус и плюс?
Мне нет, но у тебя получится минус в середине числа.
> Я вообще пользуюсь RxCalcEdit
На здоровье. А свой код на чем тестировал?
← →
zol (2007-01-03 16:19) [12]
> azl © (03.01.07 00:03) [9]
Короче говоря нужно добавить:procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var //цифровая маска
vrPos,vrLength,vrSelStart : byte;
const
i : byte=5; //I+1 = количество знаков после запятой (в данном случае - 5 знака)
begin
with Sender as TEdit do
begin
vrLength:=Length(Text); //определяем длину текста
vrPos:=Pos(",", Text); //проверяем наличие запятой
vrSelStart:=SelStart; //определяем положение курсора
end;
case Key of "0".."9","-","+" : begin
//проверяем положение курсора и количество знаков после запятой
if (vrPos>0)and(vrLength-vrPos>I)and(vrSelStart>=vrPos) then
Key:=#0; //"погасить" клавишу
end;
",","." : begin
//если запятая уже есть или запятую пытаются поставить перед числом или никаких цифр в поле ввода еще нет
if (vrPos>0)or(vrSelStart=0)or(vrLength=0) then
Key:=#0 //"погасить" клавишу
else Key:=#44; //всегда заменять точку на запятую
end;
#8 : ; //позволить удаление знаков клавишей "Back Space"
else Key := #0; //"погасить" все остальные клавиши
end;
end;
В принципе всё здесь меня устраивает, хоть может есть какието извилины...
> MsGuns © (03.01.07 12:31) [10]
В OnKeyPress эдита при компиляции выдает ошибку:
Incompatible types: "TEdit" and "Char"
← →
azl © (2007-01-03 17:10) [13]Desdechado,
1. Что значит не оговаривая границы его применения? Я четко дал код, как просили, чтобы можно было вводить только цифры и точку или запятую.
2.
> Вот и я спрашиваю: зачем? Ведь ты //"погасить" все остальные
> клавиши
Не надо придираться к словам. Клавиши Delete, Tab и Esc не гасятся, имеется в виду все буквенные и символьные клавиши.
3. почитай внимательно вопрос. Там разве просили, чтобы можно был знак плюс или минус вводить? Если надо, то можно доработать.
4. Что значит на чем тестировал? Код, который я привел работает на 100% в соостветствии с вопросом. И тестировал я его на многих програмках, в которых не использовал RxLib. Иногда люди просят помочь решить задачу, чтобы не было сторонних компонентов.
← →
zol (2007-01-03 17:18) [14]
> 3. почитай внимательно вопрос. Там разве просили, чтобы
> можно был знак плюс или минус вводить? Если надо, то можно
> доработать.
Надо, очень прошу. И не нужно ссорится!
И еще можно как-нить предусмотреть, если пользователь забудет вообще ввести цифры в Edit(или введет только "-" или "+")?
← →
azl © (2007-01-03 17:39) [15]zol, ОК. Сейчас помозгую.
Мы не ссоримся, рабочие моменты. В споре рождается истина.
← →
Tifon © (2007-01-03 17:40) [16]>И еще можно как-нить предусмотреть, если пользователь забудет вообще >ввести цифры в Edit(или введет только "-" или "+")?
Для этого можно просто проверять всю строку по символьно на наличие в ней цифры.
Когда мне нужно было запретить ввод букв, а оставить только цифры я просто написал функцию проверки, Integer ли данная строка и просто запускал ее по Edit1.OnChange
Вот сама функция:
...
var
...
Cifri : array [0..9] of integer;
...
function CheckInt(Stroka : string) : boolean;
var
i, j : integer;
str, str2 : string;
begin
for i := 1 to 10 do
Cifri[i] := i - 1;
str := Stroka;
for i := 1 to Length(str) do
for j := 1 to 10 do
if str[i] = IntToStr(Cifri[j]) then str2 := str2 + str[i];
if (str = str2) and (str <> "") then CheckInt := true
else CheckInt := false;
end;
За строку здесь можно выдавать нововведенный сивол или опять просто отдавать всю строку а в массив Cifri добавить необходимые тебе знаки и сделать его string.
← →
azl © (2007-01-03 18:05) [17]Вот, пожалуйста. Запятую можно ставить перед числом, программа сама поймет, что перым ноль идет. Знак плюс я у брал ибо он не нужен. Если не стоит знак " - " - значит число отрицательное, иначе число положительное.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var //цифровая маска
vrMin,vrPos,vrLength,vrSelStart : byte;
const
i : byte=1; //I+1 = количество знаков после запятой (в данном случае - 2 знака)
begin
with Sender as TEdit do
begin
vrLength:=Length(Text); //определяем длину текста
vrPos:=Pos(",", Text); //проверяем наличие запятой
vrMin:=Pos("-", Text); //проверяем наличие знака минус
vrSelStart:=SelStart; //определяем положение курсора
end;
case Key of "0".."9" : begin
//проверяем положение курсора и количество знаков после запятой
if (vrPos>0)and(vrLength-vrPos>I)and(vrSelStart>=vrPos) then
Key:=#0; //"погасить" клавишу
end;
",","." : begin
//если запятая уже есть
if vrPos>0 then
Key:=#0 //"погасить" клавишу
else Key:=#44; //всегда заменять точку на запятую
end;
"-" : begin
//если минус уже есть или минус пытаются поставить после числа
if (vrMin>0)or(vrSelStart>0)or(vrLength>0) then
Key:=#0 //"погасить" клавишу
end;
#8 : ; //позволить удаление знаков клавишей "Back Space"
else Key := #0; //"погасить" все остальные клавиши
end;
end;
> И еще можно как-нить предусмотреть, если пользователь забудет
> вообще ввести цифры в Edit(или введет только "-" или "+")?
>
Что предусмотреть?
← →
Desdechado © (2007-01-03 18:14) [18]azl © (03.01.07 17:10) [13]
За Tab и Del сорри. Недоглядел.
Но про вставку белиберды из буфера ты так и не отреагировал.
Да и с плюсами/минусами у тебя выйдет "00+11---,50". Кстати, лидирующиемногократные
нули нужны еще меньше, чем нулевая дробная часть.
Да, кстати, если ты уж так блокировал ввод запятой в первой позиции//если запятую пытаются поставить перед числом или никаких цифр в поле ввода еще нет
, то это можно легко обойти путем ввода цифры, запятой, а потом убиения цифры.
Это я все веду к тому, что нефиг геморроиться, а имхо лучше Desdechado © (02.01.07 20:31) [1]
← →
Tifon © (2007-01-03 18:24) [19]azl, а вот мой код, правда он не предусматривает расположения запятой и знаков + и -, но он не допустит ничего левого в твое поле кроме разрешенных знаков, если его немного доработать, то все должно быть так как надо:
var
...
Znaki : array [0..14] of string;
CifriExists : boolean;
...
function CheckInt(Stroka : string) : boolean;
var
i, j : integer;
str, str2 : string;
begin
CifriExists := false;
for i := 1 to 10 do
Znaki[i] := IntToStr(i - 1);
Znaki[11] := ".";
Znaki[12] := ",";
Znaki[13] := "+";
Znaki[14] := "-";
str := Stroka;
for i := 1 to Length(str) do
for j := 1 to 14 do
if str[i] = Znaki[j] then
begin
if j <= 10 then CifriExists := true;
str2 := str2 + str[i];
end;
if (str = str2) and (str <> "") then CheckInt := true
else CheckInt := false;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
Texts : string;
i : integer;
a : string;
begin
if (Sender as TEdit).Text <> "" then
begin
Texts := (Sender as TEdit).Text;
for i := 1 to Length(Texts) do
begin
a := Texts[i];
if not CheckInt(a) then
begin
Delete(Texts, i, 1);
end;
end;
(Sender as TEdit).Text := Texts;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if CifriExists then ShowMessage(""); // это проверка на наличие цифры в
// строке после нажатия на какую-либо
// кнопку
end;
end.
← →
azl © (2007-01-03 18:45) [20]Desdechado, да, из буфера действительно можно вставит, только через Shift + Ins. Тут кумекать надо сидеть.
Про запятую исправил, перед числом можно уже ставить.
Плюсы и минусы исправил. Минус можно поставить только в начале. Собственно говоря, ввод плюсов я вообще убрал. Зачем они нужны? Если стоит минус - число отрицательно, если не стоит минус - число положительное.
А вообще, я тоже считаю, что лучше использовать RxCalcEdit или MaskEdit.
← →
azl © (2007-01-03 18:49) [21]Tifon, а как на счет ввода нескольких запятых и точек? Твой код позволяет вводить много точек и запятых
← →
zol (2007-01-03 19:28) [22]to azl ©
> Что предусмотреть?
предусмотреть в Edit-е введена цыфра или нет.К примеру програ решает квадратн. ур.-ние. Ax^2+Bx+C=O; где A,B,C - есть полями ввода числа(Edit1,Edit2,Edit3).Если в какое-нить из полей не ввести число- то хана- покажется огромнейший матюк на экране. Так вот как этого избежать?
Может по выполнению решения уравнения(к примеру)procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text=""
then
begin
Edit1.Color:=clRed;
ShowMessage("Введите какую-нить байду в ячейку");
end;
end;
end.CODE>
Как можно сделать чтоб Edit1 стал красным на несколько секунд(мигнул), а потом опять стал нормального цвета(clWindow)?
← →
MsGuns © (2007-01-03 19:39) [23]>zol (03.01.07 16:19) [12]
>В OnKeyPress эдита при компиляции выдает ошибку:
>Incompatible types: "TEdit" and "Char"
Блин, а сообразить ?:
Key := MS_ComFnCheckSymbolForFloatText(TEdit(Sender),Key);
Совсем новичок, что ли ?
Все, начиная с [12] безобразно ;)
← →
MsGuns © (2007-01-03 19:45) [24]>azl © (03.01.07 17:39) [15]
>В споре рождается истина.
Если спорящие хоть иногда почитывают книжки и хэлпы ;)
>Tifon © (03.01.07 17:40) [16]
>Tifon © (03.01.07 18:24) [19]
Я извиняюсь.. Кто Вас научил так страшно программировать ?
← →
azl © (2007-01-03 20:07) [25]MsGuns
> Если спорящие хоть иногда почитывают книжки и хэлпы ;)
Это точно.
zol. Ну, это вообще проще пареной репы. Перед тем, как считывать данные с Edit"ов проверять
if (Edit1.Text <> "") or (Edit1.Text <> "-") then
//считать
else
ShowMessage("Не введено значение");
← →
zol (2007-01-03 20:50) [26]Спасибо большое(даже огромнейшее)! Дело в том что читаю одно - пробую применяю на практике - тут же кричат "Где тебя учили так писать...". Может у каждого свой подход к программированию?
← →
MsGuns © (2007-01-03 21:04) [27]>zol (03.01.07 20:50) [26]
>Может у каждого свой подход к программированию
Речь не о подходе, а о стиле мышления. Если человек МЫСЛИТ так, как в [19], ему надо быстро-быстро менять профессию. Например, вэб-дизайнить, или там продавать чего-нибудь.
Проще всего подглядеть "правильный" подход к программированию в самой делфе, в исходниках VCL.
← →
kingsoft © (2007-01-03 23:52) [28]Вот более лёгкий и понятный код.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in [ #8,"0".."9"]) then key :=#0;
end;
#8 - значит использование клавиш редоктирования
в одинарных кавачках " " введи символы которые ты хочешь чтобы вводились, но а в остальном всё просто.
← →
zol (2007-01-04 00:06) [29]
> kingsoft © (03.01.07 23:52) [28]
Спасибо, в сравнениис azl © (03.01.07 18:05) [17]
- компактненько, но меньше преимуществ.
← →
Palladin © (2007-01-04 00:08) [30]
> [28] kingsoft ©
#8 означает клавишу backspace
редактирование пишется через а, потому что редокторов не бывает...
← →
Palladin © (2007-01-04 00:10) [31]ну и забыл добавить что кроме #8 существует еще куча управляющих символов, подробности о которых можно узнать поискав в google таблицу символов ASCII
← →
MsGuns © (2007-01-04 00:31) [32]>zol (04.01.07 00:06) [29]
>в сравнении с azl © (03.01.07 18:05) [17] - компактненько, но меньше преимуществ.
? Так компактненько, что игнорирует backspace, а также не позволяет вводить дроби и отрицательные числа. В [17] написан УЖОС !
Чем не нравится [10] с поправкой в [24] для особо ленивых ?
Хотя, конечно, надо учитывать замечания Палладина и вставку из буфера
← →
zol (2007-01-04 13:27) [33]
> MsGuns © (04.01.07 00:31) [32]
Сижу сейчас пробую [17] и [10]. Если б их как нибудь соединить в одну процедуру, а потом пораздавать всем Edit.
← →
Tifon © (2007-01-04 15:29) [34]> Если б их как нибудь соединить в одну процедуру, а потом пораздавать всем Edit.
Ты просто пиши вместе имени Edit"а такую строку
(Sender as TEdit) и дальше работай с ней как с Edit"ом, а в событие OnChange или OnKeyPress(смотря какое будешь использовать) присвой чтоб все Edit"ы выполняли команду, например Edit1.OnChange, а в самой Edit1.OnChange пишешь свою процедуру. И все.
To MsGuns (03.01.07 19:45) [24]
>Я извиняюсь.. Кто Вас научил так страшно программировать ?
А что собственно плохого в моем программировании, я не хочу сказать что я хороший программист, но мне казалось что не настолько плохой чтоб вот так говорили о моем коде. Что там плохого?
← →
MsGuns © (2007-01-04 15:34) [35][10] делает все, что и [17], кроме ограничения по кол-ву десятичных знаков дроби. Если это так важно, то в [10] надо добавить проверку ввода "лишнего" знака
Если цифра и есть разделитель и позиция курсора больше позиции разделителя, то key := #0
Никакие локальные переменные, загромождающие код, в данном случае просто не нужны.
И все ;)
← →
Tifon © (2007-01-04 15:42) [36]To MsGuns © (04.01.07 15:34) [35]
Если это сообщение хоть как-то ко мне относилось, тогда я все-таки спрошу.
По-моему сейчас машины достигли того уровня что будь в коде даже 100 локальных переменных, а сама програ просто будет выдать 300 раз "Привет", это ее не загромоздит, очень сильно, т.е. ты хочешь сказать что мой код плохой потому что он длинный и в нем используются дополнительные переменные и даже массивы?
← →
MsGuns © (2007-01-04 15:49) [37]Код пишется не столько для "машины", сколько для человека, кторый будет его разбирать. Ваш код крайне громоздок и неинформативен, пресыщен лишними операторами, переменными и т.д. Кроме того, он просто нерабочий
← →
MetalFan_pda (2007-01-04 15:57) [38][36]
пример кода,приведенный вами ранее просто ужасен. уровня начинающего программиста.
можно функции через 1000 строк вместо 10 реализовывать... но зачем? как потом другим в этой писанине разбираться?!
← →
azl © (2007-01-04 16:06) [39]MsGuns © И что же ужасного в [17]? Собственно говоря, в [17] тот же код, что и в [2], слегка доработанный по просьбе автора вопроса.
← →
MetalFan_pda (2007-01-04 16:33) [40][36]
пример кода,приведенный вами ранее просто ужасен. уровня начинающего программиста.
можно функции через 1000 строк вместо 10 реализовывать... но зачем? как потом другим в этой писанине разбираться?!
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.044 c