Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.18;
Скачать: [xml.tar.bz2];

Вниз

Помогите доработать код, ввод 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 вся ветка

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

Наверх





Память: 0.5 MB
Время: 0.008 c
14-58843
kopcap
2003-08-30 19:03
2003.09.18
JavaScript


14-58918
Digitman
2003-08-28 15:21
2003.09.18
Небольшой вопрос по спецификации ANSI C++


14-58831
andre
2003-08-29 03:18
2003.09.18
Сабж


7-58942
hawkins
2003-06-29 08:51
2003.09.18
автозапуск программы перед выключением


14-58840
Knight
2003-08-30 14:45
2003.09.18
Принимаю поздравления





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