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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2013, 21:38   #1
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
Вопрос Проверка полей на наличие или отсутствие определенных символов (Delphi)

Оговорюсь сразу что с паскалем до сегодняшнего утра работал последний раз еще лет 5 назад и то методом научного тыка и путем капипасты готовых процедур.

Задача:
Форма регистрации пользователя. Собранные данные пишет по шаблону в txt файл. Есть 4 поля: ФИО, Название компании, телефон, мыло.



Итог:
Форму создал, все вроде сделал правильно, но нужно сделать проверку на вводимые символы в определенных полях. Например в ФИО только буквы, в телефоне только цифры, в мыле должны быть символы "@" и ".", в названии компании все что угодно.

Перебрал вот это и вот это, но увы результата не добился.

Подскажите пожалуйста что не так делаю и как правильно)

Вот код.
Код:
unit Registr;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
  TFormRegistr = class(TForm)
    FIO: TEdit;
    Company: TEdit;
    Phone: TEdit;
    email: TEdit;
    ButtonRegistr: TButton;
    ButtonHelp: TButton;
    LabelFIO: TLabel;
    LabelCompany: TLabel;
    LabelPhone: TLabel;
    LabelEmail: TLabel;
    Label1: TLabel;
    Label2: TLabel;
    procedure ButtonHelpClick(Sender: TObject);
    procedure ButtonRegistrClick(Sender: TObject);
    //procedure PhoneKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormRegistr: TFormRegistr;

implementation

{$R *.dfm}

uses help;

function GetCurrentUserName: string;
 const
   cnMaxUserNameLen = 254;
 var
   sUserName: string;
   dwUserNameLen: DWORD;
 begin
   dwUserNameLen := cnMaxUserNameLen - 1;
   SetLength(sUserName, cnMaxUserNameLen);
   GetUserName(PChar(sUserName), dwUserNameLen);
   SetLength(sUserName, dwUserNameLen);
   Result := sUserName;
 end;

// procedure TFormRegistr.PhoneKeyPress(Sender: TObject; var Key: Char);
//const Digit: set of Char=['1'..'9', '0', '(', ')', '-', ' '];
//Множество символов, воспринимаемых как символ-разделитель:
// Separator: set of Char=['(', ')', '-', ' '];
//begin
//with (Sender as TEdit) do
//  begin
//    if (not(Key in Digit))
//       then Key:=#0;
//  end;
//end;

procedure TFormRegistr.ButtonRegistrClick(Sender: TObject);
var SaveTxt:TStringList;
 FIOUsr, CompanyUsr, PhoneUsr, EmailUsr, GetCurrentUserNameUsr:string;
 today : TDateTime;
 i : integer;
begin
SaveTxt:=TStringList.Create;
SaveTxt.LoadFromFile('F:\path\RegData.txt');
today:=Now;
if (GetCurrentUserName <> '') and (FIO.Text <> '') and (Company.Text <> '') and (Phone.Text <> '') and (email.Text <> '') then
  begin
    GetCurrentUserNameUsr:=Trim(GetCurrentUserName);
    FIOUsr:=Trim(FIO.Text);
    CompanyUsr:=Trim(Company.Text);
    PhoneUsr:=Trim(Phone.Text);
    EmailUsr:=Trim(email.Text);
    SaveTxt.Add('"'+GetCurrentUserNameUsr+'"'+'"'+DateToStr(today)+'"'+'#'+'"'+TimeToStr(today)+'"'+'#'+'"'+FIOUsr+'"'+'#'
+'"'+CompanyUsr+'"'+'#'+'"'+'+'+PhoneUsr+'"'+'#'+'"'+EmailUsr+'"');
    SaveTxt.SaveToFile('F:\path\RegData.txt');
    Application.Terminate;
  end;
end;

procedure TFormRegistr.ButtonHelpClick(Sender: TObject);
begin
  FormHelp.ShowModal;
end;

end.
PS И если имеет значение то после этого хочу еще загнать эту программу в автозагрузку и что бы при каждлм входе пользователей шла проверка на то есть ли его регистрационные данные в файле(сопоставляя его логин с тем что прописывается в первую колонку файла RegData.txt). И если таковые есть, то программу гасит(либо открывается следующее окно с кнопками для запуска всякой лабуды).

Последний раз редактировалось Stilet; 14.09.2013 в 21:44.
8tomat8 вне форума Ответить с цитированием
Старый 14.09.2013, 21:52   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
увы результата не добился.
1) Попробуй использовать MaskEdit.
2) Обработчик что ты закоментировал вполне пригоден для обработки и отсечения лишних символов, неужели и он не помогает?
Цитата:
после этого хочу еще загнать эту программу в автозагрузку
Только не пиши в реестр. Делай по человечески - линк на прогу в каталог автозагрузки профиля.
Цитата:
что бы при каждлм входе пользователей шла проверка на то есть ли его регистрационные данные в файле
Ну без проблем. При запуске показывай модально окошко ввода логина и после загрузив данные из файла сверяй с тем что введено:
Код:
with TStringList.Create do begin
 try
  LoadFromFile('F:\path\RegData.txt');
  if pos(
      '#'+'"'+FIOUsr+'"'+'#'+'"'+CompanyUsr+'"'+'#'+'"'+'+'+PhoneUsr+'"'+'#'+'"'+EmailUsr+'"'
  ,text)=0 then begin ShowMessage('Нема такого'); free; halt; end;
 except
  on e:Exception do ShowMessage('Ошибка загрузки данных: '+e.Message);
 end;
 free;
end;
Только с halt аккуратнее. Возможно его лучше будет заменить на ExitProcess или в принципе делать эту проверку в dpr а не в модуле формы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2013, 22:01   #3
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
1) Попробуй использовать MaskEdit.
Спасибо сейчас поищу с чем его едят
Цитата:
Сообщение от Stilet Посмотреть сообщение
2) Обработчик что ты закоментировал вполне пригоден для обработки и отсечения лишних символов, неужели и он не помогает?
Неа, абсолютно никакой реакции ни на одном из полей....
И кстати не подскажите "то что я закомменитировал" распространяеться на все поля или только на поле ввода номера телефона?)) А то я не очень понял как прописал его без ошибок)
Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну без проблем. При запуске показывай модально окошко ввода логина и после загрузив данные из файла сверяй с тем что введено:
Код:
with TStringList.Create do begin
 try
  LoadFromFile('F:\path\RegData.txt');
  if pos(
      '#'+'"'+FIOUsr+'"'+'#'+'"'+CompanyUsr+'"'+'#'+'"'+'+'+PhoneUsr+'"'+'#'+'"'+EmailUsr+'"'
  ,text)=0 then begin ShowMessage('Нема такого'); free; halt; end;
 except
  on e:Exception do ShowMessage('Ошибка загрузки данных: '+e.Message);
 end;
 free;
end;
Только с halt аккуратнее. Возможно его лучше будет заменить на ExitProcess или в принципе делать эту проверку в dpr а не в модуле формы.
Пользователь больше не видит это окно) Его логин берется вот так
Код:
function GetCurrentUserName: string;
 const
   cnMaxUserNameLen = 254;
 var
   sUserName: string;
   dwUserNameLen: DWORD;
 begin
   dwUserNameLen := cnMaxUserNameLen - 1;
   SetLength(sUserName, cnMaxUserNameLen);
   GetUserName(PChar(sUserName), dwUserNameLen);
   SetLength(sUserName, dwUserNameLen);
   Result := sUserName;
 end;
и потом я так понял нужно просто искать "GetCurrentUserName" в файле?)

PS Точнее
Код:
'"'+GetCurrentUserName+'"'

Последний раз редактировалось 8tomat8; 14.09.2013 в 22:16.
8tomat8 вне форума Ответить с цитированием
Старый 14.09.2013, 22:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
абсолютно никакой реакции ни на одном из полей....
Значит ты его не прицепил к полю. Мало описать код, нужно еще назначить событие в инспекторе объектов для эдитов.
А если назначено то отлаживать. Я как правило пишу попроще:
Код:
procedure TFormRegistr.PhoneKeyPress(Sender: TObject; var Key: Char);
begin
 if not (key in ['0'..'9', '(', ')', '-', ' ']) then key:=#0;
end;
И ничего лишнего.
Цитата:
Пользователь больше не видит это окно)
Ну а как ты его авторизировать собрался при входе? Через GetCurrentUserName?
Тогда делай поиск по
Код:
pos('"'+GetCurrentUserNameUsr+'"',text)=0
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2013, 22:45   #5
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Значит ты его не прицепил к полю. Мало описать код, нужно еще назначить событие в инспекторе объектов для эдитов.
А если назначено то отлаживать. Я как правило пишу попроще:
Код:
procedure TFormRegistr.PhoneKeyPress(Sender: TObject; var Key: Char);
begin
 if not (key in ['0'..'9', '(', ')', '-', ' ']) then key:=#0;
end;
И ничего лишнего.
Переписал и заработало) Спасибо) Низкий поклон)

Но только что стала проблема с вводом русских и украинских букв. Прописал их как посоветовали тут
Код:
const Symbols: set of Char = ['a'..'z', 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц'
, 'ч', 'ш', 'щ', 'ы', 'ь', 'ъ', 'э', 'ю', 'я', 'ё', 'ї', 'ґ', 'є', 'і', #8];
Но все равно не пропускает.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну а как ты его авторизировать собрался при входе? Через GetCurrentUserName?
Тогда делай поиск по
Код:
pos('"'+GetCurrentUserNameUsr+'"',text)=0
Юзеры входят по RDP, а эта утилита служит только для одноразового сбора информации) Ну или если я увижу что данные левые, я просто удаляю его строку из RegData и у него при следующем входе снова выскочит это окно)

PS И вот только что подумал, а можно ли запретить юзеру alt+f4 на этой конкретной форме?

Последний раз редактировалось Stilet; 14.09.2013 в 22:56.
8tomat8 вне форума Ответить с цитированием
Старый 14.09.2013, 22:58   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
стала проблема с вводом русских и украинских букв.
Насчет алфавита рекомендую - забей. Не ограничивай в этом, себе проще будет и юзеру.
Цитата:
можно ли запретить юзеру alt+f4 на этой конкретной форме?
Ну не запретить а проверить и отменить закрытие.
Делается это в событии OnQueryClose. Action выставляется в caNone и форма не закрывается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2013, 23:14   #7
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Насчет алфавита рекомендую - забей. Не ограничивай в этом, себе проще будет и юзеру.
Как говориться - безумству храбрых поем мы песни...
Я решил пойти от обратного и нашел в интернете таблицу самых распространенных символов и пошел от обратного)))
Код:
procedure TFormRegistr.FIOKeyPress(Sender: TObject; var Key: Char);
const Symbols: 
set of Char = ['1'..'9', '0', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '*', '®', '¯',
 '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å',
 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'à',
 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'ø', 'ù', 'ú', 'û',
 'ü', 'ý', 'þ', 'ÿ', 'ƒ', 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ',
 'Χ', 'Ψ', 'Ω', 'α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'ς', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', '←',
 '↑', '→', '↓', '↔', '♠', '♣', '♥', '♦', '"', '&', '<', '>', 'ˆ', '˜', '™', '•', '…', '′', '″', '‾', '⁄', '–', '—', '‘', '’', '‚', '“',
 '”', '„', '!', '@', '#', '$', '%', '*', '(', ')', '-', '_', '=', '+', '№', ';', ':', '{', '}', '[', ']', '\', '|', '/'];
begin
with (Sender as TEdit) do
  begin
    if (Key in Symbols)
       then Key:=#0;
  end;
end;
Заработало)))
Но правда не знаю как внести туда символ '

А из любопытства, можно ли сказать что-то вроде этого
Код:
if (FIO.Text <> '')
только что бы смысл был не "не пустое поле", а "в поле содержатся определенные символы"?) Тогда бы я мог на это условие по нажатию кнопки "Зарегистрироваться" выдавать сообщение что "вы ввели не коректные данные")))))

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну не запретить а проверить и отменить закрытие.
Делается это в событии OnQueryClose. Action выставляется в caNone и форма не закрывается.
Ага, спасибо, сейчас попробую)))

PS Меня даже Skyrim так как delphi не затягивал))) Спасибо за помощь)

Последний раз редактировалось Stilet; 14.09.2013 в 23:21.
8tomat8 вне форума Ответить с цитированием
Старый 14.09.2013, 23:22   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я решил пойти от обратного
Это называется "психанул". Потом поймешь...
Цитата:
"в поле содержатся определенные символы"
"Психани" в сторону регулярных выражений. Не пожалеешь - для открытия новых горизонтов самое оно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2013, 23:27   #9
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это называется "психанул". Потом поймешь...

"Психани" в сторону регулярных выражений. Не пожалеешь - для открытия новых горизонтов самое оно.
я кажется понял о чем ты

А расскажи плиз как будет "не психанул"?) Или лучше дай правильный запрос в гугл, а то сформулировать не могу)

Да, сейчас внесу этот массив в const, по тому что еще прийдется использовать)

С alt+f4 сработало, спасибо) только заработало оно не в onCloseQuery а в onClose)

Последний раз редактировалось 8tomat8; 14.09.2013 в 23:29.
8tomat8 вне форума Ответить с цитированием
Старый 14.09.2013, 23:38   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
расскажи плиз как будет "не психанул"?)
Выше сказал:
Цитата:
Не ограничивай в этом, себе проще будет и юзеру.
Или хочешь весь юникод перебрать?
Еще выше я про регулярки упоминал: http://yandex.ua/yandsearch?text=Del...D0%B5&lr=20554
И если регулярки в делфи по стандарту PСRE то : http://www.pcre.ru/docs/perl/text/fullintro/
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка диапазона на наличие значений в определенных ячейках caustic_ Microsoft Office Excel 6 25.12.2012 23:43
проверка на наличие символов в скобках ExploiT243 Помощь студентам 2 12.05.2012 12:17
Проверка полей js или jquery Rusl92 JavaScript, Ajax 1 17.06.2011 13:59
Проверка папки на наличие таблиц.Delphi. Студло Помощь студентам 0 27.03.2010 04:16
Проверка на отсутствие данных в БД Elena БД в Delphi 5 14.06.2007 16:10