Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сложение значений Integer и Double


Автор: nicka 22.6.2004, 13:44
Работаю в Delphi7

У меня на форме стоят 2 поля ввода(TRichEdit).
Одно имеет маску - ' . ' - т.е для ввода значений типа Double(для цены товара),
а второе - ' ' - т.е для ввода значений типа Integer ,

плюс к этому есть еще одно поле, в котором после ввода значений в первые 2 поля, должна отображаться сумма этих значений.
Это поле имеет маску ' . '.
я делаю для этого следующее
[code]
TRichEdit3.text := InttoStr(StrtoInt(TRichEdit1.text) + StrtoInt(TRichEdit2.text));
[code]

конечно это ыдает ошибку поскольку первая маска не позволяет перевести '10 . '(например)
в Integer , я понимаю

но что делать не знаю ... может кто подскажет smile.gif smile.gif

Автор: _vova_ 22.6.2004, 14:02
А зачем нужен TRichEdit?
Есть чудовый компонент TCurrencyEdit из RX, скорее всего есть что-то подобное и в JEDIVCL. У него есть свойство Value, и делай сним что хочеш. Также поддерживается такая прелесть, как As...
Ну если очень нуно TRichEdit, то
Код

RichEdit3.text := FloatToStr(StrtoFloat(RichEdit1.text) + StrtoInt(RichEdit2.text));

или наоборот, взависимости от того где дабл.

Автор: nicka 23.6.2004, 13:29
Цитата
RichEdit3.text := FloatToStr(StrtoFloat(RichEdit1.text) + StrtoInt(RichEdit2.text));


К сожалению, данный метод вызывает у меня следующую ошибку
Код
'10  .  ' is not a valid floating point value



и что же делать? bored.gif


Автор: Girder 23.6.2004, 13:48
У тебя разделитель не соответствует.

Автор: nicka 23.6.2004, 14:15
Цитата
У тебя разделитель не соответствует.


не соответствует чему? установкам на машине в Regional Settings?
вроде точка у меня - хотя проверю...

Автор: Medved 23.6.2004, 14:38
Цитата(nicka @ 23.6.2004, 16:29)
и что же делать? bored.gif

В первую очередь делать нормально! Это все равно что экскаватором грузить сено! Вам же сказали, есть специальные компоненты (из той же RxLib). Или воспользуейтесь TMaskEdit.

А TRichEdit предназначен для ввода и отображения форматированного текста.

Автор: Girder 23.6.2004, 14:49
Код
procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.Lines.DelimitedText:='';
RichEdit2.Lines.DelimitedText:='';
RichEdit3.Lines.DelimitedText:='';
end;


или в обработчике обрезаеш все лишнее из RichEdit.text а потом конвертируеш. Ну и ряд других способов.

Автор: nicka 23.6.2004, 15:58
Цитата
Вам же сказали, есть специальные компоненты (из той же RxLib). Или воспользуейтесь TMaskEdit.


во первых - ни каких других компонент( в той же или не в той жеRxLib) у меня не видно и не читала. Насчет TMaskEdit. - надо поискать.

Но вопрос то касался TRichEdit - значит мне так нужно, я читала про него в книге. Там было сказано, что если надо задать маску, то существует он. Вот я и взяла...

Цитата
В первую очередь делать нормально! Это все равно что экскаватором грузить сено!

так зачем же наезжать так, я в дельфи новичок, просто не знаю в какую сторону копать , да изаказ поджимает... а для чего же тогда форумы, если лучать подсказку на то , что другие уже знают , а тебе не стоит тратить время?

Цитата
RichEdit1.Lines.DelimitedText:='';
- нельзя ли объяснить что это делает, в частности DelimitedText???

Цитата
или в обработчике обрезаеш все лишнее из RichEdit.text
вот это то как раз и не понятно...в этом то и вопрос

Цитата
Ну и ряд других способов
а можно их поглядеть?

Автор: Guest 23.6.2004, 18:22
Ладно, всем пардон, оказалось что у меня на форме не всем ненавистный TRichEdit , а всеми любивый TMaskEdit. Но ошибка вес равно та же,
так что уж надеюсь на совет, потому что учень уж срочная проблема...

Автор: Guest 23.6.2004, 18:36
Выше сообщение от было от меня, т.е Нicka - автора темы.
И щас тоже я пишу.

Дело в том что если я введу в поле число 10 следующим образом - '10 . ' , то выйдет вышеуказанная ошибка. А если не введу так - ' 10. ' - то не выдаст ошибку.
Но так постоянно вводить не удобно.

ЧТо можно придумать тут?

Автор: Girder 23.6.2004, 21:13
Береш обычный TEdit и используеш.
а)для IntEdit.OnChange;
Код

var Form1.TForm;
     ...
     cInt:Boolean=false;

...

procedure TForm1.IntEditChange(Sender: TObject);
var s:string;
   i:integer;
   sS:integer;
   fD:boolean;
begin
if cInt then exit;
s:='';
i:=Length(IntEdit.text);
fD:=false;
if i>0 then
 With IntEdit do
  begin
   if not(Text[SelStart] in ['0'..'9','-','+','e','E']) then
    fD:=true;
   repeat
    if (Text[i] in ['0'..'9','-','+','e','E']) then
     s:=Text[i]+s;
    dec(i);
   until (i=0);
  end;
cInt:=true;
sS:=IntEdit.SelStart;
if (fD and (sS>1)) then dec(sS);
IntEdit.Text:=s;
IntEdit.SelStart:=sS;
cInt:=false;
end;

б)для FloatEdit.OnChange;
Код

var Form1.TForm;
     ...
     cFloat:Boolean=false;

...

procedure TForm1.FloatEditChange(Sender: TObject);
var s:string;
   i:integer;
   sS:integer;
   fD:boolean;
begin
if cFloat then exit;
s:='';
i:=Length(FloatEdit.text);
fD:=false;
if i>0 then
 With FloatEdit do
  begin
   if not(Text[SelStart] in ['0'..'9','-','+',DecimalSeparator,'e','E']) then
    fD:=true;
   repeat
    if (Text[i] in ['0'..'9','-','+',DecimalSeparator,'e','E']) then
     s:=Text[i]+s;
    dec(i);
   until (i=0);
  end;
cFloat:=true;
sS:=FloatEdit.SelStart;
if (fD and (sS>1)) then dec(sS);
FloatEdit.Text:=s;
FloatEdit.SelStart:=sS;
cFloat:=false;
end;


Использовать OnKey... также можно, что бы сразу игнорировать
не допустимые коды символов, НО... ни что не помешает вставить(через буфер) в поле ввода информацию.

При конвертации необходимо обрабоботать исключения(потому что, ни что мне не помешает ввести к примеру "..11,,ee". Конечно можно и допустисый синтексис обратывать):
Код

var i:integer;
     e:extended;//double
...
try
 i:=StrToInt(IntEdit.Text);
except
 showmessage('Что тупой что-ли?'); //сообщение пользователю
end
try
 e:=StrToFloat(IntEdit.Text);
except
 showmessage('Да... явно тупой'); //сообщение пользователю
end
...


Но лично я, вообще(если честно то редко) не обрабытываю OnChange, OnKey...
Т.к. часто это пугает пользователя: Он нажимает... А-ааа.. ни чё не происходит и т.п.
А просто обрабатываю исключения и вслучаи чего сообщаю пользователю, где и в чем ошибка.

Автор: Medved 24.6.2004, 05:29
надо правильно отредактировать саму маску. Поставить вместо символа 9 символ 0. Т.е. сказать что должна быть не просто цифра, а ОБЯЗАТЕЛЬНО цифра и ничего более.

Цитата

М а с к и  и с п о л ь з у ю т с я  п р и  в в о д е  д а н н ы х  в  п о л я  н а б о р а  д а н н ы х T F i e l d  и  в  к о м п о н е н т  M a s k E d i t .  М а с к и р о в а н н ы й  в в о д  п о з в о л я е т  к о н т р о л и р о в а т ь  с и н т а к с и ч е с к у ю  п р а в и л ь н о с т ь  в в о д а  и  с о к р а т и т ь  в о з м о ж н о с т ь  о ш и б о к . 
М а с к а  с о с т о и т  и з  т р е х  р а з д е л о в ,  м е ж д у  к о т о р ы м и  с т а в и т с я  т о ч к а  с  з а п я т о й  ( 
; ) .  В  п е р в о м  р а з д е л е  -  ш а б л о н е  з а п и с ы в а ю т с я  с п е ц и а л ь н ы м  о б р а з о м  с и м в о л ы  ( с м .  п р и в е д е н н у ю  н и ж е  т а б л и ц у ) ,  к о т о р ы е  м о ж н о  в в о д и т ь  в  к а ж д о й  п о з и ц и и ,  и  с и м в о л ы ,  д о б а в л я е м ы е  с а м о й  м а с к о й ;  в о  в т о р о м  р а з д е л е  з а п и с ы в а е т с я  1  и л и  0  в  з а в и с и м о с т и  о т  т о г о ,  н а д о  и л и  н е т ,  ч т о б ы  с и м в о л ы ,  д о б а в л я е м ы е  м а с к о й ,  в к л ю ч а л и с ь  в  с в о й с т в о  T e x t  к о м п о н е н т а  M a s k E d i t  и л и  в  с в о й с т в о  V a l u e  п о л я ;  в  т р е т ь е м  р а з д е л е  у к а з ы в а е т с я  с и м в о л ,  и с п о л ь з у е м ы й  д л я  о б о з н а ч е н и я  п о з и ц и й ,  в  к о т о р ы х  е щ е  н е  о с у щ е с т в л е н  в в о д .   
 
С п е ц и а л ь н ы е  с и м в о л ы  м а с к и : 
 
  !  Н а л и ч и е  с и м в о л а  " ! "  о з н а ч а е т ,  ч т о  н е д о с т а ю щ и е  с и м в о л ы  п р е д в а р я ю т с я  п р о б е л а м и ,  а  о т с у т с т в и е  с и м в о л а  " ! "  о з н а ч а е т ,  ч т о  п р о б е л ы  р а з м е щ а ю т с я  в  к о н ц е . 
  >  С и м в о л  " > "  о з н а ч а е т ,  ч т о  в с е  п о с л е д у ю щ и е  з а  н и м  с и м в о л ы  д о л ж н ы  в в о д и т ь с я  в  в е р х н е м  р е г и с т р е ,  п о к а  н е  к о н ч и т с я  м а с к а  и л и  п о к а  н е  в с т р е т и т с я  с и м в о л  " < " . 
  <  С и м в о л  " < "  о з н а ч а е т ,  ч т о  в с е  п о с л е д у ю щ и е  з а  н и м  с и м в о л ы  д о л ж н ы  в в о д и т ь с я  в  н и ж н е м  р е г и с т р е ,  п о к а  н е  к о н ч и т с я  м а с к а  и л и  п о к а  н е  в с т р е т и т с я  с и м в о л  " > " . 
< >  С и м в о л ы  " < > "  о з н а ч а ю т ,  ч т о  а н а л и з  р е г и с т р а  н е  п р о и з в о д и т с я . 
\  С и м в о л  " \ "  о з н а ч а е т ,  ч т о  с л е д у ю щ и й  з а  н и м  с и м в о л  я в л я е т с я  б у к в е н н ы м ,  а  н е  с п е ц и а л ь н ы м ,  х а р а к т е р н ы м  д л я  м а с к и .  Н а п р и м е р ,  с и м в о л  " > "  п о с л е  с и м в о л а  " \ "  в о с п р и м е т с я  к а к  з н а к  > ,  а  н е  к а к  с и м в о л ,  у к а з ы в а ю щ и й  н а  в е р х н и й  р е г и с т р . 
  L  С и м в о л  " L "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  д о л ж н а  б ы т ь  б у к в а . 
  l  С и м в о л  " l "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  м о ж е т  б ы т ь  т о л ь к о  б у к в а  и л и  н и ч е г о . 
A  С и м в о л  " A "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  д о л ж н а  б ы т ь  б у к в а  и л и  ц и ф р а . 
  a  С и м в о л  " a "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  м о ж е т  б ы т ь  б у к в а ,  и л и  ц и ф р а ,  и л и  н и ч е г о . 
C  С и м в о л  " C "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  д о л ж е н  б ы т ь  л ю б о й  с и м в о л . 
c  С и м в о л  " c "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  м о ж е т  б ы т ь  л ю б о й  с и м в о л  и л и  н и ч е г о . 
0  С и м в о л  " 0 "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  д о л ж н а  б ы т ь  ц и ф р а . 
9  С и м в о л  " 9 "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  м о ж е т  б ы т ь  ц и ф р а  и л и  н и ч е г о . 
#  С и м в о л  " # "  о з н а ч а е т ,  ч т о  в  д а н н о й  п о з и ц и и  м о ж е т  б ы т ь  ц и ф р а ,  з н а к  " + " ,  з н а к  " - "  и л и  н и ч е г о . 
:  С и м в о л  " : "  и с п о л ь з у е т с я  д л я  р а з д е л е н и я  ч а с о в ,  м и н у т  и  с е к у н д . 
/  С и м в о л  " / "  и с п о л ь з у е т с я  д л я  р а з д е л е н и я  м е с я ц е в ,  д н е й  и  г о д о в  в  д а т а х . 
_  С и м в о л  " _ "  о з н а ч а е т  а в т о м а т и ч е с к у ю  в с т а в к у  в  т е к с т  п р о б е л а . 

П р и м е р ы  м а с о к 
С е м и з н а ч н ы й  н о м е р  т е л е ф о н а :  ! 0 0 0 - 0 0 - 0 0 ; 0 ; _ 
Н о м е р  т е л е ф о н а  с  к о д о м  с т р а н ы :  ! \ ( 9 9 9 \ )  0 0 0 - 0 0 - 0 0 ; 0 ; _ 
П о ч т о в ы й  и н д е к с :  ! 0 0 0 0 0 0 0 ; 1 ; _ 
П а с п о р т :  ! L - L L  9 9 9 9 9 9 ; 0 ; _ 
Д а т а  с  у к а з а н и е м  д н я :  ! 9 9 / 9 9 / 0 0 ; 1 ; _ 
Д а т а  б е з  у к а з а н и я  д н я :  ! 9 9 / 0 0 ; 1 ; _ 
В р е м я  с  с е к у н д а м и :  ! 9 0 : 0 0 : 0 0 ; 1 ; _ 
В р е м я  б е з  с е к у н д :  ! 9 0 : 0 0 ; 1 ; _



Автор: nicka 24.6.2004, 14:11
Pegas ,
про маски я читала,
только если я поставлю вместо 9 - 0, то это будет означать обязательный ввод, то есть если я уже ввела туда число, а потом передумала и хочу удалить его, то оно выдаст сообщение, что я не правильно ввела значение в маску...я так пробовала

Теперь насчет удобного ввода, чтоб при вводе например 10 сажалось ' 10. ' , а не '10 . '
я подумала, что тут поможет !(восклицательный знак) в маске, т.е !99.99;1;_
да, это вроде решает проблему пробелов перед точкой, но зато возничает другая - при вводе например ' 100.25' значение может поменяться при вводе в базу на ' 100.01' или что то в этом роде, короче значение после точки меняеться, не знаю из зачего.....


А откуда можно скачать эту RX библиотеку?


Автор: Medved 25.6.2004, 05:22
http://delphiplus.nagano.ru/rxlibrary.html
Добавлено @ 05:23
Установи RXLib и не мучайся. RXLib - это почти что стандартная библиотека для Delphi. Описание процедур и функций смотри в DRKB.

Автор: Петрович 26.6.2004, 09:51
Цитата
не всем ненавистный TRichEdit , а всеми любивый TMaskEdit

Лично я, и все мои ближайшие знакомые уже давно (после первых опытов) отказались от использования TMaskEdit. Уж больно он "не русский" какой-то. Наладить ввод который будет соответствовать маске, и при этом будет допускать гибкость, в этом компоненте по моему невозможно.
Мне кажется что он применим только если нужно заставить пользователя обязательно ввести значение точно соответствующее маске. Но даже при этом, пользователи "чумеют" от такого компонента, по крайней мере те с которыми приходилось иметь дело мне.
Поэтому, обычно просто ставится tEdit, и либо вешается обработчик на OnChange в котором делается проверка на допустимость вводимой величины, либо проверка делается уже после ввода, например по нажатию Ok.
А можно и правда поискать более продвинутые компоненты.

Автор: Medved 1.7.2004, 11:36
Согласен. ^

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)