Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-54935
Dmitriy_R
2003-02-21 10:06
2003.04.17
Определить режим работы LPT порта.


3-54503
LOGic
2003-03-26 18:38
2003.04.17
TRxMemoryData


3-54471
Sirus
2003-03-24 07:22
2003.04.17
Как программно сделать Interbase shutdown???


3-54465
Dr_MoZ
2003-03-28 13:14
2003.04.17
Русские буквы в Database Desktop 7.0


3-54514
AlexandrN
2003-03-26 09:16
2003.04.17
Копирование иерархий(поддеревьев в дереве)





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