Вниз
Скачать: CL | DM;

Помогите доработать код, ввод Edit только цифр+запятая+backsp   Найти похожие ветки 

← →
Yuraz ©   (2003-09-02 09:01) [0]

if not (Key in["0".."9"]) then key:=#0;
Может быть нажата точка (на нумлоке при разных языках), и заменится на запятую.


← →
Song ©   (2003-09-02 09:04) [1]

Дык добавь точку и BackSpace в набор символов.


← →
Yuraz ©   (2003-09-02 09:08) [2]

а какой код у BackSpace?


← →
Song ©   (2003-09-02 09:09) [3]

Chr(VK_BACK)


← →
Мал0й   (2003-09-02 09:24) [4]

if not(Key in ["0".."9", #8, DecimalSeparator]) then Key := #0;


← →
Yuraz ©   (2003-09-02 09:24) [5]

Сделал код,
if not (Key in[",","0".."9", Chr(VK_BACK)]) then key:=#0;
if (Key in["."]) then key:=",";

и точку не заменяет, подскажите, плз, может сообщение какое обрабатывать, чтобы запятую дописывал?


← →
Yuraz ©   (2003-09-02 09:26) [6]

Мал0й
При Английской раскладке, NumLock выдаёт точку, при надатии на кл. "._DEL" и не заменяет.


← →
A_N_D ©   (2003-09-02 09:33) [7]

Сделал код,
if not (Key in[",","0".."9", Chr(VK_BACK)]) then key:=#0;
if (Key in["."]) then key:=",";
и точку не заменяет, подскажите, плз, может сообщение какое обрабатывать, чтобы запятую дописывал?


Попробуй
if (Key in["."]) then key:=",";
if not (Key in[",","0".."9", Chr(VK_BACK)]) then key:=#0;


← →
Мал0й   (2003-09-02 09:34) [8]

DecimalSeparator не зависит от раскладки
Запомни текущий DecimalSeparator
Var CurrDecimalSeparator: Char;
CurrDecimalSeparator:= DecimalSeparator;
Если нужна именно запятая, то
Case DecimalSeparator of
",":;
else
begin
CurrDecimalSeparator:= DecimalSeparator;
DecimalSeparator:= ",";
end;
end;
При зывершении программы не забудь вернуть на место
DecimalSeparator:= CurrDecimalSeparator;


← →
Спрашивающий_   (2003-09-02 09:41) [9]

А еще бы не мешало добавить "E" наример 10E5-тоже число


← →
FoxBox   (2003-09-02 10:16) [10]

А TMaskEdit уже не котируется? Кстати компонентов, сходных с TMaskEdit, большое количество. Зачем изобретать собственный велосипед?


← →
Романов Р.В. ©   (2003-09-02 10:25) [11]


> FoxBox (02.09.03 10:16) [10]

Велосипеды разные бывают...


← →
Так себе   (2003-09-02 10:36) [12]

2 FoxBox (02.09.03 10:16) [10]
Я чо-то не нашел TMaskEdit у TEdit


← →
Bob ©   (2003-09-02 10:41) [13]

Дык TMaskEdit отдельный компонент, и искать его надо на вкладке Additional


← →
FoxBox   (2003-09-02 10:53) [14]


> Романов Р.В.

С квадратными колесами?
------------------------
Как альтернатива - компоненты rxlib ( www.rxlib.ru )
компоненты халявные, даже с исходниками. Есть много чего интересного...


← →
Рамиль ©   (2003-09-02 11:00) [15]

А не судьба обрабатывать KeyPress и просто проверять TryStrToFloat? Если true, то пропускать символ...


← →
wl ©   (2003-09-02 11:00) [16]

у меня вопросик: числа всегда будут положительными, в смысле не нужно ли ещё добавить символ "-". Мне кажется так ограничивать TEdit нельзя, проще отловить Exception при переводе строка->число, которое всё-равно придётся делать, так как ограничение вводимых символов не является гарантией того, что пользователь введет правильное число


← →
Рамиль ©   (2003-09-02 11:14) [17]

Три строчки кода без никаких Exception

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
Str: string;
Res: extended;
begin
Str := (Sender as TEdit).Text;
insert(Key, Str, (Sender as TEdit).SelStart + 1);
if (not TryStrToFloat(Str, Res)) and not (Key = #8) then Key := #0;
end;


← →
Ice   (2003-09-02 12:31) [18]

Вот тябе код. проверено. работает при любых катаклизмах.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ["0".."9",",",".",chr(vk_back)]) then key:=#0;
if key="." then key:=",";
end;


← →
webPauk   (2003-09-02 12:59) [19]

2 Ice
дык ё! 2 запятых вставляет


← →
Anatoly Podgoretsky ©   (2003-09-02 13:10) [20]

wl © (02.09.03 11:00) [16]
Правильно, только не ограничивать не TEdit, а не ограничивать пользователся, ему виднее.


← →
Shalamberidze   (2003-09-02 17:08) [21]

Esli simvol = . pervaia stroka zamenit ee na #0 i vtoraia stroka ne srabotaet

if (Key in ["."]) then key:=",";
if Pos(",", StrokaVvoda) > 0 then key=#0;
if not (Key in[",","0".."9", Chr(VK_BACK)]) then key:=#0;


← →
IG   (2003-09-03 10:07) [22]

посмотрите код:
***************
procedure TfrmWarData.EditWeightKeyPress(Sender: TObject; var Key: Char);
var k,Kop,cPos: integer;
begin
if (Key=".") or (Key=",") then begin
Key:= ",";
// запрещаем ввод повторной запятой: ...
if (Pos(",",(Sender as TEdit).Text) > 0)
and (length((Sender as TEdit).SelText) = 0) then Key:= #0;
end;
// блокируем также всё, кроме цифр,"," и Backspace!
if not (Key in ["0".."9",",",#8]) then Key:=#0;
k:= Pos(",",(Sender as TEdit).Text);
cPos:= (Sender as TEdit).SelStart - k;
Kop:= length( Copy((Sender as TEdit).Text,k+1,10) );
if (k > 0) then begin
if ( ((Kop >=2) and (cPos >= 2)) or ((cPos in [0..2]) and (Kop >=2)) )
and (Key <> #8) then Key:= #0;
end;
end;
***************


← →
Vlad1 ©   (2003-09-05 22:38) [23]

По-моему, всё-таки блока try ... except (или хотя бы ApplicationEvents) достаточно - остальное извращения.


← →
Vlad1 ©   (2003-09-05 22:38) [24]

По-моему, всё-таки блока try ... except (или хотя бы ApplicationEvents) достаточно - остальное извращения.


← →
Дмитрий   (2003-09-07 11:09) [25]

Наиболее простой и удобный код написал Рамиль © (02.09.03 11:14) [17], единственное, чего он не учел - заменить точку на запятую. А затем любое преобразование текста в число явно выдаст есть ошибка или нет. Без всяких проверок на две запятые, на унареые минусы и прочую лабудень.


← →
KSergey ©   (2003-09-08 07:59) [26]

[25] Дмитрий (07.09.03 11:09)
Без всяких проверок на две запятые, на унареые минусы и прочую лабудень.


Вот и MaskEDit, похоже, такие же писатели делали.
Типа слабали лишь бы че, а то, что для работы с ним надо все делать "очень правильно, а иначе сам дурак" - видимо, так и надо.


← →
Рамиль ©   (2003-09-08 08:17) [27]


> единственное, чего он не учел - заменить точку на запятую.

Так зато будет работать независимо от установок Windows. Если уж так необходима именно точка, то надо использовать DecimalSeparator:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
Str: string;
Res: extended;
Sep: char;
begin
Str := (Sender as TEdit).Text;
insert(Key, Str, (Sender as TEdit).SelStart + 1);
Sep := DecimalSeparator;
DecimalSeparator := ".";
if (not TryStrToFloat(Str, Res)) and not (Key = #8) then Key := #0;
DecimalSeparator := Sep;
end;


← →
Comoderator ©   (2003-09-08 08:47) [28]

Автор давно получил кучу вариантов реализации.
[Тема закрыта]



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

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.016 c
8-58795
xman
2003-05-14 12:04
2003.09.18
Jpeg


1-58738
SH
2003-09-08 14:36
2003.09.18
распределение доступа


14-58888
Vlad Oshin
2003-08-29 13:56
2003.09.18
Задолбали менять начальников :( Один так говорит, другой так


3-58552
P0tia
2003-08-27 23:29
2003.09.18
Удаление строк из ListBox


6-58807
DimaS
2003-07-17 13:45
2003.09.18
Как зная название учетной записи, запустить виндовый диалог соед.




   Наверх