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

Вниз

заблокировать(запретить) ввод в 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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.047 c
15-1167755821
Смаг
2007-01-02 19:37
2007.01.21
Люди Деда мороза НЕТ!!! Я в шоке...


2-1167324232
xeron
2006-12-28 19:43
2007.01.21
KillTimer


2-1167919661
kwotz
2007-01-04 17:07
2007.01.21
Выбор пути!


3-1162203703
Wolferio
2006-10-30 13:21
2007.01.21
Редактирование в DbGrid


2-1167834212
tio
2007-01-03 17:23
2007.01.21
MDI