символы формата строки
Заранее спасибо
нет ли стандартной функции которая переводила строку AnsiString "c:\path1\path2\file1.000" в строку "c:\\path1\\path2\\file1.000"
Заранее спасибо
А в чем дело? '\\' есть один сивол (так же как '\p' или '\f').
Хотя может я тебя понял не правильно...
нет ли стандартной функции которая переводила строку AnsiString "c:\path1\path2\file1.000" в строку "c:\\path1\\path2\\file1.000"
Если имеется ввиду то, что при чтении строки из Edit'а нужно произвести подобное преобразование для дальнейшей работы с этой строкой, то могу успокоить - ничего пробразовывать не нужно. Все происходит автоматически. Используй значеине Edit->Text.
Если имеется ввиду то, что при чтении строки из Edit'а нужно произвести подобное преобразование для дальнейшей работы с этой строкой, то могу успокоить - ничего пробразовывать не нужно. Все происходит автоматически. Используй значеине Edit->Text.
Не путай человека. Если пишется обычная программа - да, никакого преобразования делать не надо. Только не потому, что оно делается автоматически, а по причине, что оно вообще не нужно. Человек еще не разобрался и путает обозначение символов в Си с самими символами в буфере строки, когда она в памяти.
Если же пишется программа вроде собственного экспорта в Reg-файлы, там для совместимости с форматом REG придется кодировать самому. Только не думаю, что человек, еще не разобравшийся с представлением строк в памяти, будет озадачиваться разработкой собственного экспорта в REG-файл. :D
Только не потому, что оно делается автоматически, а по причине, что оно вообще не нужно.
Это вобщем-то и имелось в виду - выразился коряво конечно.
"символы формата строки " в заголовке написал, т.к полагаю что за "\" ожидается символ форматирования
Ex '\n' , '\t' etc, a '\\'="\"
имелось в виду следущее
я принимаю сторку пути из базы настроек
в AnsiString s, в s действительно хранится путь
"c:\path1\path2\file.000", и с ним вроде все путем, но передавая этот параметр в TTable имею
путь "с:", если "c:\\path1\\path2\\file.000", то все
Ok, вот собственно суть вопроса замену одного "\" на два руками я сам конечно реализовал, но все же интересно
2Freeman&pacific_7 Господа не ссорьтесь ;) и не брызгайте слюной ....
Да мы в общем-то спокойны. Нормальное обсуждение вопроса в котором уточняются подробности и исправляются неточности.
но передавая этот параметр в TTable имею
путь "с:"
Что-то странное по-моему. Вроде как обрываться строка не должна, даже если слеш воспринимается как управляющий символ. В случае одиночного слеша - он просто игнорируется, т.е. строчка c:path1path2 у вас должна быть полюбому, а вот символ '\f', если следовать спецификации С - это перевод бумаги, воспринимается как переход на новую строку без возврата каретки. Все равно непонятно.
но передавая этот параметр в TTable имею
путь "с:", если "c:\\path1\\path2\\file.000"
Гм, а где параметры в TTable?
Гм, а где параметры в 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}
вот так проходит
Вы абсолютно правы pacific_7 path1 реально начинался на 'n' вопрос не в этом а в том что в памяти то "\" уже равен '\\\'
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 показывает нечто невразумительное. Похоже на баг в процессоре.
Блин, так че? Первый пример ошибочный, а второй верный - тут и ежу ясно. А вот 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)
удваивает слэши
удваивает слэши
Это естественно. Для того, чтобы отличить \ - слеш от начала символа форматирования \ в компиляторе С прянято соглашение об удваивании слеша т.е.\\-это один символ \. То же самое для символа " в нутри строки символов.
watch oPUT1{c:\\path1\\path2} до StrSlash(oPUT1)
При присваивании в Table1->TableName должно работать.
А здесь должно выдать исключение.
Кстати, факт, что такой функции не существует ни в C RTL, ни в VCL говорит только о том, что проблемы нет. Поэтому твоя функция решает несуществующую проблему.
Разберись еще раз с исходниками. Я уверен, что где-то есть ошибка. Можешь запостить сюда - вместе посмотрим. Только оформи его тегами <code>, чтоб читать можно было.
Это естественно. Для того, чтобы отличить \ - слеш от начала символа форматирования \ в компиляторе С прянято соглашение об удваивании слеша т.е.\\-это один символ \. То же самое для символа " в нутри строки символов.
Абсолютно с Вами согласен, но я ж их уже "учетверяю" получается
2Freeman
{
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();
....
Абсолютно с Вами согласен, но я ж их уже "учетверяю" получается
2Freeman
{
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 совсем не нужна.
По моему StrSlach совсем не нужна.
Поясню:
Если Вы присваиваете значение примо в тексте программы, тогда:
А если читаете из файла, то ничего не надо делать там уже код симовала слеш стоит.
Поясню:
Если Вы присваиваете значение примо в тексте программы, тогда:
А если читаете из файла, то ничего не надо делать там уже код симовала слеш стоит.
Да это как раз неоспоримо
короче oPUT1+ "\\prv02.dbf" на панели выглядит так
o:\\netb\\dbfa\\prv02.dbf (т.е. в watch "учетв" слэши т.к я пускал свою функцию)
и присваивая ЭТО имени таблицы я имею к ней доступ
когда в watch слэши "удвоеные", что получается
сразу после чтения из файла к таблице доступа
НЕТ
когда в watch слэши "удвоеные", что получается
сразу после чтения из файла к таблице доступа
НЕТ
Ну, и на фига надо было писать функцию удвоения?