Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

символы формата строки

9.2K
16 апреля 2005 года
z-dan-z
17 / / 13.04.2005
нет ли стандартной функции которая переводила строку AnsiString "c:\path1\path2\file1.000" в строку "c:\\path1\\path2\\file1.000"

Заранее спасибо
301
16 апреля 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by z-dan-z
нет ли стандартной функции которая переводила строку AnsiString "c:\path1\path2\file1.000" в строку "c:\\path1\\path2\\file1.000"

Заранее спасибо


А в чем дело? '\\' есть один сивол (так же как '\p' или '\f').
Хотя может я тебя понял не правильно...

243
17 апреля 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by z-dan-z
нет ли стандартной функции которая переводила строку AnsiString "c:\path1\path2\file1.000" в строку "c:\\path1\\path2\\file1.000"


Если имеется ввиду то, что при чтении строки из Edit'а нужно произвести подобное преобразование для дальнейшей работы с этой строкой, то могу успокоить - ничего пробразовывать не нужно. Все происходит автоматически. Используй значеине Edit->Text.

10
17 апреля 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by pacific_7
Если имеется ввиду то, что при чтении строки из Edit'а нужно произвести подобное преобразование для дальнейшей работы с этой строкой, то могу успокоить - ничего пробразовывать не нужно. Все происходит автоматически. Используй значеине Edit->Text.


Не путай человека. Если пишется обычная программа - да, никакого преобразования делать не надо. Только не потому, что оно делается автоматически, а по причине, что оно вообще не нужно. Человек еще не разобрался и путает обозначение символов в Си с самими символами в буфере строки, когда она в памяти.

Если же пишется программа вроде собственного экспорта в Reg-файлы, там для совместимости с форматом REG придется кодировать самому. Только не думаю, что человек, еще не разобравшийся с представлением строк в памяти, будет озадачиваться разработкой собственного экспорта в REG-файл. :D

243
17 апреля 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Freeman
Только не потому, что оно делается автоматически, а по причине, что оно вообще не нужно.


Это вобщем-то и имелось в виду - выразился коряво конечно.

9.2K
17 апреля 2005 года
z-dan-z
17 / / 13.04.2005
2Freeman&pacific_7 Господа не ссорьтесь ;) и не брызгайте слюной ....
"символы формата строки " в заголовке написал, т.к полагаю что за "\" ожидается символ форматирования
Ex '\n' , '\t' etc, a '\\'="\"




имелось в виду следущее
я принимаю сторку пути из базы настроек
в AnsiString s, в s действительно хранится путь
"c:\path1\path2\file.000", и с ним вроде все путем, но передавая этот параметр в TTable имею
путь "с:", если "c:\\path1\\path2\\file.000", то все
Ok, вот собственно суть вопроса замену одного "\" на два руками я сам конечно реализовал, но все же интересно
243
17 апреля 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by z-dan-z
2Freeman&pacific_7 Господа не ссорьтесь ;) и не брызгайте слюной ....


Да мы в общем-то спокойны. Нормальное обсуждение вопроса в котором уточняются подробности и исправляются неточности.

Цитата:
Originally posted by z-dan-z

но передавая этот параметр в TTable имею
путь "с:"


Что-то странное по-моему. Вроде как обрываться строка не должна, даже если слеш воспринимается как управляющий символ. В случае одиночного слеша - он просто игнорируется, т.е. строчка c:path1path2 у вас должна быть полюбому, а вот символ '\f', если следовать спецификации С - это перевод бумаги, воспринимается как переход на новую строку без возврата каретки. Все равно непонятно.

10
17 апреля 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by z-dan-z
но передавая этот параметр в TTable имею
путь "с:", если "c:\\path1\\path2\\file.000"


Гм, а где параметры в TTable?

9.2K
18 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by Freeman
Гм, а где параметры в TTable?




Сорри не "параметр", а "свойство"

AnsiString s="c:\path1\path2\file.000";
TTable->TableName=s;

watch говорит в s содержится {c:\\path1\\path2\\file.000}
но так не проходит

AnsiString s="c:\\path1\\path2\\file.000";
TTable->TableName=s;

watch говорит в s содержится {c:\\\\path1\\\\path2\\\\file.000}
вот так проходит

9.2K
18 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Вроде как обрываться строка не должна, даже если слеш воспринимается как управляющий символ. В случае одиночного слеша - он просто игнорируется, т.е. строчка c:path1path2 у вас должна быть полюбому, а вот символ '\f', если следовать спецификации С - это перевод бумаги, воспринимается как переход на новую строку без возврата каретки. Все равно непонятно.



Вы абсолютно правы pacific_7 path1 реально начинался на 'n' вопрос не в этом а в том что в памяти то "\" уже равен '\\\'

10
18 апреля 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by z-dan-z
AnsiString s="c:\path1\path2\file.000";
TTable->TableName=s;

watch говорит в s содержится {c:\\path1\\path2\\file.000}
но так не проходит

AnsiString s="c:\\path1\\path2\\file.000";
TTable->TableName=s;

watch говорит в s содержится {c:\\\\path1\\\\path2\\\\file.000}
вот так проходит


Блин, так че? Первый пример ошибочный, а второй верный - тут и ежу ясно. А вот Watch показывает нечто невразумительное. Похоже на баг в процессоре.

9.2K
18 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by Freeman
Блин, так че? Первый пример ошибочный, а второй верный - тут и ежу ясно. А вот Watch показывает нечто невразумительное. Похоже на баг в процессоре.



Блин не правильно я выразился действительно
AnsiString s="c:\path1\path2\file.000";
такой строки действительно нет. т.е. строка есть но я ее не присваиаю s она лежит в табличке
в поле put1 "c:\path1\path2"

сам код:

oPUT1=TOpts->FieldByName("PUT1")->AsString;
oPUT1=StrSlash(oPUT1);
Table1->TableName=oPUT1+"\\prv02";

watch oPUT1{c:\\path1\\path2} до StrSlash(oPUT1)
watch oPUT1{c:\\\\path1\\\\path2}после

StrSlash(oPUT1)
удваивает слэши

259
18 апреля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by z-dan-z

удваивает слэши


Это естественно. Для того, чтобы отличить \ - слеш от начала символа форматирования \ в компиляторе С прянято соглашение об удваивании слеша т.е.\\-это один символ \. То же самое для символа " в нутри строки символов.

10
18 апреля 2005 года
Freeman
3.2K / / 06.03.2004
Блин, ну и че дальше-то?
Цитата:
Originally posted by z-dan-z
watch oPUT1{c:\\path1\\path2} до StrSlash(oPUT1)


При присваивании в Table1->TableName должно работать.

Цитата:
watch oPUT1{c:\\\\path1\\\\path2}после


А здесь должно выдать исключение.

Кстати, факт, что такой функции не существует ни в C RTL, ни в VCL говорит только о том, что проблемы нет. Поэтому твоя функция решает несуществующую проблему.

Разберись еще раз с исходниками. Я уверен, что где-то есть ошибка. Можешь запостить сюда - вместе посмотрим. Только оформи его тегами <code>, чтоб читать можно было.

9.2K
18 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by AlexandrVSmirno
Это естественно. Для того, чтобы отличить \ - слеш от начала символа форматирования \ в компиляторе С прянято соглашение об удваивании слеша т.е.\\-это один символ \. То же самое для символа " в нутри строки символов.




Абсолютно с Вами согласен, но я ж их уже "учетверяю" получается

2Freeman

Код:
int TForm1::oGetOpts(const AnsiString)
{
        TOpts->Active=true;
        oMSKL=TOpts->FieldByName("MSKL")->AsInteger;
        oMCEX=TOpts->FieldByName("MCEX")->AsInteger;
        TDate d=StrToDate(TOpts->FieldByName("PERIOD")->AsString);
        oGOD=StrToInt(d.FormatString("yyyy"));
        oMES=StrToInt(d.FormatString("m"));
        oBAUTO=TOpts->FieldByName("BAUTO")->AsInteger;
        oBLVIBR=TOpts->FieldByName("BLVIBR")->AsInteger;
        oBLVENT=TOpts->FieldByName("BLVENT")->AsInteger;
        oBUTOR=TOpts->FieldByName("BUTOR")->AsInteger;
        oBPROD=TOpts->FieldByName("BPROD")->AsInteger;
        oPUT1=TOpts->FieldByName("PUT1")->AsString;
        oPUT1=StrSlash(oPUT1);
        oPUT2=TOpts->FieldByName("PUT2")->AsString;
        oPUT2=StrSlash(oPUT2);
        oPUT3=TOpts->FieldByName("PUT3")->AsString;
        oPUT3=StrSlash(oPUT3);

        Form1->TOpts->Active=false;
        return 0;
}


AnsiString  TForm1::StrSlash(AnsiString s)
{
AnsiString s1="";
short i=0;

      for(;s.Length()>0;)
      {
       i=s.AnsiPos('\\');
       if(i>0)
        {
         s.Insert('\\',i);
         s1+=s.SubString(0,i+1);
         s=s.SubString(i+2,s.Length());
        }
       else
        {
         s1+=s;
         s="";
        }
       }
       return s1;

}

...
oGetOpts("a");
progress=true;
 StatusBar1->Panels->Items[0]->Text="??????\t ??????????? ???????? ?? " +oPUT1+ "\\\\prv02.dbf";
 Form1->Repaint();
 Table1->TableName=oPUT1+"\\prv02";
 Table1->Filter="god=" + AnsiString(oGOD)+ " and mes=" + AnsiString(oMES)+ " and deb>=20000 and deb<30000";
 Table1->Filtered=true;
 Table2->TableName="prv02_t";
 Table2->EmptyTable();
 BatchMove1->Source = Table1;
 BatchMove1->Destination = Table2;
 BatchMove1->Mode = batAppend;
 BatchMove1->Execute();

....
259
18 апреля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by z-dan-z
Абсолютно с Вами согласен, но я ж их уже "учетверяю" получается

2Freeman
Код:
int TForm1::oGetOpts(const AnsiString)
{
        TOpts->Active=true;
        oMSKL=TOpts->FieldByName("MSKL")->AsInteger;
        oMCEX=TOpts->FieldByName("MCEX")->AsInteger;
        TDate d=StrToDate(TOpts->FieldByName("PERIOD")->AsString);
        oGOD=StrToInt(d.FormatString("yyyy"));
        oMES=StrToInt(d.FormatString("m"));
        oBAUTO=TOpts->FieldByName("BAUTO")->AsInteger;
        oBLVIBR=TOpts->FieldByName("BLVIBR")->AsInteger;
        oBLVENT=TOpts->FieldByName("BLVENT")->AsInteger;
        oBUTOR=TOpts->FieldByName("BUTOR")->AsInteger;
        oBPROD=TOpts->FieldByName("BPROD")->AsInteger;
        oPUT1=TOpts->FieldByName("PUT1")->AsString;
        oPUT1=StrSlash(oPUT1);
        oPUT2=TOpts->FieldByName("PUT2")->AsString;
        oPUT2=StrSlash(oPUT2);
        oPUT3=TOpts->FieldByName("PUT3")->AsString;
        oPUT3=StrSlash(oPUT3);

        Form1->TOpts->Active=false;
        return 0;
}


AnsiString  TForm1::StrSlash(AnsiString s)
{
AnsiString s1="";
short i=0;

      for(;s.Length()>0;)
      {
       i=s.AnsiPos('\\');
       if(i>0)
        {
         s.Insert('\\',i);
         s1+=s.SubString(0,i+1);
         s=s.SubString(i+2,s.Length());
        }
       else
        {
         s1+=s;
         s="";
        }
       }
       return s1;

}

...
oGetOpts("a");
progress=true;
 StatusBar1->Panels->Items[0]->Text="??????\t ??????????? ???????? ?? " +oPUT1+ "\\\\prv02.dbf";
 Form1->Repaint();
 Table1->TableName=oPUT1+"\\prv02";
 Table1->Filter="god=" + AnsiString(oGOD)+ " and mes=" + AnsiString(oMES)+ " and deb>=20000 and deb<30000";
 Table1->Filtered=true;
 Table2->TableName="prv02_t";
 Table2->EmptyTable();
 BatchMove1->Source = Table1;
 BatchMove1->Destination = Table2;
 BatchMove1->Mode = batAppend;
 BatchMove1->Execute();

....


По моему StrSlach совсем не нужна.

259
18 апреля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by AlexandrVSmirno
По моему StrSlach совсем не нужна.


Поясню:
Если Вы присваиваете значение примо в тексте программы, тогда:

 
Код:
StatusBar1->Panels->Items[0]->Text=""ффф\t ааааааа " +oPUT1+ "\\prv02.dbf";
а компилятор уже заменит \\ на код символа слэш
А если читаете из файла, то ничего не надо делать там уже код симовала слеш стоит.
9.2K
19 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by AlexandrVSmirno
Поясню:
Если Вы присваиваете значение примо в тексте программы, тогда:
 
Код:
StatusBar1->Panels->Items[0]->Text=""ффф\t ааааааа " +oPUT1+ "\\prv02.dbf";
а компилятор уже заменит \\ на код символа слэш
А если читаете из файла, то ничего не надо делать там уже код симовала слеш стоит.



Да это как раз неоспоримо


короче oPUT1+ "\\prv02.dbf" на панели выглядит так
o:\\netb\\dbfa\\prv02.dbf (т.е. в watch "учетв" слэши т.к я пускал свою функцию)
и присваивая ЭТО имени таблицы я имею к ней доступ

когда в watch слэши "удвоеные", что получается
сразу после чтения из файла к таблице доступа
НЕТ

10
19 апреля 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by z-dan-z
когда в watch слэши "удвоеные", что получается
сразу после чтения из файла к таблице доступа
НЕТ


Ну, и на фига надо было писать функцию удвоения?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог