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

Поиск:

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


Эксперт
***


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

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



Здравствуйте.

Есть компонент Edit1 мне внего нужно писать только цифры и запятую преобразование из знаков в цифры делаю препомощи (R1:=StrToFloat(Edit1.Text);) так вот если в водить число (12,23) то всё ОК а если (12.23) то вознекает ошибка.

Вопрос: как зделать так чтоб при нажатии на ( . ) в окне Edit1 поевлялась ( , ) и ошибки небыло.
PM MAIL ICQ   Вверх
Albinos_x
Дата 18.12.2005, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Код

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


Это сообщение отредактировал(а) Albinos_x - 18.12.2005, 10:13


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


Эксперт
***


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

Репутация: 30
Всего: 50



Albinos_x

Подправлю.

Код

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
      '0'..'9',#8: ;
      ',','.': Key := DecimalSeparator;
      else key := #0;
    end;
end;



--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 18.12.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



тот же икс, только вид сбоку smile


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Albinos_x @ 18.12.2005, 15:23)
тот же икс, только вид сбоку

За исключением
Цитата(Albinos_x @ 18.12.2005, 15:23)
DecimalSeparator;

Это правильнее.
PM MAIL   Вверх
Albinos_x
Дата 18.12.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата(Snowy @ 18.12.2005, 15:25)
Это правильнее.

единственное.... но результат будет тот же...


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


Эксперт
***


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

Репутация: 1
Всего: 11



А если я вставлю эту запятую\точку нажав Ctrl+v? ;) Код будет работать?
По мне наилучший вариант - замена . на , при получение текста данного едита

P.S. Я знаю, что я зануда.


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Демо
Дата 18.12.2005, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Цитата(Albinos_x @ 18.12.2005, 16:58)
единственное.... но результат будет тот же...


Если только в системе разделитель тот же самый. А если нет, то результат будет другой ;)

Вопрос настолько уже избит везде, что даже не знаю, сколько раз можно на него отвечать-))


--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 18.12.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата
А если нет,

ет точно, но если честно, то я с этим не разу не сталкивался...



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


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


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

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



Цитата(DeadSoul @ 18.12.2005, 16:11)
А если я вставлю эту запятую\точку нажав Ctrl+v?
Здеся нужен обработчик onChanged (кажется так правильно), а выше приведенный код только для нажитий на батоны клавы!



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

PM   Вверх
Guest
Дата 20.12.2005, 18:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем спасибо smile
  Вверх
TwisT_X
Дата 20.12.2005, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


It's works!
**


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

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



А я вообще не догнал что такое DecimalSeparator подскажите..


--------------------
Если ты упадешь я буду рядом. (с) Асфальт
PM MAIL WWW   Вверх
Snowy
Дата 20.12.2005, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(TwisT_X @ 20.12.2005, 18:50)
что такое DecimalSeparator подскажите..

Это точка, запятая или что угодно, что явняется разделителем целой и дробной части, согласно настроек системы.

Добавлено @ 18:56
Я могу установить в качестве разделителя слово "хвост" и у меня не будет работать ни точка не запятая, а вот DecimalSeparator будет.
PM MAIL   Вверх
TwisT_X
Дата 20.12.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


It's works!
**


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

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



Snowy спосибо надо будет запомнить..?.


--------------------
Если ты упадешь я буду рядом. (с) Асфальт
PM MAIL WWW   Вверх
Alex
Дата 20.12.2005, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Цитата(Snowy @ 20.12.2005, 18:55)
Я могу установить в качестве разделителя слово "хвост" и у меня не будет работать ни точка не запятая, а вот DecimalSeparator будет.

Горячиться не нужно DecimalSeparator - это Char. Так, что можно только 1 символ поставить.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Guest
Дата 20.12.2005, 22:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ivan219

Работает всем спасибо.
  Вверх
TwisT_X
Дата 20.12.2005, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


It's works!
**


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

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



все таки а чем не подходить простая замена


--------------------
Если ты упадешь я буду рядом. (с) Асфальт
PM MAIL WWW   Вверх
Albinos_x
Дата 20.12.2005, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата(TwisT_X @ 20.12.2005, 22:26)
все таки а чем не подходить простая замена



Цитата(Snowy @ 20.12.2005, 18:55)
Это точка, запятая или что угодно, что явняется разделителем целой и дробной части, согласно настроек системы.




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


It's works!
**


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

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



Albinos_x а ну да.. все ясно..


--------------------
Если ты упадешь я буду рядом. (с) Асфальт
PM MAIL WWW   Вверх
ivan219
Дата 15.1.2006, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Этот процедура делает возможным в компоненте Edit писать только цифры 0...9 ставить только одну запетую и ползоватся клавишей Backspace <---

Код


// Пресвоить всем Edit событие OnKeyPress

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
var  A: String;
begin
 A:=(Sender as TEdit).Text;
 case Key of
  '0'..'9',#8:;
  ',','.':
   begin
    if pos(',',A)=0 then Key := DecimalSeparator;
    if pos(',',A)>0 then Key := #0;
   end;
  else
   Key := #0;
  end;
end;


smile
PM MAIL ICQ   Вверх
ivan219
Дата 15.1.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Так это я его и дописал из несколких которые вы мне дали, сночало был
Код

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);    
begin    
    case Key of    
      '0'..'9',#8: ;    
      ',','.': Key := DecimalSeparator;    
      else key := #0;    
    end;    
end;


Внём было две проблемы первая это возможность ставить больше чем одна запетая а это не правильно так что я перестраховался чтоб проблем небыло что разве это плохо когда код доведён до ума smile
Вторая это много проуедур скажем есть уменя 6 штук Edit и что мне для каждого пришлось писать
Код

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);        
begin    
 case Key of    
  '0'..'9',#8:;    
  ',','.':    
   begin    
    if pos(',',Edit1)=0 then Key := DecimalSeparator;    
    if pos(',',Edit1)>0 then Key := #0;    
   end;    
  else    
   Key := #0;    
  end;    
end;


Это тоже не выход 6 лишних процедур дополнительный код место и.т.д.

Вот я и зделал одну.
Код

// Пресвоить всем Edit событие OnKeyPress    
procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);    
var  A: String;    
begin    
 A:=(Sender as TEdit).Text;    
 case Key of    
  '0'..'9',#8:;    
  ',','.':    
   begin    
    if pos(',',A)=0 then Key := DecimalSeparator;    
    if pos(',',A)>0 then Key := #0;    
   end;    
  else    
   Key := #0;    
  end;    
end;


А если где встречалась так это хорошо, вот только почемуто мне самому прешось до этого дойти и слова критики в свой адрес я считаю не провомерными так как я для других токихже как я сторался чтоб потом было проше.
PM MAIL ICQ   Вверх
Демо
Дата 16.1.2006, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Цитата(ivan219 @ 15.1.2006, 18:46 Найти цитируемый пост)

Вот я и зделал одну.


Правильно будет работать, только если разделитель - запятая.

Вот тебе еще вариант ;)

Код

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin

    case Key of
        '0'..'9',#8:;
        ',','.':
            begin
                if Pos(DecimalSeparator,TEdit(Sender).Text)>0
                    then Key := #0
                    else Key := DecimalSeparator;
            end;
    else Key := #0;
    end;
end;




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


Эксперт
***


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

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



Да вобще по уневерсальнее.

Есть ещё вопрос как реализовать копирование т.е. есть 12.12 при такой записи будет ошибка надо автоматически зделать из 12.12 -> 12,12 когда копируеш из другого места smile
PM MAIL ICQ   Вверх
Демо
Дата 16.1.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Цитата(ivan219 @ 16.1.2006, 19:09)
Да вобще по уневерсальнее.

Есть ещё вопрос как реализовать копирование т.е. есть 12.12 при такой записи будет ошибка надо автоматически зделать из  12.12 -> 12,12 когда копируеш из другого места smile

Обработать в OnChange ?


--------------------
    
PM MAIL ICQ Skype   Вверх
ivan219
Дата 16.1.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А по конкретнее как smile
PM MAIL ICQ   Вверх
Демо
Дата 16.1.2006, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Код

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
        '0'..'9',#8:;
        ',','.':
            begin
                if Pos(DecimalSeparator,TEdit(Sender).Text)>0
                    then Key := #0
                    else Key := DecimalSeparator;
            end;
    else Key := #0;
    end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
  i: integer;
  isSeparator: Boolean;
  s: String;
begin
  isSeparator := False;
  s := TEdit(Sender).Text;
  for i := 1 to Length(s) do
  begin
    case TEdit(Sender).Text[i] of
        '0'..'9',#8: Continue;
        ',','.':
            begin
                if isSeparator then Abort;
                s[i] := DecimalSeparator;
                isSeparator := True;
            end;
    else Abort;
    end;
  end;
  TEdit(Sender).Text := s;
end;



--------------------
    
PM MAIL ICQ Skype   Вверх
ivan219
Дата 16.1.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Во спасибо smile

А как реализовать буфер обмена чтоб использовать комбинацию клавиш Ctrl+C Ctrl+V smile smile
PM MAIL ICQ   Вверх
Демо
Дата 17.1.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Цитата(ivan219 @ 17.1.2006, 00:03 Найти цитируемый пост)

А как реализовать буфер обмена


В смысле - как реализовать? Вставка и копирование работают по-умолчанию. Для этого ничего не надо писать дополнительно.


--------------------
    
PM MAIL ICQ Skype   Вверх
ivan219
Дата 17.1.2006, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Нет. Это когда меню вызываеш а мне надо Ctrl+C Ctrl+V smile

Вот нашол только как это реализовать чтоб было по нажатию Ctrl+C Ctrl+V

Код

procedure Tform1.CopyStringToClipboard(s: string);
var
  hg: THandle;
  P: PChar;
begin
  hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
  P:=GlobalLock(hg);
  StrPCopy(P, s);
  GlobalUnlock(hg);
  OpenClipboard(Application.Handle);
  SetClipboardData(CF_TEXT, hg);
  CloseClipboard;
  GlobalFree(hg);
end; 

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


Бывалый
*


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

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



Цитата(Демо @ 16.1.2006, 22:45 Найти цитируемый пост)

Код

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
        '0'..'9',#8:;
        ',','.':
            begin
                if Pos(DecimalSeparator,TEdit(Sender).Text)>0
                    then Key := #0
                    else Key := DecimalSeparator;
            end;
    else Key := #0;
    end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
  i: integer;
  isSeparator: Boolean;
  s: String;
begin
  isSeparator := False;
  s := TEdit(Sender).Text;
  for i := 1 to Length(s) do
  begin
    case TEdit(Sender).Text[i] of
        '0'..'9',#8: Continue;
        ',','.':
            begin
                if isSeparator then Abort;
                s[i] := DecimalSeparator;
                isSeparator := True;
            end;
    else Abort;
    end;
  end;
  TEdit(Sender).Text := s;
end;



Насчёт одной запятой - не будет работать, if not(DecimalSeparator in [',','.']) then думать надо, как DecimalSeparator, который не является константой запихать в case...

вариант: всё что не является буквой или цифрой считать разделителем... Действительно точка и запятая - довольно скудно... например(не претендуя на реальность ситуации) разделителем является '&' а вместо него напечатали(опечаткались) '^'

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


Эксперт
***


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

Репутация: 30
Всего: 50



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

Насчёт одной запятой - не будет работать


Конкретнее, что и в каком конкретно месте не будет работать?

За универсализмом не надо гоняться. Нужно исходить из реалии и целесообразности.

например(не претендуя на реальность ситуации) разделителем является '&'

Почему бы тогда не предположить, что разделителем будет знак '-' или '+' (которые как раз тоже надо добавить в набор допустимых символов, и обработка, следовательно, усложнится), которые вляются допустимыми в числах?


--------------------
    
PM MAIL ICQ Skype   Вверх
ivan219
Дата 17.1.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Почему не будет уменя 2 вареанта работают и кроме , и . болше ненашто нереагирует некаких +-*/?:%;№"!" нет а если при копировании то это каким же надо быть чтоб пренять @ в качестве , или .

Лучше обесните как выгледит нажатие клавиш Ctrl+C Ctrl+V smile как это реализовать smile

Это сообщение отредактировал(а) ivan219 - 17.1.2006, 11:59
PM MAIL ICQ   Вверх
Alexeis
Дата 17.1.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата

Лучше обесните как выгледит нажатие клавиш Ctrl+C Ctrl+V  как это реализовать

Выделяем любой текст , жмем Ctrl+C
кликаем по Edit у , Жмем Ctrl+V и все smile smile smile


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

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

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


Эксперт
***


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

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



Я незнаю может что нужно вкл. но такой способ непроходит Ctrl+С потм Ctrl+V вот с помощю меню можно вставить и копировать можно вырезазт отменить а комбинация клавиш Ctrl+С Ctrl+V не проходит smile
PM MAIL ICQ   Вверх
Romikgy
Дата 17.1.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Конечно не будет работать smile ведь ты все буквы режешь в кейпрессе , перенеси в кейдаун и разреши необходимые те комбинации клавишь


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

PM   Вверх
Демо
Дата 17.1.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



Цитата(Romikgy @ 17.1.2006, 15:18 Найти цитируемый пост)

Конечно не будет работать


У меня работает в том виде, в котором написал. ;)

То, что у автора не работает, явно зависит от его остального кода и настроек форм, hotKey и т.д.


Это сообщение отредактировал(а) Демо - 17.1.2006, 16:27


--------------------
    
PM MAIL ICQ Skype   Вверх
Bog d`An
Дата 17.1.2006, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Код

        ',','.':
            begin
                if Pos(DecimalSeparator,TEdit(Sender).Text)>0
                    then Key := #0
                    else Key := DecimalSeparator;
            end;


вот это. Если DecimalSeparator не является точкой или запятой, он пойдёт не сюда а в else

Но, действительно или целесообразность, или универсальность...
Цитата

Почему бы тогда не предположить, что разделителем будет знак '-' или '+'

тогда зачем вообще использовать DecimalSeparator? писали бы '.'

вот что-то более-менее универсальное
Код

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);

  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)-1 downto 0 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
        Delete(CurStr,counter,1);
  End;
  TEdit(Sender).Text:=CurStr;
  TEdit(Sender).SelStart:=SelPos;
end;



Цитата(Romikgy @ 17.1.2006, 14:18 Найти цитируемый пост)

Конечно не будет работать smile ведь ты все буквы режешь в кейпрессе , перенеси в кейдаун и разреши необходимые те комбинации клавишь

Правильно! там возможностей больше!
и ещё для формы KeyPreview := true

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


Эксперт
***


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

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



Bog d`An товой код немного фальшивит в Edit можно писать и буквы только каждая последующая заменяет предыдущюю и запетые там можно их 2 штуки ставить.

А поподробнее можно как в KeyDown это реализовать smile smile
PM MAIL ICQ   Вверх
Bog d`An
Дата 20.1.2006, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Упс. Щас посмотрю.
Добавлено @ 06:28
Цитата(ivan219 @ 20.1.2006, 03:16 Найти цитируемый пост)

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

Это потому что в событии onChange


примерно так
Код

procedure TForm1.EditKeyDown1(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Var
  Counter:Integer;
begin
  for counter := low(WrongSepArr) to high(WrongSepArr) do
    if WrongSepArr[counter]<> DecimalSeparator then
      if key = ord(WrongSepArr[counter]) then key:= ord(DecimalSeparator);

  if key in [ord(DecimalSeparator)] then
  Begin
    if Pos(DecimalSeparator,TEdit(Sender).Text)>0 then
      Key := 0;
  End
  else            //ord('0')..ord('9')
    if not (Key in [48..57,8,42]) then
      Key := 0;
end;


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


Эксперт
***


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

Репутация: 30
Всего: 50



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

примерно так


Извини, но ты свой код пробовал хотя бы проверить?

Могу даже предложить попроовать вот такой:

Код

procedure TfMain.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Key := 0;
end;



Эффект будет аналогичен.

Это сообщение отредактировал(а) Демо - 20.1.2006, 12:27


--------------------
    
PM MAIL ICQ Skype   Вверх
ivan219
Дата 20.1.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Компилятору чегото ненравится [Ошибка] Unit1.pas(103): Undeclared identifier: 'WrongSepArr'
Код

for counter := low(WrongSepArr) to high(WrongSepArr) do

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


Бывалый
*


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

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



нет не пробовал smile
а надо? smile
Добавлено @ 14:58
Цитата(ivan219 @ 20.1.2006, 14:51 Найти цитируемый пост)

Компилятору чегото ненравится [Ошибка] Unit1.pas(103): Undeclared identifier: 'WrongSepArr'

константа с предидущего примера...
Код

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

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


Эксперт
***


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

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



Ошибок нет а всё равно буквы идут когбудто и нет нечего.
PM MAIL ICQ   Вверх
Демо
Дата 20.1.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 30
Всего: 50



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

а надо?


Надо, так как твой пример в OnKeyDown не будет работать ни в каком виде.


--------------------
    
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 20.1.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Как вам вот это
Код

procedure TForm1.Edit1Change(Sender: TObject);
var
  i : integer;
  fl : boolean;
  s  : ansiString;
  i1 : byte;
begin
  i1 := 1;
  fl := false;
  s := Edit1.Text;
  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;
end;



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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
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   Вверх
Alexeis
Дата 24.1.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



в коде Bog d`An есть маленький глюк если установить курсор
в начало строки и жать del то работает как то странно...
Добавлено @ 18:59
если добавить - а перед ним разделитель минус удаляется

Это сообщение отредактировал(а) alexeis1 - 24.1.2006, 18:56


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

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

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


Эксперт
***


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

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



Может кто подскажет как этот код в компоненте исползовать я тут попробовал но чтот неполучилось компонент установился а толку мало может кто даст ссылку на литераратуру где можно почитать ка создовать свои компоненты или пожет от куда начать.
Код

unit Edit1;

interface

uses
  SysUtils, Classes, Controls, StdCtrls;

type
  TEdit1 = class(TEdit)
  Procedure EditChange(Sender: TObject);
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Ïðèìåðû', [TEdit1]);
end;

Procedure TEdit1.EditChange(Sender: TObject);
const WrongSepArr : array[0..1] of char =('.',',');
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 Delete(CurStr,1,1);
  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;
end.


smile smile
PM MAIL ICQ   Вверх
Akella
  Дата 25.1.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



про подмену разделителя целой и дробной части:
давно уже сделано
не забываем про "Арсенал"
http://forum.vingrad.ru/index.php?showtopi...st&amp;p=409416

Это сообщение отредактировал(а) Akella - 30.1.2006, 12:26
PM MAIL   Вверх
Bog d`An
Дата 26.1.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

В смысле косяк?, курсор только в конце.

а если юзверь станет в середине печатать?

Цитата(alexeis1 @ 24.1.2006, 18:47 Найти цитируемый пост)

если добавить - а перед ним разделитель минус удаляется

??? что бы это значило?

Код

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                          //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшина длина)
  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 length(curStr)>=2 then                                //Если длина больше 1
    if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
      Begin
        insert('0',curStr,2);                                    //Вставить 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;
  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;

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


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 31.1.2006

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



Ниже приведён код, который не позволяет вводить ничего лишнего, кроме символов и всего что их касаеца.
Так же он оставляет знаки "+" и "-" только в начале, и оставляет только один разделитель.
Запехни его просто в обработчик OnChange.
Код

var
  i: Integer;
  sx: string;
  Flag: Boolean;
begin
  Flag := False;
  sx := TDBEdit(Sender).Text;
  if length(sx) < 1 then
    Exit;
  for i := 1 to length(sx) do
    if not (sx[i] in ['+', '-', '0'..'9', '.', ',']) then
      system.Delete(sx,i,1)
      else
      begin
        if (sx[i] in ['+', '-']) and (i <> 1) then
          begin
            system.Delete(sx,i,1);
          end;
        if (sx[i] in ['.', ',']) then
          begin
            if Flag = True then
              begin
                system.Delete(sx,i,1);
              end
              else
              begin
                sx[i] := DecimalSeparator;
                Flag := True;
              end;
          end;
      end;
  TDBEdit(Sender).Text := sx;
  TDBEdit(Sender).SelStart := length(sx);


Это сообщение отредактировал(а) Kuper - 9.2.2006, 10:15
PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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