Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Защита от дурака, Проверка правильности вводимых данных 
:(
    Опции темы
myendlessness
Дата 15.7.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Предположим есть TextBox, в который вводится определённый адрес, в данном случае ftp, например: ftp.mail.ru!  В программе человек будет самостоятельно вводить адрес фтп-сервера, как сделать так чтобы была проверка на правильность введения, чтобы не было невнимательных ошибок и опечаток, что-то вроде: ftp2.mail.ru, ftp.mailru, ftpmail.ru, ftp.mail.ru.ru и прочих изобретательностей. Речь идёт о любом фтп-сервере. Как сделать такую защиту минимальными усилиями? Спасибо за помощь!
PM MAIL   Вверх
diadiavova
Дата 15.7.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



В обработчиках событий Validating и Validated.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Heinzz
Дата 15.7.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



разбить текст через Split используя разделитель '.' и проверить два условия:
 * первая строка =="ftp"
 * строк 3 шт

 * опционально - длина последней строки 2 символа


--------------------
user posted image
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


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

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



Более-мение стандартное решение как написал diadiavova наставить CausesValidation TextBox-са на true которая
спустит событие Validating при уходе фокуса. Можно ещё добавить ErrorProvider который покажет пользователю чего плохо smile 
Код

void ftpTextBox_Validating(object sender, CancelEventArgs e)
{
       string error = null;               //необязательно
       Regex re = new Regex(@"^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$");   //если я правильно написал регулярное выражение?
       if(!re.IsMatch((TextBox)sender).text)
       {
              .....// код при неправильном вводе
              error = "чё за фигня...должно быть так: ftp.mail.ru!"          //необязательно
              e.Cancel  = true;
       }
       errorProvider.SetError((Control)sender, error);                //необязательно, нарисует иконку и текст обьяснялки.
}

void ftpTextBox_Validated(object sender, EventArgs e)
{
         ....//код если валидатинг прошел



Да regex возможно в этом случае : ^((ftp)\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$

Это сообщение отредактировал(а) SKrivosein - 16.7.2009, 01:23


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
myendlessness
Дата 16.7.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребята всем СПАСИБО за помощь smile  Ещё есть впрос по поводу Regex как правильно создавать эту строчку (^((ftp)\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$
), что означают символы? Где можно почитать? И ещё один момент, дело в том, что адрес сервера может состоять из разного количества слов, например: ftp.mail.ru, ftp.mail.tut.by и тд. Может стоит в цикле проверять каждое слово? или что-нибудь в этом духе, пока перевариваю и думаю как лучше и корректно сделать?!
PM MAIL   Вверх
diadiavova
Дата 16.7.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Вообще-то проверить корректность адреса, а так же определить отдельные его параметры можно при помощи класса System.Uri
Код

bool IsCorrectFtpAddress(string addr)
{
    if(Uri.IsWellFormedUriString(addr, System.UriKind.Absolute)
    {
        var u = new Uri(addr);
        if(uri.Scheme == "ftp") return true;
    }
    return false;
}


Добавлено через 3 минуты и 29 секунд
А на счёт символов читай здесь
http://msdn.microsoft.com/ru-ru/library/sy...ions.regex.aspx
И далее по ссылкам в конце топика(другие ресурсы)


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SKrivosein
Дата 16.7.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


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

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



Регулярные выражения беру как общий случай, допустим в техт бокс будеш вводить телефоны, е-майлы и т.д.
На книгу лови ссылку:Рег.выражения
Всегда пригодится.
P.S. полное выражение про URL: ^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$ 

Это сообщение отредактировал(а) SKrivosein - 16.7.2009, 13:58


--------------------
Оптимист - это плохо информированный человек.
user posted image

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


Шустрый
*


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

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



diadiavova  спасибо за более оптимизированный подход, вот только дойду до 100 сообщений и сразу займусь Вашей репутацией smile   Запустил тот код, который Вы предложили, но не могу понять, ввожу и правильно и неправильно но IF выдаёт только false в чём может быть ошибка? 

Код

private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            string error = null;
            ErrorProvider f = new ErrorProvider();
            if (!IsCorrectFtpAddress(textBox1.Text))
            {
                error = "Your adress is wrong!";
                e.Cancel = true;
            }
            f.SetError((Control)sender, error);   
      
        }

         public bool IsCorrectFtpAddress(string addr)
            {
              if(Uri.IsWellFormedUriString(addr, System.UriKind.Absolute))
                {
                  var u = new Uri(addr);
                  if(u.Scheme == "ftp") return true;
                }
                 return false;  <----- выдаёт всегда false
             }

PM MAIL   Вверх
diadiavova
Дата 16.7.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Функция работает, надо смотреть другой код.
А в приведённом примере, как мне кажется, 10-строку надо тоже в блок if вставить. Объяснялку то в случае ошибки выводить надо. Или я чего-то не понял?

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  FTPCheck.rar 18,69 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 16.7.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 SKrivosein 

Спасибо за книгу и помощь smile 
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


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

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



А я если пишу ftp://mail.ru или например ftp://mail.test.ru то всё работает, а ftp.mail.ru нет.
Поэтому я свой первый регех написал так: ^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$
а потом исправил на: ^((ftp)\.[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$
и тот первый правильный, а второй... smile  хотя я незнаю все возможные URL

diadiavova if не надо, этот код f.SetError((Control)sender, error); выполнится всегда, но стаботает только если error !=null

Это сообщение отредактировал(а) SKrivosein - 16.7.2009, 15:20


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
myendlessness
Дата 16.7.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



diadiavova Вы правильно заметили, что в строчке 10 нужен ещё if, просто у меня это пока пробная версия, тренериюсь и стараюсь понять как всё работает

понял почему у меня не срабатывало 
я пишу: ftp.mail.ru
Вы пишите: ftp://mail.ru

разница была в том, что нужно полностью (со слешем и двоеточием) писать адрес 

ВСЕМ СПАСИБО! You are  smile 

Хотел спросить, как сделать так, чтобы если открылось окно, то нельзя было переходить на другие окна?

Добавлено через 9 минут и 24 секунды
2 SKrivosein 

Вы меня чуть-чуть опередилиsmile 
Значит всё-таки в строчке 10 не надо if! 
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


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

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



Form.ShowDialog(); ?
в 10 стрике ничего ненадо, смотреть выше.


--------------------
Оптимист - это плохо информированный человек.
user posted image

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


Шустрый
*


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

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



Тут возникает один вопрос, какой из двух способов Regex или IsCorrectFtpAddress будет обеспечивать лучшую защиту?
PM MAIL   Вверх
SKrivosein
Дата 16.7.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


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

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



Всмысле лучшую? Если напишеш правильно рег.выражение то номоему всёравно. Регулярные выражения более универсальны, допустим тебе банк скажет что необходимо проверить вот такого вида ввод: 1234-7746043/asd-0300, здесь нечего стандартного найти нельзя надо самому писать выражение. А IsCorrectFtpAddress это встроеный в .NET метод он 99,99% правильный и голову ламать не надо, но надо знать что он есть  smile 


--------------------
Оптимист - это плохо информированный человек.
user posted image

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


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(SKrivosein @  16.7.2009,  16:13 Найти цитируемый пост)
 хотя я незнаю все возможные URL

Вот! Можно, конечно спецификацию изучить smile , только ИМХО - проще уж 
Цитата(SKrivosein @  16.7.2009,  17:08 Найти цитируемый пост)
знать что он есть  

 smile 
Я уже не говорю о том, что чем сложнее регексп, тем труднее контролировать его поведение, а уж о степени читабельности так и говорить нет смысла. В любом случае, если есть возможность воспользоваться готовым прибамбасом, то надо им воспользоваться. По крайней мере будет гарантия, что там всё учтено, включая неизвестные тебе особенности спецификации URL . 
А когда речь о нестандартном формате, то конечно.

Что касается адреса без указания протокола, то тут всё просто, перед проверкой надо с чего начинается строка адреса

Код

        static public bool IsCorrectFtpAddress(string addr)
        {
            var a = addr.StartsWith("ftp://") ? addr : "ftp://"+addr;
            if (Uri.IsWellFormedUriString(a, System.UriKind.Absolute))
            {
                var u = new Uri(a);
                if (u.Scheme == "ftp") return true;
            }
            return false; 
        }


Но лучше такую проверку осуществлять перед передачей значения в функцию (добавлять протокол в текстбокс при валидации).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 16.7.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот простой пример если я пишу  ftp://mail или ftp://mail.5ru то есть заведомо неправильно, то  IsCorrectFtpAddress пропускает, а регулярные выражения выдают ошибку, то есть это подтверждает, что они более гибкие и если правильно их составить, то и более надёжные, хотя это и логично smile

Добавлено через 3 минуты и 54 секунды
2 diadiavova  Дело в том, что  ftp:// сразу находится в TextBox при загрузке, то есть "TextBox.text=ftp://" это такая своеобразная подсказка, чтобы изначально не сделали ошибок хотя бы в этом
PM MAIL   Вверх
diadiavova
Дата 16.7.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  16.7.2009,  17:25 Найти цитируемый пост)
правильно их составить, то и более надёжные

Ну дык ить...кто бы спорил...так это ж если правильно.

Добавлено через 4 минуты и 4 секунды
Цитата(myendlessness @  16.7.2009,  17:25 Найти цитируемый пост)
вот простой пример если я пишу  ftp://mail или ftp://mail.5ru то есть заведомо неправильно

Ну вот ты знаешь, что это заведомо неправильно, а вот для меня это новость. Я не знаю, какие адреса правильные, а какие нет. С другой стороны, что толку если человек введёт корректный, но никуда не ведущий адрес? smile

Добавлено через 5 минут и 15 секунд
Цитата(myendlessness @  16.7.2009,  17:25 Найти цитируемый пост)
чтобы изначально не сделали ошибок хотя бы в этом 

Ну ясно, тема ведь называется "Защита от..." smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 17.7.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 diadiavova 

Ну вот ты знаешь, что это заведомо неправильно, а вот для меня это новость. Я не знаю, какие адреса правильные, а какие нет. С другой стороны, что толку если человек введёт корректный, но никуда не ведущий адрес? 

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

Я хотел спросить как сделать так, чтобы если одна форма запущена, то нельзя было переключится на другую пока не закроешь запущенную?
PM MAIL   Вверх
diadiavova
Дата 17.7.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  17.7.2009,  11:24 Найти цитируемый пост)
Я хотел спросить как сделать так, чтобы если одна форма запущена, то нельзя было переключится на другую пока не закроешь запущенную? 

"Запущенную" надо запускать при помощи метода ShowDialog (а не Show)


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 17.7.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здорово, спасибо Вам за ответы  smile 

    В развитии темы хотел продолжить, вот скажите человек заносит адрес сервера,  дальше надо его запомнить, чтобы при следующей загрузке не надо было заносить ещё раз тоже самое. Как запомнить адрес? 

    Самый простой записать в файл! А когда много всяких параметров, и сохраняются в разное время, то как быть? Либо создавать для каждого параметра свой файл, либо хранить в одном, но как-то его структурировать! А есть ли другие сопсобы сохранения данных? 
PM MAIL   Вверх
Raistlin
Дата 17.7.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(myendlessness @  17.7.2009,  10:57 Найти цитируемый пост)
  Самый простой записать в файл! А когда много всяких параметров, и сохраняются в разное время, то как быть? Либо создавать для каждого параметра свой файл, либо хранить в одном, но как-то его структурировать! А есть ли другие сопсобы сохранения данных? 



Идешь в свойства проекта (Alt-F7), там переходишь на вкладку Settings. Потом читаешь MSDN насчет Properties.Settings. 
PM MAIL   Вверх
diadiavova
Дата 17.7.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  17.7.2009,  11:57 Найти цитируемый пост)
А есть ли другие сопсобы сохранения данных?  

Конечно. Первое, что приходит в голову - база данных. Но если данных не очень много, то можно и более простые средства использовать: 
XML - файл, настройки программы(Application Settings), последний вариант особенно удобно использовать если надо сохранять состояние элементов управления(например текст в текстбоксе), в этом случае можно всё организовать без единой строчки ручного кода, но даже для хранения других данных ручной код при использовании этого инструмента сильно упростится.

http://msdn.microsoft.com/ru-ru/library/k4s6c3a0.aspx

Это сообщение отредактировал(а) diadiavova - 17.7.2009, 11:19


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 17.7.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за рекомендации, буду разбираться!

Хотел уточнить как потом сбрасывать ErrorProvider, если вначале человек ошибся, а затем набрал правильно, то как удалить этот красный кружочек? Думал ErrorProvider.Clear но что-то ничего не убирается. Почитал о членах класса, тоже ничего другого не нашёл. 
PM MAIL   Вверх
diadiavova
Дата 17.7.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  17.7.2009,  13:11 Найти цитируемый пост)
Хотел уточнить как потом сбрасывать ErrorProvider

Так же как и устанавливать, только пустую строку передать ему надо в качестве текста сообщения.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
SKrivosein
Дата 17.7.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


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

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



Если у тебя все правильно написано то вобще по идее делать не чего не надо.
Когда пользователь исправит свой текст и идет дальше, то фокус уходит с текстбокса и срабатывает событие validating которое и уберёт значёк.
Разве что ты то в коде что-то поменял, то тогда руками убрать.

Код

void ftpTextBox_Validating(object sender, CancelEventArgs e)
{
       string error = null;       //опять вычистит эррор
       .......

       errorProvider.SetError((Control)sender, error);                //уберёт всё
}



P.S. diadiavova я кстати незнал что IsCorrectFtpAddress делает, или так где-то читал но забыл...так же спасибо за напоминание.
А по поводу что лучше, так это дело относительное. Я держусь точки зрения буддизма: "все цветы совершенны !"

Это сообщение отредактировал(а) SKrivosein - 17.7.2009, 14:04


--------------------
Оптимист - это плохо информированный человек.
user posted image

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


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(SKrivosein @  17.7.2009,  15:02 Найти цитируемый пост)
я кстати незнал что IsCorrectFtpAddress делает

Хочу обратить твоё внимание, что IsCorrectFtpAddress - это имя метода, придуманное мною лично для этой темы, но в нём использован метод  IsWellFormedUriString, класса URI.

Цитата(SKrivosein @  17.7.2009,  15:02 Найти цитируемый пост)
А по поводу что лучше, так это дело относительное.

Ну я вроде как аргументировал. Удобство в нашем деле тоже не последний аргумент. Даже если проверять нестандартную строку, то регексп ИМХО всё равно лучше обернуть для удобства.  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 20.7.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

  private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            string error = null;
            ErrorProvider f = new ErrorProvider();
            Regex re = new Regex(@"^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$");
            if (!re.IsMatch(textBox1.Text))
            {

                error = "Your adress is wrong!";
                e.Cancel = true;
                f.SetError((Control)sender, error);
            }

            else f.SetError((Control)sender, null);      
        }


Вот мой код, однако всё равно не убирает красный кружочек, даже когда правильно всё прописываю в TextBox? 
PM MAIL   Вверх
myendlessness
Дата 20.7.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 И ещё вопрос smile  Почитал я про параметры приложения, сделал параметр в TextBox, как теперь его загрузить? Надо что-то прописать при загрузке формы или элемента. но как именно прописать? И далее, если пользователь изменит имя сервера, то оно перезапишется в параметре приложения? Если - нет, то как сделать так чтобы перезаписалось?
PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  20.7.2009,  11:22 Найти цитируемый пост)
сделал параметр в TextBox

Что это значит? Если ты связал свойство Text текстбокса с параметром, то значение этого свойства будет сохраняться даже после закрытия приложения. Для того, чтобы его сменить, надо просто в текстбоксе написать другую строку.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 20.7.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



http://msdn.microsoft.com/ru-ru/library/wabtadw6.aspx   вот сделал так как написано в инструкции при помощи конструктора, получилось что есть параматр приложения  ftp://mail.ru, имя ему UserTextBox, он пользовательский. Затем я запускаю программу и пишу вместо mail.ru, например mail.tut.by, закрываю программу, однако, при следующей загрузке он всё равно пишет  mail.ru. почему он не сохранил изменения?

Добавлено через 1 минуту и 33 секунды
Спасибо ребята, что помогаете. Узнаю много полезного и нового от Вас и быстро учусь программировать на C#! smile

Добавлено через 10 минут и 26 секунд
Всё с этим разобрался, здорово офигенно smile  надо было в validating  вставить строчку -  Properties.Settings.Default.Save();
и теперь всё работает!

осталось понять как избавиться от красного кружка в ErrorProvider? Текст исчезает, а красный кружок остаётся! 
PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  20.7.2009,  12:43 Найти цитируемый пост)
надо было в validating  вставить строчку -  Properties.Settings.Default.Save();

Ну да, так и есть, просто мне в шарпе не приходилось с этим работать, а в васике всё происходит автоматически smile 
Цитата

Для управления отдельными параметрами приложения используйте свойства объекта My.Settings в Visual Basic или объекта Settings в других языках. В языках, отличных от Visual Basic, необходимо явным образом вызвать метод Save этого класса-оболочки, чтобы сохранять пользовательские настройки. Обычно это выполняется в обработчике событий Closing главной формы. В Visual Basic конструктор автоматически создаст код для сохранения текущих значений всех параметров пользователя при завершении работы приложения.

Цитата(myendlessness @  20.7.2009,  12:43 Найти цитируемый пост)
осталось понять как избавиться от красного кружка в ErrorProvider? Текст исчезает, а красный кружок остаётся!  

Куда исчезает? Я так понимаю, если текст исчез, значит он не прошёл проверку и предупреждение не должно исчезнуть. По идее код рабочий.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 20.7.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так вот и я не понимаю, else срабатывает error=null из-за этого текст исчезает, а кружочек остаётся красный и с пустой строкой.
PM MAIL   Вверх
diadiavova
Дата 20.7.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



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

Regex re = new Regex(@"^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$", RegexOptions.Multiline);

Создай его с указанной опцией.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 21.7.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сделал вот так и всё равно красный кружочек не исчезает, хотя else срабатывает! 

Код

 private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            string error = null;
            ErrorProvider f = new ErrorProvider();
            Regex re = new Regex(@"^((ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3})$", RegexOptions.Multiline); //regular expression
            if (!re.IsMatch(textBox1.Text))
            {
                error = "Your adress is wrong!";
                e.Cancel = true;
                f.SetError((Control)sender, error);
            }
            else f.SetError((Control)sender, " ");
            Properties.Settings.Default.Save();
       }

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


Шустрый
*


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

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



Хотел ещё спросить по поводу оптимизации, как вот такой код сделать коротким? Повторяющиеся CheckBox связанные с TextBox
Код

if (checkBox1.Checked == true)
            {
                textBox1.Enabled = true;
            }
            else textBox1.Enabled = false;
            
if (checkBox2.Checked == true)
            {
                textBox2.Enabled = true;
            }
            else textBox2.Enabled = false;
         
 if (checkBox3.Checked == true)
            {
                textBox3.Enabled = true;
            }
            else textBox3.Enabled = false;

PM MAIL   Вверх
diadiavova
Дата 21.7.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  21.7.2009,  11:27 Найти цитируемый пост)
Сделал вот так и всё равно красный кружочек не исчезает, хотя else срабатывает! 

Ты передаёшь провайдеру пробел, а надо - пустую строку. Просто пару кавычек рядом поставь и никаких пробелов между ними. Тот же эффект будет при null и при string.Empty
 
Цитата(myendlessness @  21.7.2009,  11:52 Найти цитируемый пост)
как вот такой код сделать коротким?

Вместо

Цитата(myendlessness @  21.7.2009,  11:52 Найти цитируемый пост)
if (checkBox1.Checked == true)
            {
                textBox1.Enabled = true;
            }
            else textBox1.Enabled = false;

надо написать

Код

                textBox1.Enabled = checkBox1.Checked?true:false;

С остальными - так же. Можно ещё связать свойства и тогда писать вообще ничего не придётся. В окне свойств разберись с пунктом DataBinding (в мсдн всё есть)


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 21.7.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за помощь, всё заработало. 

2 diadiavova 

 Подскажите пожалуйста, а если я использую   Scheme == "file" , то как правильно прописывается путь файла на локальной машине, как правильно написать escape-последовательность, что-то я  и так и сяк, но он не принимает?

и если кому не трудно, то напишите, пожалуйста,как будет выглядеть регулярное выражение, для файла на компьютере? 
PM MAIL   Вверх
diadiavova
Дата 21.7.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Не совсем понял о чём речь, видимо вопрос в том, как записать имя файла, чтобы обратные слэши воспринимались как есть. Либо писать 2 слэша вместо одного, либо перед строкой ставить собачку.
Код

Scheme = @"C:\\rgjrkjtgr\hjyhtyh.txt";
Scheme = "C:\\\\rgjrkjtgr\\hjyhtyh.txt";
Scheme = "C://rgjrkjtgr/hjyhtyh.txt";

Хотя в коде писать имя файла не стоит, разве что относительное.

А если речь о проверке пути, то по строке не надо проверять. Для этого есть классы пространства System.IO. Например System.IO.FileInfo вполне подойдёт.

Это сообщение отредактировал(а) diadiavova - 21.7.2009, 15:35


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 21.7.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



diadiavova  Вы просто святой человек smile  столько уже узнал полезного и нового, просто супер! Я говорил о том, что задача та же самая как и была раньше, только теперь мне надо проверять не FTP-адрес на правильность, а правильность написания локального адреса, то есть путь файла на данном компьютере, я так понял это можно сделать с FileInfo? сейчас почитаю! Спасибо за полезные советы! 
PM MAIL   Вверх
diadiavova
Дата 21.7.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  21.7.2009,  17:12 Найти цитируемый пост)
diadiavova  Вы просто святой человек

Это да smile  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 22.7.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ЧТо касается проверки локального адреса, существует ли такой каталог, то я написал такой код

Код

// the check of existing of a directory  -  проверяет существует ли такой каталог
            if (Directory.Exists(textBox3.Text))
            {
                errorProvider3.SetError((Control)sender, errorTextBox3);
            }
            else
            {
                errorTextBox3 = "Your adress doesn't exist!";
                e.Cancel = true;
                errorProvider3.SetError((Control)sender, errorTextBox3);
            }

            // the check of adress symbols  - проверяет нет ли символов, которые запрещены в использовании пути
            foreach (char invalidPChar in invalidPathChars)
            {
                for (int i = 0; i < textBox3.Text.Length; i++)
                {
                    if (invalidPChar == textBox3.Text[i])
                    {
                        errorTextBox3 = "Your adress has an incorrect symbol!";
                        e.Cancel = true;
                        errorProvider3.SetError((Control)sender, errorTextBox3);
                    }
                    else errorProvider3.SetError((Control)sender, errorTextBox3);
                }
            } 



С одной стороны первой проверки вроде достаточно, так как если символ будет некорректный, то она выдаст что такого каталога нет, однако, возможно есть такие варианты, которые может пропустить первая проверка, хотя может это излишняя перестраховка?

Вот возникает вопрос а если человек напишет - С:///\\\Admin/..\Books точно схавает этот адрес, а как после того как адрес пройдёт, привести его в человеческий вид, чтобы можно было дальше работать?
PM MAIL   Вверх
diadiavova
Дата 22.7.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Directory.Exists не просто строку  проверяет, этот метод разбирает её и выясняет, существует ли такой каталог. Со строкой лучше не заморачиваться когда есть готовый метод(почему - писал выше).

Цитата(myendlessness @  22.7.2009,  15:16 Найти цитируемый пост)
Вот возникает вопрос а если человек напишет - С:///\\\Admin/..\Books точно схавает этот адрес

С чего бы это?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 23.7.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



diadiavova  По ходу пьесы возникло ещё несколько вопросов, насчёт той стандартной проверки которую предложили Вы, а именно:  
Код

bool IsCorrectFtpAddress(string addr)
{
    if(Uri.IsWellFormedUriString(addr, System.UriKind.Absolute)
    {
        var u = new Uri(addr);
        if(uri.Scheme == "file") return true;
    }
    return false;
}


То я ввожу разные варианты адреса, и в том числе что описаны выше, а он не хочет их принимать пишет неправильный адрес, не могу понять, как правильно записывать file-строку в этом методе?

Так всё-таки стоит использовать только Directory.Exists? или лучше Uri.IsWellFormedUriString?

И ещё вопросик, вот я подключаю свои библиотеки и естественно прописываю адрес, а как сделать так чтобы при переносе на другой компьютер, не надо было прописывать повторно новый адрес, то есть записать так чтобы программа сама их всегда находила в нужной папке? 

PM MAIL   Вверх
diadiavova
Дата 23.7.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(myendlessness @  23.7.2009,  12:24 Найти цитируемый пост)

       var u = new Uri(addr);
        if(uri.Scheme == "file") return true;

Не так, а так
Код

       var u = new Uri(addr);
        if(u.Scheme == "file") return true;


Добавлено через 4 минуты и 6 секунд
Цитата(myendlessness @  23.7.2009,  12:24 Найти цитируемый пост)
Так всё-таки стоит использовать только Directory.Exists? или лучше Uri.IsWellFormedUriString?

Смотря где, если надо проверить существование каталога, то экзист, а если корректность адресной строки...

Цитата(myendlessness @  23.7.2009,  12:24 Найти цитируемый пост)
И ещё вопросик, вот я подключаю свои библиотеки и естественно прописываю адрес, а как сделать так чтобы при переносе на другой компьютер, не надо было прописывать повторно новый адрес, то есть записать так чтобы программа сама их всегда находила в нужной папке? 

Если они в папке с программой, то можно находить по относительному адресу, а в других случаях, если библиотека зарегистрирована, то можно по гуиду например, но вопрос надо уточнить, что за библиотеки.

Добавлено через 13 минут и 9 секунд
Проверил работу функции для файловой системы. Действительно выдаёт фальс. Проблема решается передачей строки в таком формате

вместо c://doc/aaa.txt надо писать file:///c://doc/aaa.txt

Хотя из обычной строки объект Uri создаётся, поэтому можно его просто создать и всё, а можно сначала(как я уже предлагал) проверить с чего начинается адрес, и в случае если это не file:/// просто добавить эту строку в начало. Тут есть варианты. smile 

PS
И имя функции неплохо бы поменять на более подходящее для задачи


Это сообщение отредактировал(а) diadiavova - 23.7.2009, 11:32


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
myendlessness
Дата 4.8.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребята вновь возник вопрос по ходу работы! 

Есть такой код, в общем получаю рисунок:
 
Код

OpenFileDialog ofd = new OpenFileDialog();
Bitmap picture = new Bitmap(ofd.FileName);
pictureBox1.Image = (Image)picture;


Затем мне дальше нужно использовать этот рисунок, пишу такой код:

FileStream Tiff = new FileStream(ofd.FileName, FileMode.Open);

на что мне выдаёт ошибку: 
Процесс не может получить доступ к файлу , так как этот файл используется другим процессом.

Как мне использовать рисунок в нескольких процессах?
PM MAIL   Вверх
diadiavova
Дата 4.8.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Код

            var ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                using (Image origImg = Image.FromFile(ofd.FileName))
                {
                    pictureBox1.Image = new Bitmap(origImg);
                }
                FileStream Tiff = new FileStream(ofd.FileName, FileMode.Open);
            }


Для нового вопроса надо создавать новую тему.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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