Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

заблокировать(запретить) ввод в TEdit [D7, XP]


Страницы:   1 2 3

zol ©   (2007-01-02 20:12:00) 

Здравствуйте.Подскажите как можно заблокировать(запретить) ввод текста и символов в TEdit.Чтоб в него можно было вводить только цифры и точку(или запятую). короче говоря для ввода с подальшей работой математикu...


MsGuns   (2007-01-03 19:45:00) [21]

>azl ©   (03.01.07 17:39) [15]
>В споре рождается истина.

Если спорящие хоть иногда почитывают книжки и хэлпы ;)

>Tifon ©   (03.01.07 17:40) [16]
>Tifon ©   (03.01.07 18:24) [19]

Я извиняюсь.. Кто Вас научил так страшно программировать ?


MsGuns   (2007-01-03 19:39:00) [22]

>zol   (03.01.07 16:19) [12]
>В OnKeyPress эдита при компиляции выдает ошибку:
>Incompatible types: 'TEdit' and 'Char'

Блин, а сообразить ?:

Key := MS_ComFnCheckSymbolForFloatText( TEdit(Sender),Key);

Совсем новичок, что ли ?

Все, начиная с [12] безобразно ;)


zol   (2007-01-03 19:28:00) [23]

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)?


azl   (2007-01-03 18:49:00) [24]

Tifon, а как на счет ввода нескольких запятых и точек? Твой код позволяет вводить много точек и запятых


azl   (2007-01-03 18:45:00) [25]

Desdechado, да, из буфера действительно можно вставит, только через Shift + Ins. Тут кумекать надо сидеть.

Про запятую исправил, перед числом можно уже ставить.

Плюсы и минусы исправил. Минус можно поставить только в начале. Собственно говоря, ввод плюсов я вообще убрал. Зачем они нужны? Если стоит минус - число отрицательно, если не стоит минус - число положительное.

А вообще, я тоже считаю, что лучше использовать RxCalcEdit или MaskEdit.


Tifon   (2007-01-03 18:24:00) [26]

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.


Desdechado   (2007-01-03 18:14:00) [27]

azl ©   (03.01.07 17:10) [13]
За Tab и Del сорри. Недоглядел.

Но про вставку белиберды из буфера ты так и не отреагировал.
Да и с плюсами/минусами у тебя выйдет "00+11---,50". Кстати, лидирующие многократныенули нужны еще меньше, чем нулевая дробная часть.

Да, кстати, если ты уж так блокировал ввод запятой в первой позиции //если запятую пытаются поставить перед числом или никаких цифр в поле ввода еще нет, то это можно легко обойти путем ввода цифры, запятой, а потом убиения цифры.

Это я все веду к тому, что нефиг геморроиться, а имхо лучше Desdechado ©   (02.01.07 20:31) [1]


azl   (2007-01-03 18:05:00) [28]

Вот, пожалуйста. Запятую можно ставить перед числом, программа сама поймет, что перым ноль идет. Знак плюс я у брал ибо он не нужен. Если не стоит знак ' - ' - значит число отрицательное, иначе число положительное.

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(или введет только "-" или "+")?
>


Что предусмотреть?


Tifon   (2007-01-03 17:40:00) [29]

>И еще можно как-нить предусмотреть, если пользователь забудет вообще >ввести цифры в 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 17:39:00) [30]

zol, ОК. Сейчас помозгую.
Мы не ссоримся, рабочие моменты. В споре рождается истина.


zol   (2007-01-03 17:18:00) [31]


> 3. почитай внимательно вопрос. Там разве просили, чтобы
> можно был знак плюс или минус вводить? Если надо, то можно
> доработать.

Надо, очень прошу. И не нужно ссорится!

И еще можно как-нить предусмотреть, если пользователь забудет вообще ввести цифры в Edit(или введет только "-" или "+")?


azl   (2007-01-03 17:10:00) [32]

Desdechado,
1. Что значит не оговаривая границы его применения? Я четко дал код, как просили, чтобы можно было вводить только цифры и точку или запятую.

2.
> Вот и я спрашиваю: зачем? Ведь ты //"погасить" все остальные
> клавиши

Не надо придираться к словам. Клавиши Delete, Tab и Esc не гасятся, имеется в виду все буквенные и символьные клавиши.

3. почитай внимательно вопрос. Там разве просили, чтобы можно был знак плюс или минус вводить? Если надо, то можно доработать.

4. Что значит на чем тестировал? Код, который я привел работает на 100% в соостветствии с вопросом. И тестировал я его на многих програмках, в которых не использовал RxLib. Иногда люди просят помочь решить задачу, чтобы не было сторонних компонентов.


zol   (2007-01-03 16:19:00) [33]


> 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'


Desdechado   (2007-01-03 13:43:00) [34]

azl ©   (03.01.07 00:03) [9]
> Я не пойму, ты прикалуешься?
Скорее ты прикалываешься. Давать код, не оговаривая границы его применения, не вежливо.

> А зачем гасить Delete, Tab и Esc?
Вот и я спрашиваю: зачем? Ведь ты //"погасить" все остальные клавиши

> Что в лом, добавить знак минус и плюс?
Мне нет, но у тебя получится минус в середине числа.

> Я вообще пользуюсь RxCalcEdit
На здоровье. А свой код на чем тестировал?


MsGuns   (2007-01-03 12:31:00) [35]

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);


azl   (2007-01-03 00:03:00) [36]


> 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


Ученик чародея   (2007-01-02 22:26:00) [37]

А может проще проверять весю строку на OnChange?


zol   (2007-01-02 21:35:00) [38]


> Desdechado ©   (02.01.07 21:20) [5]


А как действительно можно разрешить ввод "-" или "+"?


Desdechado   (2007-01-02 21:20:00) [39]

я уж не говорю по ctrl-V и shift-ins


Desdechado   (2007-01-02 21:20:00) [40]

azl ©   (02.01.07 20:34) [2]
//если запятую пытаются поставить перед числом или никаких цифр в поле ввода еще нет
Ненормально. Нормальные системы позволяют вводить числа без лидирующего нуля, например ",9" или "-,04".

//всегда заменять точку на запятую
Маньячество. Бедные пользователи.

//"погасить" все остальные клавиши
А как насчет Delete, Tab и Esc?

Кстати, плюс и минус ты считаешь лишними при вводе чисел?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо