Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Запятая вместо точки, Как это реализовать 
:(
    Опции темы
ivan219
Дата 20.1.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



А что он делает smile
PM MAIL ICQ   Вверх
Bog d`An
Дата 21.1.2006, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



о, точно там ещё +- надо первым символом разрешить
млин, не всё так просто как казалось...

Код

uses
  ClipBrd;

procedure TForm1.EditKeyDown1(Sender: TObject; var Key: Word;
 Shift: TShiftState);
Var
  Counter:Integer;
  Mgs: TMsg;

   procedure EatKey;
   begin
     PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
   end;

Begin
  if ssCtrl in Shift then
    case key of
    // Ctrl + v
    86:
    begin
      if Clipboard.HasFormat(CF_TEXT) then //Если буфер обмена содержит строковый тип
      try
        StrToInt(Clipboard.AsText);        //Если числа
      except
        EatKey                             //При ошибке преобразования типов ничего не вставляем
      end;
      exit;
    end;
    { Ctrl + c }
    67:
      exit;
    else
    Begin
      EatKey;                              //другие клавиши при нажатом контроле
      Exit;
    End;
  end;
  
  if ssShift in Shift then
  Begin
    EatKey;
    Exit;
  End;

  if not (Key in [48..57,8,42])  then
  Begin
    EatKey;
    Exit;
  End;
end;


мда.. вот токо куда проверку на запятую и +- вставить...
вроде они для рус\англ на различном ShiftState ?

Это сообщение отредактировал(а) Bog d`An - 21.1.2006, 06:55
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
ivan219
Дата 21.1.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Всё почти работает smile запятых нет одни цифры, пречём блок цифровой клавиатуры тоже неотвичает, если из буфера обмена вставить 12.12 или 12,12 то ошибка.
PM MAIL ICQ   Вверх
Romikgy
Дата 23.1.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



А так ?
Код

procedure TForm1.Edit1Change(Sender: TObject);
var i: dword;
    sx:string;
begin
sx:=Edit1.Text;
if length(sx)<1 then exit;
if not ((sx[1]) in ['+','-','0'..'9','.',',']) then system.Delete(sx,1,1);
 for i:=2 to length(sx) do
 begin
 if (not ((sx[i]) in ['0'..'9','.',',']))
 then system.Delete(sx,i,1);
  end;
  for i:=1 to length(sx) do
  if (sx[i] in ['.',',']) then sx[i]:=DecimalSeparator;
  Edit1.Text:=sx;
  Edit1.SelStart:=length(sx);
end;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Bog d`An
Дата 24.1.2006, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



С запятыми косяк... и позицией курсора...
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Alexeis
Дата 24.1.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



ivan219 Мой алгоритм ведь работает какие еще проблемы??
Разрешает вводить только числа причем только с правельным разделителем, все посторонние символы удаляются, второй и последующие разделители так же удаляются, перед числом можно поставить + или -, сtrl + c и ctrl + V не блокируются, при вставке автоматически удаляются все лишние символы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Bog d`An
Дата 24.1.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 26.3.2005
Где: Украина:Днепропет ровск

Репутация: нет
Всего: 3



Код

const WrongSepArr : array[0..1] of char =('.',',');

Procedure TForm1.EditChange2(Sender: TObject);
Var
  CurStr: String;
  Counter,
  SelPos,
  SeparatorPos  :Integer;
  isSeparator: Boolean;
begin
  SelPos:= TEdit(Sender).SelStart;
  CurStr:=PChar(TEdit(Sender).Text);

  if length(curStr)<1 then
    Exit;

  for counter := low(WrongSepArr) to high(WrongSepArr) do
    if WrongSepArr[counter]<> DecimalSeparator then
      While Pos(WrongSepArr[counter],CurStr)>0 do
        CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;

  SeparatorPos:=Pos(DecimalSeparator,CurStr);
  for Counter:= Length(CurStr) downto 2 do
  Begin
    if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then
      curStr[Counter] := DecimalSeparator
    else
      if not (curStr[Counter] in ['0'..'9',#8,#42]) then
      Begin
        Delete(CurStr,counter,1);
        dec(SelPos);
      End;
  End;

  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then
  Begin
    curStr[1] := DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos);
  End;

  if length(curStr)>=2 then
    if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then
      Begin
        insert('0',curStr,2);
        inc(SelPos);
      End;
  if not (curStr[1] in ['0'..'9','+','-',#8,#42]) then
  Begin
    Delete(CurStr,1,1);
  End;

  While (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do
  Begin
    delete(CurStr,1,1);
  End;
  While (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do
  Begin
    delete(CurStr,2,1);
  End;

  TEdit(Sender).Text:=CurStr;
  TEdit(Sender).SelStart:=SelPos;

end;


работает smile

Это сообщение отредактировал(а) Bog d`An - 24.1.2006, 10:25
--------------------
Удача откроет двери даже там, где их нет.Генри Морган--------------------[Furry team][Agent`s team][СРУКер]   
PM MAIL WWW   Вверх
Romikgy
Дата 24.1.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Bog d`An @ 24.1.2006, 08:06 Найти цитируемый пост)

С запятыми косяк... и позицией курсора...

В смысле косяк?, курсор только в конце.
Цитата(Bog d`An @ 24.1.2006, 09:23 Найти цитируемый пост)

 if not (curStr[Counter] in ['0'..'9',#8,#42]) then

Зачем юзать #8 в ченже??? Ведь это бекспейс, а он стирает символ, и в ф-цию передается строка без символа, стертого и символа 8 smile
А че такое 42 smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Albinos_x
Дата 24.1.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(Romikgy @ 24.1.2006, 11:04 Найти цитируемый пост)

А че такое 42

может он хотел написать 46(Del)


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Romikgy
Дата 24.1.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Дык и он зачем этот дел в Change ???


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 24.1.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

Дык и он зачем этот дел в Change ???

я думаю это "остатки" EditKeyDown1


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 24.1.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Оттож!!!! В ченже они ненадо!!!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ivan219
Дата 24.1.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(alexeis1 @ 24.1.2006, 09:54)
ivan219 Мой алгоритм ведь работает какие еще проблемы??
Разрешает вводить только числа причем только с правельным разделителем, все посторонние символы удаляются, второй и последующие разделители так же удаляются, перед числом можно поставить + или -, сtrl + c и ctrl + V не блокируются, при вставке автоматически удаляются все лишние символы.

Почти когда на запятую два раза жмёш то курсор в ночало уходит.
Добавлено @ 18:15
Цитата(Romikgy @ 23.1.2006, 11:19)
А так ?
Код

procedure TForm1.Edit1Change(Sender: TObject);
var i: dword;
    sx:string;
begin
sx:=Edit1.Text;
if length(sx)<1 then exit;
if not ((sx[1]) in ['+','-','0'..'9','.',',']) then system.Delete(sx,1,1);
 for i:=2 to length(sx) do
 begin
 if (not ((sx[i]) in ['0'..'9','.',',']))
 then system.Delete(sx,i,1);
  end;
  for i:=1 to length(sx) do
  if (sx[i] in ['.',',']) then sx[i]:=DecimalSeparator;
  Edit1.Text:=sx;
  Edit1.SelStart:=length(sx);
end;

Этот код тоже хорош но с запятыми проблема их можно целую кучу ставить а нужна всего одна.
PM MAIL ICQ   Вверх
Alexeis
Дата 24.1.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459




ошибка исправлена(решение украдено у Bog d`An)

Код

procedure TForm1.Edit1Change(Sender: TObject);
var
  i : integer;
  fl : boolean;
  s  : ansiString;
  i1 : byte;
  SelPos : integer;

begin
  i1 := 1;
  fl := false;
  s := Edit1.Text;

  SelPos:= TEdit(Sender).SelStart;

  if length(s) < 1
  then
    exit;

  if s[i1] in ['+','-']
  then
    i1 := 2;

  if s[i1] = '.'
  then
    delete(s, i1, 1);

  for i := i1 to length(s)
  do
    if not fl
    then
      Begin
        if not (s[i] in ['0'..'9',DecimalSeparator])
        then
          delete(s, i, 1)
        else
          if s[i] = DecimalSeparator
          then
            fl := true
      end
    else
      if not (s[i] in ['0'..'9'])
      then
        delete(s, i, 1);

  Edit1.Text := s;
  TEdit(Sender).SelStart:=SelPos;
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
Дата 24.1.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(Bog d`An @ 24.1.2006, 10:23)
Код

const WrongSepArr : array[0..1] of char =('.',',');

Procedure TForm1.EditChange2(Sender: TObject);
Var
  CurStr: String;
  Counter,
  SelPos,
  SeparatorPos  :Integer;
  isSeparator: Boolean;
begin
  SelPos:= TEdit(Sender).SelStart;
  CurStr:=PChar(TEdit(Sender).Text);

  if length(curStr)<1 then
    Exit;

  for counter := low(WrongSepArr) to high(WrongSepArr) do
    if WrongSepArr[counter]<> DecimalSeparator then
      While Pos(WrongSepArr[counter],CurStr)>0 do
        CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;

  SeparatorPos:=Pos(DecimalSeparator,CurStr);
  for Counter:= Length(CurStr) downto 2 do
  Begin
    if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then
      curStr[Counter] := DecimalSeparator
    else
      if not (curStr[Counter] in ['0'..'9',#8,#42]) then
      Begin
        Delete(CurStr,counter,1);
        dec(SelPos);
      End;
  End;

  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then
  Begin
    curStr[1] := DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos);
  End;

  if length(curStr)>=2 then
    if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then
      Begin
        insert('0',curStr,2);
        inc(SelPos);
      End;
  if not (curStr[1] in ['0'..'9','+','-',#8,#42]) then
  Begin
    Delete(CurStr,1,1);
  End;

  While (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do
  Begin
    delete(CurStr,1,1);
  End;
  While (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do
  Begin
    delete(CurStr,2,1);
  End;

  TEdit(Sender).Text:=CurStr;
  TEdit(Sender).SelStart:=SelPos;

end;


работает smile


Работае я немного подправил так что всё ОК smile

Тут даже когда первая стоит запятая то ставит 0, это ещё лучше сам пытался это реализовать но неполучилось вобщем всё работает smile

Код

const WrongSepArr : array[0..1] of char =('.',',');

Procedure TForm1.Edit1Change(Sender: TObject);
Var
  CurStr: String;
  Counter,
  SelPos,
  SeparatorPos  :Integer;
  isSeparator: Boolean;
begin
  SelPos:= TEdit(Sender).SelStart;
  CurStr:=PChar(TEdit(Sender).Text);
  if length(curStr)<1 then
    Exit;
  for counter := low(WrongSepArr) to high(WrongSepArr) do
    if WrongSepArr[counter]<> DecimalSeparator then
      While Pos(WrongSepArr[counter],CurStr)>0 do
        CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;
  SeparatorPos:=Pos(DecimalSeparator,CurStr);
  for Counter:= Length(CurStr) downto 2 do
  Begin
    if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then
      curStr[Counter] := DecimalSeparator
    else    
      if not (curStr[Counter] in ['0'..'9']) then
      Begin
        Delete(CurStr,counter,1);    
        dec(SelPos);
      End;
  End;    
  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then
  Begin
    curStr[1] := DecimalSeparator;    
    insert('0',curStr,0);
    inc(SelPos);
  End;
  if not (curStr[1] in ['0'..'9']) then
  Begin
    Delete(CurStr,1,1);    
  End;
  While (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do    
  Begin    
    delete(CurStr,1,1);
  End;    
  TEdit(Sender).Text:=CurStr;
  TEdit(Sender).SelStart:=SelPos;
end;


Спасибо!!!!!!! smile
Добавлено @ 18:30
Ещё Bog d`An если можеш распши всё просто мне надо это понять а так я неразберусь хотя попытають.
PM MAIL ICQ   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.