Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизОчень хитрый Эдит Найти похожие ветки
← →
elf_123 (2003-04-01 22:28) [0]Здравствуйте!
Вопрос: как сделать чтобы в эдит вводились лишь цифры?
я пробовал много стандартных способов, но либо они не пашут, либо у меня /dev/hands кривые...
← →
y-soft (2003-04-01 22:52) [1]Посмотрите исходники TSpinEdit (\Source\Samples\spin.pas)
← →
elf_123 (2003-04-01 23:45) [2]TSpinEdit по крайней мере в Delphi/C++ Builder 6.0 не<3.14> имеет для блокировки букв!!! И вылетает в эксепшн, если написать букву и увеличить значение!!!
← →
Юрий Зотов (2003-04-02 00:15) [3]SetWindowLong(Edit1.Handle, GWL_STYLE,
GetWindowLong(Edit1.Handle, GWL_STYLE) or ES_NUMBER);
← →
Poison (2003-04-02 00:53) [4]Можно описать обработчик события OnKeyPress для Edit. В нем сделай проверку на символы нажимаемые на клавиатуре (проверяй пкременную KEY).
← →
TY (2003-04-02 01:58) [5]procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If not (Key in ["0".."9",DecimalSeparator]) Then Key:=#0;
end;
← →
VID (2003-04-02 02:27) [6]to ty: и ещё куча всяких доп клавищ, типа Delete, BackSpace, влево, вправо, ctrl+c, ctrl+v, ctrl+x, ctrl+z
:))))
нет, это не метод :)
← →
TY (2003-04-02 03:38) [7]Вы не правы это был просто пример а не готовое решение
чтобы довести это дело до ума програмист должен
думать а не смотреть на какие то универсальные примеры
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If Key<>#8 or (и т. д.) Then
If not (Key in ["0".."9",DecimalSeparator]) Then Key:=#0;
end;
← →
y-soft (2003-04-02 08:01) [8]>elf_123 © (01.04.03 23:45)
Чем дальше, тем меньше понятно, что Вы хотите. Приведите код и условия задачи.
← →
Жук (2003-04-02 08:08) [9]Я вот так это реализовал :
procedure TFPrinc.Edit1Change(Sender: TObject);
begin
if Edit1.Text=" " then begin
Edit1.Text:="";
Exit;
end;
if Edit1.Text="" then Exit;
with Edit1 do
try
StrToInt(Text);
except
Text:=Copy(Text,1,SelStart-1)+Copy(Text,SelStart+1,Length(Text)-SelStart);
SelStart:=Length(Text);
end;
end;
← →
Юрий Зотов (2003-04-02 08:43) [10]Нет слов.
← →
TY (2003-04-02 09:04) [11]>y-soft ©
-Супер код!-
← →
TY (2003-04-02 09:11) [12]Перепутал к кому обращаюсь
Жук ©
-Супер код!-
← →
y-soft (2003-04-02 09:11) [13]Да уж:(
← →
Жук (2003-04-02 09:14) [14]Что-то не так ? :-)
← →
TY (2003-04-02 09:23) [15]Жук © Идея имеет право на существование, но вот реализована
конечно не так. При вводе нескольких цифр например Едит воообще
затыкаеся.
Не обижайся но вот это свсем не то если выразится мягко
if Edit1.Text=" " then begin
Edit1.Text:="";
Exit;
end;
Да собственно и остальное, но ни идея.
← →
Жук (2003-04-02 09:27) [16]
> TY (02.04.03 09:23)
> При вводе нескольких цифр например Едит воообще
> затыкаеся.
Что сие означает ?
← →
y-soft (2003-04-02 09:35) [17]>Жук © (02.04.03 09:14)
Плохо то, что проверка выполняется уже после того, как ввод выполнен. Так делают только в очень редких случаях, когда ничего другого не остается, т.к. слишком нерационально, медленно и лишние перерисовки. Сама процедура проверки тоже выполнена некрасиво - вдумайтесь, сколько лишних действий Вы заставляете выполнять ОС там, где все можно делать гораздо проще...
← →
TY (2003-04-02 09:41) [18]А то и означает ввожу десять циф и дальше ввести цифры нет возможности.
← →
Жук (2003-04-02 09:49) [19]
> y-soft © (02.04.03 09:35)
Согласен, что не красиво, но ведь очень трудоёмко отследить, то что будет в Едите.
Простой пример : в буфере памяти хранится число (или не число), как вы сумеете в одном случае допустить копирование в Едит, а в другом нет ? Неужели при каждом нажатии сочетания клавиш Shift+Insert вы сначала будете проверять содержимое буфера ?
Я думаю, что вы согласитесь, что это нерационально.
← →
KPP (2003-04-02 09:49) [20]оптимально в обработчике кейпресс
if not(Key in["0".."9",#8,#3,#22,#24,#26])then key:=#0;
← →
y-soft (2003-04-02 09:58) [21]>Жук © (02.04.03 09:49)
А для чего существуют
WM_PASTE, WM_CUT?
И уберите рекурсию - изменение текста в обработчике OnChange повторно вызывает этот же обработчик
← →
Жук (2003-04-02 09:58) [22]
> TY (02.04.03 09:41)
> А то и означает ввожу десять циф и дальше ввести цифры нет
> возможности.
Почему ?
← →
y-soft (2003-04-02 10:01) [23]>Жук © (02.04.03 09:58)
Length(IntToStr(MAXINTEGER)) = 10;
Length(IntToStr(MININTEGER)) = 11;
← →
Жук (2003-04-02 10:04) [24]
> y-soft ©
if Length(Text)>10 then begin...end;
:-)))
← →
y-soft (2003-04-02 10:08) [25]>Жук © (02.04.03 10:04)
А если необходимо обрабатывать Int64?:)
← →
Жук (2003-04-02 10:14) [26]
> y-soft © (02.04.03 10:08)
Чем препиратся по пустякам запостили бы лучше свой вариант, плз.
← →
y-soft (2003-04-02 10:26) [27]>Жук © (02.04.03 10:14)
Самое простое - делать так, как сказал Юрий Зотов ©, но тут есть одна тонкость - вставку из буфера обмена все равно придется отлавливать (глюк Windows).
А если требуется расширенная функциональность, то за образец все-таки рекомендую взять код TSpinEdit, просто удалите из него все, связанное с кнопками и измените тип значения со SmallInt на Integer.
Могу, конечно, выслать и свой вариант, но какой интерес использовать готовенькое?
← →
Visit (2003-04-02 10:34) [28]Мне кажется можно взять RXCalcEdit и это решит все проблемы
← →
Sandman (2003-04-02 10:35) [29]Юрий Зотов
Попробовал Ваше решение. Красиво!
Но только есть проблема со вставкой из буфера - возможна вставка букв. Нет ли какой-нибудь WinAPI функции для ограничения принятия содержимого буфера?
Типа SetClipBoardFormat(CBF_Number)?
← →
Silver_ (2003-04-02 11:10) [30]MaskEdit ни коим боком суда не влезет :)
← →
Soft (2003-04-02 11:33) [31]Поищи на Яндексе компонент TSSDigitalEdit.
← →
y-soft (2003-04-02 17:35) [32]>Жук © (02.04.03 10:14)
Выложил рабочий пример на http://y-soft.narod.ru/examples/NumEdit.zip
← →
Юрий Зотов (2003-04-02 22:39) [33]Уря! Не прошло и суток - и сложнейшая проблема решена!
Или еще не решена?
← →
elf_123 (2003-04-03 17:22) [34]Спасибо всем, но за время оффлайна я уже решил задачу сам
Кстати, кто коворил что при OnKeyPress нужно кучу символов писать?
if (((key<"0")||(key>"9"))&&(key==8)) key=0;
то есть на паскале
if ((key<"0") OR (key>"9")&&(key<>8) then key:=0;
Вот и всё!
← →
Nimbus (2003-04-05 02:10) [35]
> elf_123 ©
Ваш код сработает, если вводить что-либо с клавиатуры, а если воспользоваться буфером обмена, то, к сожалению, он не сработает!! :-))
Так что Вот и НЕ всё!> :-))
P.S. см. выше...
← →
Chlavik (2003-04-05 02:32) [36]Самий ЖИРНЫй, простенький способ это
SetWindowLong(Edit1.Handle, GWL_STYLE,
GetWindowLong(Edit1.Handle, GWL_STYLE) or ES_NUMBER);
который сдесь прозвучал...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c