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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Запятая вместо точки, Как это реализовать 
:(
    Опции темы
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.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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