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

Вниз

Ограниченное количество цифр в Edit при вставлении   Найти похожие ветки 

 
Dmitry_177   (2007-05-09 20:18) [0]

Мне нужно чтобы в Edit можно было вводить только числа и длиной строки не более 10-ти цифр, сделал я так:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   case Key of
     "0".."9": begin
                           if Length(TEdit(Sender).Text) >= 10 then
                             Key := #0;
                         end;

     #8: ;
   else
     Key := #0;
   end;
end;

Но если какую-нибудь строку где-нибудь скопировать и вставить в этот Edit, строка вставляется что и есть неправильно по задумке.. Как можно сделать чтобы при вставлении вставлялись только цифры, если они там есть или вообще ничего не вставлялось, и чтобы определенной длиной строка вставлялась?


 
begin...end ©   (2007-05-09 20:35) [1]

Длину можно ограничить, используя свойство MaxLength. А проверять, является ли введённый текст строковым представлением числа, ИМХО, лучше перед использованием введённых данных, а не в процессе ввода.


 
tormoz   (2007-05-09 20:48) [2]

OnChange


 
{RASkov} ©   (2007-05-10 01:05) [3]

> [0] Dmitry_177   (09.05.07 20:18)

Такой вариант:

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   procedure Edit1KeyPress(Sender: TObject; var Key: Char);
   procedure FormCreate(Sender: TObject);
 private
   OldWndProc: TWndMethod;
   procedure NewWbdProc(var Mes: TMessage);
...................
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if not (Key in ["0".."9", #8]) then Key:=#0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 OldWndProc:=Edit1.WindowProc;
 Edit1.WindowProc:=NewWbdProc;
//  Edit1.MaxLength:=10;
end;

procedure TForm1.NewWbdProc(var Mes: TMessage);
var S: String; N: Integer;
begin
 if Mes.Msg = WM_PASTE   then PostMessage(Edit1.Handle, WM_USER+10, 0, 0);
 if Mes.Msg = WM_USER+10 then begin
  S:=Edit1.Text;
  for N:= Length(S) downto 1  do if not (S[N] in ["0".."9"]) then Delete(S, N, 1);
*  if Length(S)>10 then SetLength(S, 10);
  Edit1.Text:=S;
 end else OldWndProc(Mes);
end;

Можешь комментарий, из FormCreate, переместить на место звездочки, эффект будет немного другой...
А может TMaskEdit лучше подойдет для твоих целей?


 
{RASkov} ©   (2007-05-10 01:22) [4]

Edit1KeyPress лучше так:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if not (Key in ["0".."9", #8]) then Key:=#0 else
  if ((Length(Edit1.Text)>9) and (Key<>#8)) then
   if Edit1.SelStart<10 then begin
    Edit1.SelLength:=1;
   end else Key:=#0;
end;


 
Германн ©   (2007-05-10 02:26) [5]


> Dmitry_177   (09.05.07 20:18)
>
> Мне нужно чтобы в Edit можно было вводить только числа и
> длиной строки не более 10-ти цифр,

Бред, имхо.


 
Dmitry_177   (2007-05-10 22:38) [6]

{RASkov}, не очень вариант.. а если мне нужно несколько таких Edit-ов? мне для каждого Edit-а нужно создавать все это? жаль что у сообщения WM_PASTE нет параметров


 
{RASkov} ©   (2007-05-10 23:07) [7]

> [6] Dmitry_177   (10.05.07 22:38)

Наследуйся от полученного, неуж трудно? Это ж Delphi.... а ты - не катит :( Плюс в новый и KeyPress засунь, и не обязательно это все ввиде отдельного/нового компонента оформлять, можно и в отдельном юните...


 
Loginov Dmitry ©   (2007-05-10 23:07) [8]


procedure TForm1.Edit1Change(Sender: TObject);
const
 MaxLen = 10;
var
 OnChange: TNotifyEvent;
 S, S1: string;
 I, APos: Integer;
begin
 OnChange := TEdit(Sender).OnChange;
 TEdit(Sender).OnChange := nil;
 try
   S := TEdit(Sender).Text;
   APos := TEdit(Sender).SelStart;
   for I := 1 to Length(S) do
     if S[I] in ["0".."9"] then
       Insert(S[I], S1, Length(S1) + 1); // S1 := S1 + S[I]

   if Length(S1) > MaxLen then
     SetLength(S1, MaxLen);

   if S1 <> S then
   begin
     TEdit(Sender).Text := S1;
     TEdit(Sender).SelStart := APos - 1;
   end;
 finally
   TEdit(Sender).OnChange := OnChange;
 end;
end;


 
{RASkov} ©   (2007-05-10 23:25) [9]

> [6] Dmitry_177   (10.05.07 22:38)

Пока "писал" тебе юнит, Дима тебе ответил, ну да ладно.... держи :)
unit Unit2;
interface
uses Windows, Messages, StdCtrls;

const EM_AFTERPASTE = WM_USER+10;

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

 end;

implementation

{ TMyEdit }

procedure TMyEdit.KeyPress(var Key: Char);
begin
 inherited;
 if not (Key in ["0".."9", #8]) then Key:=#0 else
  if ((Length(Text)>9) and (Key<>#8)) then
   if SelStart<10 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)>10 then SetLength(S, 10);
 Text:=S;
end else inherited;
end;

end.

Ну и в твоей форме где нужны эти едиты делаешь так:
Т.е. Едиты - кидаешь обычные с политры....

uses....StdCtrls, Unit2;

type
 TEdit = class (TMyEdit);

 TForm1 = class(TForm)
   Edit1: TEdit;

А я ведь все скопипастил с предыдущих моих постов....:)


 
Dmitry_177   (2007-05-10 23:46) [10]

еще тогда вопрос:
чем лучше Edit1KeyPress такой:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ["0".."9", #8]) then Key:=#0 else
 if ((Length(Edit1.Text)>9) and (Key<>#8)) then
  if Edit1.SelStart<10 then begin
   Edit1.SelLength:=1;
  end else Key:=#0;
end;

чем такой:

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

?

и кстати при Ctrl+V не работает вставка при таком Edit1KeyPress


 
{RASkov} ©   (2007-05-11 00:33) [11]

> [10] Dmitry_177   (10.05.07 23:46)

Ну так попробуй, какой больше нравится тот и используй, а в двух словах... я не делал в Едите ограничение по MaxLength для того, чтобы при вставке текста более 10 символов из него брались первые 10 цифр отсекая не цифры.... Например: Bla1blab3bla45bldldlldflfl после вставки получилось бы 1345
Поэтому и ограничение ввода с клавиатуры и реализовал в KeyPress"е, так же там еще одна фича.... вообщем пробуй никто не запрещает, а не нравится не ешь.

> и кстати при Ctrl+V не работает вставка при таком Edit1KeyPress

Поимей совесть, доделай как тебе нужно, благо не трудно, или все полностью за тебя делать..... Более того, еще раз говорю, можешь отказаться от этого варианта, дело твое...... Или это у тебя последнее предложение - вопрос был?


 
{RASkov} ©   (2007-05-11 01:48) [12]

> и кстати при Ctrl+V не работает вставка при таком Edit1KeyPress

> Или это у тебя последнее предложение - вопрос был?

Держи:)
procedure TMyEdit.KeyPress(var Key: Char);
begin
 inherited;
 if ORD(Key)=22 then Exit;
 if not (Key in ["0".."9", #8]) then Key:=#0 else
  if ((Length(Text)>9) and (Key<>#8)) then
   if SelStart<10 then SelLength:=1 else Key:=#0;
end;

Чет... перечитал свой [11] пост, как-то грубовато получилось....Сорри.
Но больше.... сам пиши ;)



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

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

Наверх




Память: 0.48 MB
Время: 0.048 c
2-1178467571
Malik
2007-05-06 20:06
2007.05.27
TMemo


2-1178544704
Inna_Z
2007-05-07 17:31
2007.05.27
Как узнать версию InterBase?


15-1177416368
alex_***
2007-04-24 16:06
2007.05.27
Транзакции для распределенных систем. Кто использовал?


15-1177554156
Slider007
2007-04-26 06:22
2007.05.27
С днем рождения ! 26 апреля


2-1178390834
Wind
2007-05-05 22:47
2007.05.27
мастер построения Сonnectionstring





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