Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 реализовывать... но зачем? как потом другим в  этой писанине разбираться?!


 
MetalFan_pda   (2007-01-04 16:38) [41]

[36]
пример кода,приведенный вами ранее просто ужасен. уровня начинающего программиста.
можно функции через 1000 строк вместо 10 реализовывать... но зачем? как потом другим в  этой писанине разбираться?!


 
MetalFan_pda   (2007-01-04 16:40) [42]

[36]
пример кода,приведенный вами ранее просто ужасен. уровня начинающего программиста.
можно функции через 1000 строк вместо 10 реализовывать... но зачем? как потом другим в  этой писанине разбираться?!


 
MetalFan_pda   (2007-01-04 16:53) [43]

ай-ай-ай.как покетИЕ проглючило.потрите плз дубли!


 
Tifon ©   (2007-01-04 16:54) [44]

To MsGuns
Ну насамом деле я и вправду программирую около полутора года, но все равно надеялся что я не настолько ламер:(. Ну ладно спасибо закритику, заслуженную.



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

Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.039 c
2-1167160588
Серый
2006-12-26 22:16
2007.01.21
Запрет ввода


2-1167415128
allrussia
2006-12-29 20:58
2007.01.21
Как узнать индекс выделенного элемента в PopupMenu?


15-1167619282
Petr V. Abramov
2007-01-01 05:41
2007.01.21
просьба никому 10 мин не постиь ниче!


15-1167809375
Хмм
2007-01-03 10:29
2007.01.21
DLL .... а можно ли...


6-1155850398
Victor!
2006-08-18 01:33
2007.01.21
Проблемма с TIdTCPClient.ReadLn в Delphi 7





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский