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

Вниз

В TEdit - одни цифры и ОДНА запятая?   Найти похожие ветки 

 
tolstiak   (2005-01-17 16:09) [0]

Доброго всем, уважаемые!
С первой частью вопроса я справился :)), т.е. в TEdit одни цифры получаються..... но мне необходимо что бы (как в стандартном калькуляторе) блокировалось повторное нажатие "." или ","... как это сделать?


 
TUser ©   (2005-01-17 16:13) [1]

var Edit1Text: string;

procedure FormCreate();
begin
 Edit1Text:=Edit1.Text;
end;

procedure Edit1Change();
var i: integer;
   r: boolean;
   f: boolean;
begin
 i:=1; r:=true; f:=false;
 while r and (i <= length(Edit1.Text)) do
   if Edit1.Text[i] in ["0".."9"] then
     inc (i)
     else
   if Edit1.Text[i] in [".",","] and not f then begin
      inc (i); f:=true;
      end else
      r:=false;
 if not r then
   Edit1.Text:=Edit1Text
   else
   Edit1Text:=Edit1.Text
end;


 
Ega23 ©   (2005-01-17 16:14) [2]

procedure TForm1.Edit1Change(Sender: TObject);
var
i,Code:Integer;
begin
Val(Edit1.Text, i, Code);
if Code<>0 then
 begin
  showMessage("Ошибка в символе №"+IntToStr(Code));
  Edit1.SetFocus;
 end;

end;


Что-то типа этого...


 
Ega23 ©   (2005-01-17 16:15) [3]

Вру.

var
Code:Integer;
i:Double;


 
TUser ©   (2005-01-17 16:30) [4]


> Ega23 ©   (17.01.05 16:15) [2,3]

Еще StringReplace(...DecimalSeparator...) 2 раза


 
Ega23 ©   (2005-01-17 16:34) [5]

Еще StringReplace(...DecimalSeparator...) 2 раза

А нафига? Val и так разберётся...  :о)


 
tolstiak   (2005-01-17 16:34) [6]

> Ega23 ©
> TUser ©
А через
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
нельзя?


 
tolstiak   (2005-01-17 16:43) [7]

вот что с этим можно сделать что бы блокировалось повторное нажатие "." или ",":
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ["0".."9",#8,","]) then
   begin
   if Key="." then Key:=","else Key:=#0;
   end;
end;


 
Reindeer Moss Eater ©   (2005-01-17 16:46) [8]

блокировалось повторное нажатие "." или ","... как это сделать?

Сделать это легко.
Но ты сначала попробуй догадаться что там вводит юзер.

Например "1,000,000" - это что? Неправильно введенная единица или правильно введенный миллион с разделителем тысяч?


 
Ega23 ©   (2005-01-17 16:49) [9]

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


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


 
tolstiak   (2005-01-17 17:33) [10]

>Ega23 ©
неее тут фсе правильно... нажатие "." заменяет на нажатие ","... это нужно...

>Reindeer Moss Eater ©
"Например "1,000,000" - это что? Неправильно введенная единица или правильно введенный миллион с разделителем тысяч?"
по идее такого не могЁт быть потому что должно быть так: "1000000" - это миллион, а "," - только разделитель целой и дробной части числа.


 
Developerr   (2005-01-17 17:39) [11]

Используй RxCalcEdit и будет тебе счастье, да и голову морочить не нужно с написанием кода.


 
tolstiak   (2005-01-17 17:42) [12]

>Developerr
а где его взять?


 
tolstiak   (2005-01-17 17:49) [13]

>Ega23 ©
кстати может я чего не понимаю ("чайник" ешо) но вот это:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ["0".."9",#8,DecimalSeparator]) then  Key:=#0;
end;

дает ошибку:"Incompatible types: "Char" and "string"
:((


 
Anatoly Podgoretsky ©   (2005-01-17 17:53) [14]

POS
Тольк зачем пользователю мешать вводить? Пусть вводит как хочет, а вот когда кончит вводить тогда и проверить на правильность.


 
tolstiak   (2005-01-18 12:13) [15]

>Anatoly Podgoretsky ©
Дык моя задача не дать юзарю не правильно осуществить ввод числа... в этом то и дело...


 
Reindeer Moss Eater ©   (2005-01-18 12:15) [16]

по идее такого не могЁт быть потому что должно быть так: "1000000" - это миллион, а "," - только разделитель целой и дробной части числа.

Все было бы так просто, если бы у всех были одни и те же идеи.
"1000000" - это безусловно миллион
но "1 000,000.00" - это тоже миллион.


 
REP ©   (2005-01-18 13:36) [17]

If (Key>=#32) and (Not (Key in ["0".."9",",",".",DECIMALSEPARATOR])) Then
    Key:=#0
 Else
    If (Key=",") or (Key=".") Then
      If Pos(DECIMALSEPARATOR,(Sender As TEdit).Text)=0 Then
        Key:=DECIMALSEPARATOR
      else
        Key:=#0;


 
tolstiak   (2005-01-18 13:55) [18]

>REP ©
If (Key>=#32) and (Not (Key in ["0".."9",",",".",DECIMALSEPARATOR])) Then
   Key:=#0.... и т.д.

дает ошибку:"Incompatible types: "Char" and "string"
:((


 
REP ©   (2005-01-18 14:04) [19]

Ну не знаю, у меня Д5
FormKeyPress(Sender: TObject; var Key: Char)

Может в этом дело. семерку в глаза не видел


 
tolstiak   (2005-01-18 14:52) [20]

>REP ©
у меня даже на Д7, а Delphi 8.0 for the Microsoft .NET Framework
вполне возможно что другая версия... хотя хз...
вот что примерно получилось
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case i of
0: begin
       if not (Key in ["0".."9",#8,","]) then
         begin
         if Key="." then
                         begin
                           Key:=",";
                           i:=1;
                         end
           else Key:=#0;
         end;
   end;
1: begin
       if not (Key in ["0".."9",#8]) then Key:=#0;
   end;
end;
end;

только теперь нужно сделать так что бы если я удаляю эту единственную "," то i:=0


 
TUser ©   (2005-01-18 14:56) [21]


> tolstiak   (18.01.05 13:55) [18]

Там уже и точка, и запятая есть. Зачем еще DecimalSeparator в множестве?


 
KADAN ©   (2005-01-18 15:00) [22]

Предлагаю такое решение (сам пользовал не раз, получается красиво). Вобщем, после ввода числа в Edit1 пользователь должен нажать кнопку Button1. Не надо давать ему нажимать кнопку, пока не введет правильно.

procedure TForm1.Edit1Change(Sender: TObject);
var a:double;
   code:integer;
begin
 Val(Edit1.Text,a,code);
 button1.Enabled:=code=0;
end;


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


 
SergP ©   (2005-01-18 15:00) [23]

Можно при вводе каждого символа проверять все это через StrToCurr,
если єксепшена не возникло, значит такой символ вводить можно, иначе запрещать его вводить...


 
tolstiak   (2005-01-18 15:34) [24]

>KADAN ©
>SergP ©
в [20] вполне рабочий код (и только цифры вводятся и одна ",")... только проблема в том что при удалении этой одной "," больше запятая не вводится.


 
tolstiak   (2005-01-18 15:36) [25]

Вы уж извените, порой за глупые вопросы просто я всего неделю, как пишу на Дельфи... :)


 
HSolo ©   (2005-01-18 16:46) [26]

Зачем глобальные флажки-то? Просто проверяйте, есть ли уже в Вашем edit-е DecimalSeparator, и если есть - то не давайте его вводить, примерно так:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (key = DecimalSeparator) then
 begin
 if (Pos(DecimalSeparator, (Sender as TEdit).Text) > 0) then
    key := #0;
 end
else
 if not (Key in ["0".."9", #8]) then
   key := #0;
end;


 
Vit@ly ©   (2005-01-18 18:13) [27]

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
If ActiveControl is TEdit then
 if not(Key in ["0".."9", #8, DecimalSeparator]) then Key := #0;
end;
А DecimalSeparator сам разберется, что в текущих настройках, точка или запятая:)


 
tolstiak   (2005-01-18 18:48) [28]

>Vit@ly ©
Разобраться разберется вот только что делать с таким форматом числа напр:"12,,,,,369" или "12,36626,366", а хотелось бы так: "12,3665" и больше "," быть не должно...


 
Anatoly Podgoretsky ©   (2005-01-18 19:19) [29]

tolstiak   (18.01.05 12:13) [15]
Дык моя задача не дать юзарю не правильно осуществить ввод числа... в этом то и дело...

Дык твоя задача этим и будет решена, кстати ниже (HSolo ©   (18.01.05 16:46) [26]) тебе дали ее решение, не позволили тебе самому найти решение.


 
Vit@ly ©   (2005-01-18 21:03) [30]

2 tolstiak   (18.01.05 18:48) [28]
только что делать с таким форматом числа напр:"12,,,,,369" или "12,36626,366"

а ты не поленись и попробуй ввести такое с [26]
Сомневаюсь, что у тебя (или юзера) это получится


 
KADAN ©   (2005-01-19 08:42) [31]

а вставка??? shift+ins еще не отменяли.


 
ghg ©   (2005-01-19 10:12) [32]

есть готовый компонент который учитывает все выше упомянутые ситуации (и вставку из буфера тоже)
раньше он лежал здесь в кладовке, если надо то могу послать


 
tolstiak   (2005-01-19 11:37) [33]

>ghg ©
если не трудно намыль. буду благодарен.

>Anatoly Podgoretsky ©
"...не позволили тебе самому найти решение." ну почему ж... частично решение есть [20] (правда не совсем устраивает).

>Vit@ly ©
кстати неполенился - ввел код как в [26]... точек (".") сколько угодно можно ввести на "," нереагирует (#0)... вот так.


 
ghg ©   (2005-01-19 11:57) [34]

ушло


 
tolstiak   (2005-01-19 12:12) [35]

>ghg ©
Большое спасибо!!!


 
Developerr   (2005-01-19 12:32) [36]


> tolstiak

Этот компонент есть в библиотеке RxLibrary и в Jedi JCL/JVCL

Rx Library yужно поискать в интенете, а на Jedi ссылка вот:

http://jvcl.sourceforge.net


 
ghg ©   (2005-01-19 12:46) [37]

это что написано в шапке того что есть у меня

///////////////////////////////////////////////
//
//   FVG Components Library.
//   Components: TFloatEdit
//   Requires:   none
//
//   (C) Damage, Inc. 2001.
//   (C) Filippov V. DamageInc@e-mail.ru.
//
//   Have a nice DamagIng!
///////////////////////////////////////////////


 
Style ©   (2005-01-19 13:05) [38]

Вот мой компонентик.

http://www.hch.ru/Components/NMKLIB/Source/Controls/NMKNumericEdit.pas


 
tolstiak   (2005-01-19 13:11) [39]

Всем!!! большое спасибо за участие!!!!! не дали погибнуть "чайнику"


 
tolstiak   (2005-01-19 16:27) [40]

М-де уж... а еще не подскажите как все эти компоненты подключить? что-то... никак.. :(((
прошу прошения [25]



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

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

Наверх





Память: 0.54 MB
Время: 0.049 c
9-1099683392
Xenon
2004-11-05 22:36
2005.02.06
Как организовать перемещение


1-1106229655
Павел
2005-01-20 17:00
2005.02.06
Как активировать дочернее окно в чужом приложении?


1-1106525159
Profi
2005-01-24 03:05
2005.02.06
Свой TTreeView


3-1105042168
Antoha111
2005-01-06 23:09
2005.02.06
Очистка DBLookupComboBox а


1-1106724799
Zloy
2005-01-26 10:33
2005.02.06
Как получить список файлов из определенного каталога





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