MaskEdit problem
8 отговора
248 прегледа
MaskEdit problem
hi
Имам малко проблемче с което се борих цял следобяд и накрая ништо. Имам MaskEdit. При грешен инпут хвърля изключение. Въпроса ми е къде да го прехвана?Ако може да ви питам и още нещо - в хелпа не видях как се прави маска която позволява въвеждането на числа в диапазон(напр. 0 до 3).
Имам малко проблемче с което се борих цял следобяд и накрая ништо. Имам MaskEdit. При грешен инпут хвърля изключение. Въпроса ми е къде да го прехвана?Ако може да ви питам и още нещо - в хелпа не видях как се прави маска която позволява въвеждането на числа в диапазон(напр. 0 до 3).
Re: MaskEdit problem
Специално за ограничаване на допустимите символи аз ползвам следния (наглед леко дебилен) подход без маска:
procedure TForm.OnKeyPress(Sender: TObject; var Key: Char);
begin
if not ((Key in ['0'..'9']) or (Key = #8)) then Key := #27;
//#27 не прави нищо в контекста на TEdit
//#8 е за да можеш да ползваш Backspace за редактиране
end;
Редактирано от bass на
Re: MaskEdit problem
Това е идейно донякъде, ама имаш един проблем - можеш да си paste-неш каквото си искаш в edit-а... 
Re: MaskEdit problem
'псулютно! Трябва да се вземат някои доп. мерки в OnKeyDown, за да се прецизират нещата.
Re: MaskEdit problem
Благодаря.
Това наистина е идейно. Донякъде ще свърши работа. Използвам МаскЕдит за да филтрирам веднъж само цифри и да имам разделител естествено и после използвах твоята идея. Искам да направя едит за месец/година (ММ/ГГ). Проблема е в ММ. Трябва да се филтрират отделно М и М ако ме разбирате М (0..1) и М (0..9)или(0..2). ОК филтрирам ги отделно като вземам текуштата посиция. Но има само един проблем - какда взема текушта позиция при MouseClick?
Това наистина е идейно. Донякъде ще свърши работа. Използвам МаскЕдит за да филтрирам веднъж само цифри и да имам разделител естествено и после използвах твоята идея. Искам да направя едит за месец/година (ММ/ГГ). Проблема е в ММ. Трябва да се филтрират отделно М и М ако ме разбирате М (0..1) и М (0..9)или(0..2). ОК филтрирам ги отделно като вземам текуштата посиция. Но има само един проблем - какда взема текушта позиция при MouseClick?
Bass vij kvo izmislih:)
С Маска 00/00;1;_ и :
void __fastcall TForm1::MaskEdit1Change(TObject *Sender)
{
static AnsiString oldStr = "";
AnsiString str = "12/99";
if(str.AnsiCompareIC(MaskEdit1->Text)<0)
{
MaskEdit1->Text = oldStr;
}
else
oldStr = MaskEdit1->Text;
}
void __fastcall TForm1::MaskEdit1Change(TObject *Sender)
{
static AnsiString oldStr = "";
AnsiString str = "12/99";
if(str.AnsiCompareIC(MaskEdit1->Text)<0)
{
MaskEdit1->Text = oldStr;
}
else
oldStr = MaskEdit1->Text;
}
Re: Bass vij kvo izmislih:)
Специално за датите и аз ползвам нещо подобно:
p.s. Изрази от рода на "12/99" са опасни, ако в последствие
ще конвертираш низа към дата или timestamp - ако случайно на
конкретния компютър е инсталирана друга локала, функция
от рода на StrToDateTime ще гръмне със трашна сила
(предстви си, че установеният формат е "yy.mm.dd").
Ползвай Currency and Date/Time variables!
[image][линк][/image
procedure TForm.Date1Exit(Sender: TObject);
var
sOldDate: string;
begin
try
sOldDate := Date1.Text;
StrToDateTime(Date1.Text);
//Резултатът не е интересен, за момента само проверяваме
except
DialogBox('<Някакво подходящо съобщение>', mtWarning, [mbOK]);
//DialogBox е къстъм-функция, не е WinAPI, да не се чудиш
EditDate.Text := sOldDate;
EditDate.SetFocus();
end;
end;
p.s. Изрази от рода на "12/99" са опасни, ако в последствие
ще конвертираш низа към дата или timestamp - ако случайно на
конкретния компютър е инсталирана друга локала, функция
от рода на StrToDateTime ще гръмне със трашна сила
(предстви си, че установеният формат е "yy.mm.dd").
Ползвай Currency and Date/Time variables!
[image][линк][/image
Редактирано от bass на
Re: MaskEdit problem
Ами че MaskEdit-а си е достатъчно добър. Но все пак, ако ти помогнат, можеш да проббваш някоя от тези функции, на OnExit:
IsValidDate или TryStrToDate
Няма да ти избива изключение, само си проверяваш boolean резултата.
ЧеФо
IsValidDate или TryStrToDate
Няма да ти избива изключение, само си проверяваш boolean резултата.
ЧеФо