C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: специальные символы - немножко запутался  (Прочитано 3157 раз)
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


специальные символы - немножко запутался
« : 06 Декабрь 2013, 01:05:31 »

есть код:

 
Код
 
    String name_server_value =InputBox(L"Настройки для підключення", L"Введіть ім'я сервера",   "Natali\\SQLEXPRESS");
 // String   name_server_value2;
 //  name_server_value2 = StringReplace(name_server_value,"\\","!!!!!!!!" TReplaceFlags()
 // ...
 

как сделать, чтоб строка Natali\\SQLEXPRESS была с одним слешем. Тоесть в переменную name_server_value попадет двойной слеш, хотя в окне ввода показывает только один.

Хотел было заменить два символа одним, но не знаю как это задать, ведь програмно в с++ слеш  пишется как \\.
Но что странно - StringReplace(name_server_value,"\\","!!!!!!!!" TReplaceFlags() StringReplace(name_server_value,"\\", "\" TReplaceFlags()
Тоесть как мне быть???
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: специальные символы - немножко запутался
« Ответ #1 : 06 Декабрь 2013, 01:24:51 »

Цитировать
Тоесть в переменную name_server_value попадет двойной слеш
В переменную попадет слэш одинарный, вот отображаться в окне Watches он будет как двойной (что абсолютно правильно, потому что эти самые окна экранируют служебные символы). Чтобы в переменную попал двойной - надо записать: "Natali\\\\SQLEXPRESS"
Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: специальные символы - немножко запутался
« Ответ #2 : 06 Декабрь 2013, 01:41:37 »

Цитата: volvo877 от 06 Декабрь 2013, 01:24:51
Цитировать
Тоесть в переменную name_server_value попадет двойной слеш
В переменную попадет слэш одинарный, вот отображаться в окне Watches он будет как двойной (что абсолютно правильно, потому что эти самые окна экранируют служебные символы). Чтобы в переменную попал двойной - надо записать: "Natali\\\\SQLEXPRESS"

Немножко не так,  "Natali\\SQLEXPRESS" - это значение по умолчанию, и пользователь может написать любой другой путь через один слеш естественно.
Я понимаю, что в переменной он может хранится как двойной.
Но тогда, соответственно можно бы написать
StringReplace(name_server_value,"\\\\","\\" TReplaceFlags()
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: специальные символы - немножко запутался
« Ответ #3 : 06 Декабрь 2013, 03:42:42 »

Что именно "не хочет"? Ну, вот код:
Код
    String name_server_value = InputBox(L"Настройки для підключення",
       L"Введіть ім'я сервера", "Natali\\SQLEXPRESS");
   name_server_value = StringReplace(name_server_value, "\\\\", "\\",
       TReplaceFlags() rfReplaceAll);

, ввел я через двойной слэш \\Volvo-PC\Buffer, после StringReplace получил через ShowMessage \Volvo-PC\Buffer, что не так? И почему тебе обязательно надо вмешаться в процесс ввода пользователем информации? Пользователь ввел двойной слэш - значит, должен быть двойной.

Вот я, скажем, после подобного преобразования пути, уже не смогу обратиться по введенному мной адресу, там обязан быть именно дабл-слэш... А это значит что? Правильно, что программа, предоставляющая мне подобный "функционал", летит в мусорку.
Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: специальные символы - немножко запутался
« Ответ #4 : 08 Декабрь 2013, 21:27:00 »

Каюсь, проблема было в другом, но попутало действительно,  что  отображался в окне Watches  как двойной слеш.
Извеняет меня то, что занимаюсь програмированием для своего удовольствия а не на професиональной основе. 

Но тут возник еще один вопрос, немножко не по этой ветке, но все же -
пытался как-то отловить ошибку подключения, нашел в справке такой способ:

   
Код
   try
{
DataModule1->ADOConnection1->Connected = true;
}
 catch (EADOError& e)
{
MessageDlg("Помилка підключення!!!Такого SQL-сервера не існує або введено неправильне ім'я.",
mtError,   TMsgDlgButtons() mbOK, 0);
return;
 
}

если строка подключения правильная (подключаюсь к MS SQLServer 2008 через ADO в RAD XE3)
то все нормально, а если нет, то  выдает свою системную ошибку, что-то типа сервера не существует и т.д.,
 а вот блок catch (EADOError& e) { } успешно пропускает...  а хотелось бы как-то обрабатывать ошибку,
хотя б дать возможность повторно ввести правельные параметры.

Или я опять все неправильно делаю? 

Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: специальные символы - немножко запутался
« Ответ #5 : 09 Декабрь 2013, 09:32:45 »

Во-первых, лучше все-таки обезопасить себя тем, что добавить еще мимимум 1 блок catch для отлавливания всех исключений типа Exception (или потомков):
Код
try
{
DataModule1->ADOConnection1->Connected = true;
}
 catch (EADOError& e) // специфически EADOError
{
Application->ShowException(&e); return;  
 
}
catch(Exception& e) { // все Exception
      Application->ShowException(&e); return;
}
catch(...) {                // неотловленные
      MessageDlg("Помилка підключення!!!Такого SQL-сервера не існує або введено неправильне ім'я.",
mtError,   TMsgDlgButtons() mbOK, 0);
return;
}
 

Во-вторых, попробуй запускать приложение не из среды, а из оболочки, т.е. прямо двойным щелчком по скомпилированному EXE.
Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: специальные символы - немножко запутался
« Ответ #6 : 09 Декабрь 2013, 10:09:36 »

S0mbre, спасибо, так получилось.
Я так понял, ошибку выдает на сам механизм АДО.

Вот скрин:
 

Как все-таки правильно записать, чтобы отлавливалось именно этот вид ошибки?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: специальные символы - немножко запутался
« Ответ #7 : 09 Декабрь 2013, 15:10:13 »

Цитата: direk от 09 Декабрь 2013, 10:09:36
Как все-таки правильно записать, чтобы отлавливалось именно этот вид ошибки?

Ну, у тебя вылетел (судя по скрину) EOleException - его и лови:
Код
// ... предыдущие блоки catch (EADOException ...)
catch(EOleException& err) {
  Application->ShowException(&err); // или какая-то другая операция...
  return; // если надо
}
// ... другие блоки catch (Exception и ...)
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.141 секунд. Запросов: 21.