![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
заблокировать(запретить) ввод в TEdit [D7, XP]
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?
Кстати, плюс и минус ты считаешь лишними при вводе чисел?