Форум: "Начинающим";
Текущий архив: 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.053 c