Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2013, 15:14   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию При вводе более 3-х одинаковых символов удалять символ

Здравствуйте, не работает обработчик события,в котором нельзя вводить более 3-х точек

Код:
var pr:byte=3;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const Digit: Set of Char=['0' .. '9','.',#08];
begin
  if not (Key in Digit) then  Key:=#0;
  if Key='.' then Dec(pr);
  if (pr=0) and (Key='.') then key:=#0;
end;
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 21.04.2013, 16:14   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Он работает.
Только, вероятно, не совсем так, как Вам хочется.
Т.к. Вы не объяснили, чего хотите, предположу, что (pr=0) нужно заменить на (pr<=0).
И в этом случае лучше сделать его не byte, а что-нибудь знаковое, например, intewger. Иначе при вычитании из 0 он становится =255.

В принципе, более радикальное средство:
Код:
if (Key='.') and (pr>0) then Dec(pr);
Но это все догадки, вызванные недостатком информации.
s-andriano вне форума Ответить с цитированием
Старый 21.04.2013, 16:14   #3
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Код:
var MaxPts: Byte = 3;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const AllowedChars: Set of Char = ['0'..'9','.'];
begin
  if (Key = #8) then
    //Если стираемый символ - точка, то увеличиваем счетчик
    if Edit1.Text[Edit1.SelStart] = '.' then Inc(MaxPts);
  else if CharInSet(Key, AllowedChars) then begin
    //Если вводимый символ в допустимых пределах
    //Если вводимый символ - точка и счетчик больше нуля, то пишем точку
    if (Key = '.') then if (MaxPts > 0) then Dec(MaxPts)
                                        else Key := #0;
  end else Key := #0;
end;
JoLan вне форума Ответить с цитированием
Старый 21.04.2013, 16:40   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

А тупо посчитать точки, не? Зачем при вводе это делать?
Человек_Борща вне форума Ответить с цитированием
Старый 21.04.2013, 16:44   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
А тупо посчитать точки, не? Зачем при вводе это делать?
Это как раз понятно - чтобы о, что отображается на экране, соответствовало тому, что будет считано.
Корежить введенное пользователем без его ведома - дурной тон.
s-andriano вне форума Ответить с цитированием
Старый 21.04.2013, 17:54   #6
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

вводится ip адрес например 255.255.255.233

допустимо только три точки, остальные не будут прописываться, вот этого и хочу добиться
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 21.04.2013, 18:05   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

MaskEdit и MaskEdit.EditMask='999.999.999.999' ;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2013, 18:08   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

ТС, пфф, брр ну на нагромоздили вы кода.... непонятного.

Аватар, не вариант. В IP байты а не целые.
Держите..
Код:
function IsValidIPv4(const aStr: string): Boolean;

function Cut(var aStr: string; aFrom, aTo: Integer;
  const aToLen: Integer = 0): string;
begin
  if aToLen = 0 then
    Result := Copy(aStr, aFrom, aTo)
  else
    Result := Copy(aStr, aFrom, aTo - aToLen);
  Delete(aStr, aFrom, aTo);
end;

var
  Bytes: array [1 .. 4] of string;
  ByteCheck: array [1 .. 4] of Boolean;
  s: string;
  p, i: Integer;
begin
  Result := False;
  s := Trim(aStr);
  if (Length(s) > 15) then
    Exit;
  p := Pos('.', s);
  if (p = 0) then
    Exit;
  Bytes[1] := Trim(Cut(s, 1, p, 1)); // 111, 111.222.333.444

  p := Pos('.', s);
  if (p = 0) then
    Exit;
  Bytes[2] := Trim(Cut(s, 1, p, 1)); // 222

  p := Pos('.', s);
  if (p = 0) then
    Exit;
  Bytes[3] := Trim(Cut(s, 1, p, 1)); // 333
  Bytes[4] := Trim(s); // 444

  for i := 1 to 4 do
  begin
    if TryStrToInt(Bytes[i], p) then
      ByteCheck[i] := (p <= 255) and (p >= 0);
  end;
  Result := (ByteCheck[1] and ByteCheck[2] and ByteCheck[3] and ByteCheck[4]);
end;

Последний раз редактировалось Человек_Борща; 21.04.2013 в 18:15.
Человек_Борща вне форума Ответить с цитированием
Старый 21.04.2013, 18:12   #9
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Человек_Борща спасибо вам большое, но мне не лишь бы сделать, а понять, и придумать свой алгоритм)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 21.04.2013, 18:49   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

1. Убираете пробелы(Trim)
2. Проверяете длину строки. Должна быть <= 15 знакам.
3. От начала строки до точки копируете знаки, и отрезаете скопированное вместе с точкой. Если точку не нашли, то exit и result = FALSE.
=> 111.222.333.444
-1. Отрезали 111, осталось 222.333.444
-2. Отрезали 222, осталось 333.444
-3. Отрезали 333, осталось 444
-4. Преобразуем в число оставшееся.

4.
теперь циклом по массиву и преобразуете строки в числа, для этого придумана TryStrToInt, если не преобразовало, для этого байта result = FALSE, если преобразовало, то выполняется проверка:
(<число> >= 0) and (<Число> <= 255) если соблюдается, то для этого байта result = TRUE

В результат функции просто проверяете чтобы все 4 байта имели значение TRUE.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] Удаление одинаковых символов со строки decantnik Помощь студентам 6 01.09.2013 00:37
строки ,замена одинаковых символ , что расположены рядом Olga1991_1 Общие вопросы C/C++ 9 02.12.2012 01:16
Ошибка при вводе лаинских и русских символов Sarumjan Общие вопросы по Java, Java SE, Kotlin 0 26.10.2012 14:57
Не срабатывание русской кодировки при вводе символов с клавиатуры Syltan Общие вопросы C/C++ 5 24.05.2010 19:16
Автозаполнение при вводе пару символов Syltan Операционные системы общие вопросы 2 20.05.2010 16:51