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

Вниз

Tedit   Найти похожие ветки 

 
poroshm   (2007-08-05 16:36) [0]

Как надо настроить TEdit  чтобы вводились только цифры?


 
Инс ©   (2007-08-05 16:46) [1]

SetWindowLong(Edit1.Handle,GWL_STYLE,GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);


 
{RASkov} ©   (2007-08-05 17:27) [2]

[1] - но этот способ отвечат на 100% вопроса:

> чтобы вводились только цифры

Т.е. уже никакие другие символы, такие как -+., , вводиться уже не будут....
Если нужно более шире, то обработывать нужно OnKeyXxxx и контролировать параметр Key.... который var....


 
Инс ©   (2007-08-05 17:30) [3]


>  [2] {RASkov} ©   (05.08.07 17:27)

Да и ваш способ на 100% не решает проблемы. Следующий вопрос будет, а как мне сделать, чтобы туда нельзя было вставить не-цифры. Ответ - перекрывать обработку WM_PASTE. В общем, все сводится к написанию своего компонента:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1140 + обсуждение


 
SergeIT   (2007-08-05 21:45) [4]

Что-нибудь вроде этого (использую больше 10 лет)

type
 TLetters = #32..#255;
 TLetSet = set of TLetters;
var
  _IntChars: TLetSet = ["0","1","2","3","4","5","6","7","8","9"];

function CheckString(var str: String; const let: TLetSet): Boolean;
var
  s: String;
  n, i: Integer;
begin
    Result := TRUE;
    s := "";
    n := Length(str);
    if n < 1 then exit;
    Result := FALSE;
    for i := 1 to n do
    begin
      if str[i] in let then s := s + str[i];
    end;
    if Length(s) = n then Result := TRUE else str := s;
end;

procedure EditCheckValue(Edit: TEdit; Let: TLetSet);
var
  i, n: Integer;
  s: String;
begin
 if NOT Edit.Focused then exit;
 i := Edit.SelStart;
 n := Length(Edit.Text);
 s := Edit.Text;
 if NOT CheckString(s, Let) then
 begin
   Edit.Text := s;
   i := i - (n - Length(s));
   if (i >= 0) AND (i <= Length(s)) then
        Edit.SelStart := i
   else Edit.SelStart := 0;
   if Edit.Focused then MessageBeep($FFFFFFFF);
 end;
end;


EditCheckValue вызывется в OnChange TEdit.


 
DVM ©   (2007-08-05 22:00) [5]

в OnKeyPress нужного Edit-а:

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


 
SergeIT   (2007-08-05 22:52) [6]


> в OnKeyPress

А Copy/Paste ?


 
Инс ©   (2007-08-05 22:55) [7]


> вызывется в OnChange TEdit.

Лично я противник таких методов. Модуль формы превращается в большую свалку, разобраться в которой по меньшей мере трудно.
Нужно просто создать свой компонент и бросить его на форму. Все будет чистенько и аккуратненько


 
Двигатель внешнего сгорания   (2007-08-05 23:07) [8]


> poroshm   (05.08.07 16:36) 
> Как надо настроить TEdit  чтобы вводились только цифры?


TMaskEdit использовать не получится?


 
{RASkov} ©   (2007-08-06 00:47) [9]

uses ...., Unit2;
type
 TEdit = class(TMyEdit); //Альтернатива "создания" нового компонента, т.е. без регистрации в палитре.
 
 TForm1 = class(TForm)
   Edit1: TEdit;
//...................................................
unit Unit2;
interface
uses Windows, Messages, StdCtrls;

const EM_AFTERPASTE = WM_USER+10;
     PASTE_CODE    = 22;
     MAX_LENGTH    = 10;

type
 TMyEdit = class(TEdit)
 protected
   procedure KeyPress(var Key: Char); override;
   procedure WndProc(var Mes: TMessage); override;
 end;

implementation

{ TMyEdit }
procedure TMyEdit.KeyPress(var Key: Char);
begin
 inherited;
 if ORD(Key) = PASTE_CODE then Exit;
 if not (Key in ["0".."9", #8]) then Key:=#0 else
  if ((Length(Text)>MAX_LENGTH-1) and (Key<>#8)) then
   if SelStart<MAX_LENGTH then SelLength:=1 else Key:=#0;
end;

procedure TMyEdit.WndProc(var Mes: TMessage);
var S: String; N: Integer;
begin
if Mes.Msg = WM_PASTE      then PostMessage(Handle, EM_AFTERPASTE, 0, 0);
if Mes.Msg = EM_AFTERPASTE then begin
 S:=Text;
 for N:= Length(S) downto 1  do if not (S[N] in ["0".."9"]) then Delete(S, N, 1);
 if Length(S)>MAX_LENGTH then SetLength(S, MAX_LENGTH);
 Text:=S;
end else inherited;
end;

end.

Но это так же "отсеивает" все кроме цифр(т.е. 100% решение вопроса)... под руку попался этот модуль.

> [8] Двигатель внешнего сгорания   (05.08.07 23:07)
> TMaskEdit использовать

Есть у него некоторые "неприятные" моменты :)


 
SergeIT   (2007-08-06 01:22) [10]

> Модуль формы превращается в большую свалку
Никакой свалки. Функции проверки ввода в отдельном модуле. А в модуле формы только добавляется EditXonChange - для однотипных едитов одна функция.


 
Двигатель внешнего сгорания   (2007-08-06 02:07) [11]


> {RASkov} ©   (06.08.07 00:47) [9]
> Есть у него некоторые "неприятные" моменты :)


Какие?


 
{RASkov} ©   (2007-08-06 02:23) [12]

> [11] Двигатель внешнего сгорания   (06.08.07 02:07)
> Какие?

Есть вроде....) с ходу не помню, просто он мне как-то однажды так не понравился, что я его стараюсь избегать :)
К данному вопросу впрочем не относится, указать маску "!99999;1; " и то что нужно автору, вроде бы получится..... только девяток указать столько сколько нужно по максимуму...
ЗЫ Одна из "проблем" с ним - Invalid input value.  Use escape key to abandon changes. - почему-то вспомнилась. Впрочем - проблема - в кавычках :)


 
Германн ©   (2007-08-06 02:32) [13]

И ничего не изменилось пока я "купался и загорал" :)
Опять вопрос "не знаю чей", "не знаю о чём". И сразу ответы на "не знаю что, но я думаю про это" :)


 
Leonid Troyanovsky ©   (2007-08-06 09:26) [14]


> {RASkov} ©   (06.08.07 00:47) [9]

> procedure TMyEdit.KeyPress(var Key: Char);

http://www.rsdn.ru/Forum/Message.aspx?mid=517237&only=1

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-08-06 09:31) [15]


> {RASkov} ©   (06.08.07 02:23) [12]

> ЗЫ Одна из "проблем" с ним - Invalid input value.  Use escape


type
 TMyMaskEdit = class(TMaskEdit)
 private
   procedure CMExit(var msg: TCMExit); message cm_exit;
 end;

procedure TMyMaskEdit.CMExit;
begin
 try
   inherited;
 except
   on E: EDBEditError do
     raise Exception.Create("My exception");
 end;
end;

Если же хочется снабдить оной функциональностью существующий контрол,
то ему нужно подменять WindowProc на приблизительно такую:

procedure TForm1.NewProc(var msg: TMessage);
begin
 try
   OldProc(msg);
 except
   on E: EDBEditError do
     raise Exception.Create("My exception"); // do something
 end;
end;

таким образом:

OldProc := MaskEdit1.WindowProc; // OldProc - поле формы :TWndMethod
MaskEdit1.WindowProc := NewProc;

--
Regards, LVT.


 
{RASkov} ©   (2007-08-06 11:15) [16]

> [14] Leonid Troyanovsky ©   (06.08.07 09:26)

???

> [15] Leonid Troyanovsky ©   (06.08.07 09:31)

Угу.... именно поэтому "проблема" в кавычках....


 
Leonid Troyanovsky ©   (2007-08-06 11:29) [17]


> {RASkov} ©   (06.08.07 11:15) [16]

Не KeyPress, а Change.

--
Regards, LVT.


 
{RASkov} ©   (2007-08-06 11:43) [18]

> [17] Leonid Troyanovsky ©   (06.08.07 11:29)
> Не KeyPress, а Change.

Все равно не пойму.... нужно объеденить что ли мой код и твой по ссылке??? или заменить... или что?
Может [14] - это не мне тогда, а автору, как альтернативный вариант....


 
Leonid Troyanovsky ©   (2007-08-06 13:17) [19]


> {RASkov} ©   (06.08.07 11:43) [18]

> Может [14] - это не мне тогда, а автору, как альтернативный
> вариант....

Это тебе персонально, у вопрошающего и так много предложений.
А заменить или что - думай сам.

--
Regards, LVT.


 
{RASkov} ©   (2007-08-06 16:40) [20]

> [19] Leonid Troyanovsky ©   (06.08.07 13:17)
> Это тебе персонально

Пригодится. Спасибо)


 
Eraser ©   (2007-08-06 17:00) [21]

TSpinEdit


 
Германн ©   (2007-08-06 17:37) [22]


> Eraser ©   (06.08.07 17:00) [21]
>
> TSpinEdit
>

TRxSpinEdit


 
HWNDDeletor   (2007-08-13 13:21) [23]

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(Edit1.Handle,GWL_STYLE,
  GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);
end;


Правда этот способ от Paste не помагает...


 
{RASkov} ©   (2007-08-13 13:26) [24]

> [23] HWNDDeletor   (13.08.07 13:21)

Ты его из первого поста скопировал?


 
HWNDDeletor   (2007-08-13 14:07) [25]

Тфу епт RASkov, не заметил...
Просматривал бегло, туплю чего-то ((((



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

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

Наверх




Память: 0.51 MB
Время: 0.042 c
15-1186073298
Kerk
2007-08-02 20:48
2007.09.02
wget ?


15-1186225189
foreverDelphi
2007-08-04 14:59
2007.09.02
кто хочет из гуру помочь новичку


3-1178216110
ruba
2007-05-03 22:15
2007.09.02
триггеры, как перенести сгенерированный индекс в другую таблицу


2-1186485158
Надежда
2007-08-07 15:12
2007.09.02
Проверка не запущена ли уже эта программа


2-1186724942
Евгений Р.
2007-08-10 09:49
2007.09.02
Модуль открывается в Bin-формате





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