Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

В 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]


 
Style ©   (2005-01-19 16:51) [41]

Если ты про мой, то просто добавь в исходник процедуру Register.

Естественно сначала ее объявление перед implementation

procedure Register;

....

implementation

....

procedure Register;
begin
   RegisterComponents("NMK Controls", [TNMKNumericEdit]);
end;

Затем жми Component->Install component и указывай файл...


 
tolstiak   (2005-01-19 18:15) [42]

>Style ©
все как ты написал так я и сделал

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;


а тут дает: [Fatal Error] TNMKNumericEdit.pas(6): File not found:"System.Drawing.dcuil"
Может все дело в несовпадении версий у меня: Delphi 8.0 for the Microsoft .NET Framework


 
Style ©   (2005-01-19 19:16) [43]

Под 8-кой я не проверял... 5,6,7 должно работать.

Иерархия в юнитах. Похоже, что у тебя проект .NET -> я в нем ничего не понимаю :( руки пока не доходили и даже желания пока нет или .NET ;)
Скорее всего там можно создавть и Win32 приложения, но не знаю, возможно ли там устанавливать Win32 компоненты??
Может ты чего не так делаешь??


 
tolstiak   (2005-01-20 11:32) [44]

>Style ©
хм... Windows Forms Applications в 8-ке точно можно создавать...

ну да ладно... фигня это все... продавать или выпускать для массового потребления свою программу я не собираюсь... так это скорее для собственного потребления... облегчить учесть иженера-конструктора... :)))


 
SergP ©   (2005-01-20 20:54) [45]

А вообще-то для таких вещей ИМХО существует MaskEdit



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

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.025 c
3-1104398587
Georji
2004-12-30 12:23
2005.02.06
Извлечение месяца


1-1106278856
Ната
2005-01-21 06:40
2005.02.06
Как динамически создать кнопку?


3-1105039208
Kostet
2005-01-06 22:20
2005.02.06
Как создать дистрибутив программы управления б.д.?


4-1103274502
SiDoff
2004-12-17 12:08
2005.02.06
Как получить указатель на pop up ....


8-1098527695
Wish
2004-10-23 14:34
2005.02.06
Разложить маленький Avi на несколько bitmap ов.