![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа со строками и PChar [D5, Win95/98]
MegaVolt © (2002-12-06 18:29:00)Вот пример:
<\code>
Function(path:PChar....
var
Drive:pchar;
begin
Drive:="C:";
StrCat(Drive,Path);
if path<>"\" then StrCat(Drive,"\");
StrCat(Drive,"*.*");
Result:=FindFirstFile(Drive,FindData);
end;
Function(path:PChar....
var
Drive:string;
begin
Drive:="C:"+String(path);
if (String(path)<>"\") then Drive:=Drive+"\";
Drive:=Drive+"*.*";
result:= FindFirstFile(Pchar(Drive),FindData);
end;
<\code>
Почему когда я работаю со строками DLLка работает а когда с PChar то не работает. Где я что неправильно делаю?
MegaVolt (2002-12-13 17:19:00) [1]Fantasist я понял тебя но что самое интересое моя запись тоже работает т.е. я пишу без ^ а это ни на что не влияет почему?
Fantasist (2002-12-12 21:37:00) [2]
> формат данных которые мне приходят таков:
> обратный слешь + путь без имени диска без слеша в конце
>
Значит тебе нужно проверять первый символ (как я и подумал вначале), а значит делать так, как я сказал выше.
MegaVolt (2002-12-12 09:21:00) [3]Да нет не так:
формат данных которые мне приходят таков:
обратный слешь + путь без имени диска без слеша в конце следовательно мне нужно в начале всегда добавлять "c:" без слеша в конце так как он есть в пути. А конце мне нужно добавить "\*.*" и всё бы работало правильно кроме случая пустого пути т.е. мне придёт один обратный слеш и если прогнать его по алгоритму получится "c:\\*.*" так вот чтобы такого небыло я проверяю пришол ли мне один слеш и если пришол то один слешь не добавляю.
Anatoly Podgoretsky (2002-12-10 13:50:00) [4]Маленькая ошибка в моем предыдущем сообщении
Точнее ты всегда добавишь слеш в конце, есть он там или нет, то есть для program получишь program\и для program\ получишь program\\и если пришло "" то получишь c:*.*
Проверять надо только последний символ строки с удалением пробелов в конце (при необходимости если такое может произойти).
Drive:="C:" + Trim(String(path));
if Drive[Length(Drive)] <> "\" then Drive := Drive + "\";
Anatoly Podgoretsky (2002-12-10 13:40:00) [5]Нет для "program" ты воолще ничего не получишь, так как if ( String(path)<>"\") then Drive:=Drive+"\"; не будет никогда выполнено, странная часть отмечена жирным
MegaVoltik (2002-12-10 13:31:00) [6]Да нет просто без этой проверки если мне пришло "\" по на выходе я получу "c:\\*.*" а вот для "program" получу то что нужно "c:\program\*.*". И чтобы не было двойного слеша когда мне передано "\" я делаю проверку и не добавляю слеш.
Кстати этот пример заработал после того как я выделил память под Drive.
Конечно он может работать некоректно но почему я не понимаю :( Растолкуйте пли-и-из
Anatoly Podgoretsky (2002-12-10 13:18:00) [7]MegaVolt (09.12.02 14:16)
Так вот у тебя работает только для "если "\" нужно "c:\*.*"", а для "\program" не будет, поэтому это и казалось странным, теперь уже не странно, это уже точно неправильно, тебе надо проверять последний символ строки на "\", а не всю строку
MegaVoltik (2002-12-10 13:08:00) [8]Fantasist:
возможно так и правильно но вроде всё работает и так. А почему?
Fantasist (2002-12-09 23:44:00) [9]
> где написано чтоо дельфи под длянные строки выделяет память
> динамически
Правильно, но имеются ввиду делфийский тип строки string.
PChar - не является строкой ни в каком виде - это указатель на char. Этот тип, естесственно, не управляется компилятором, как и любой другой указатель.
> Просто мне приходит путь и его нужно преобразовать так
> если "\" нужно "c:\*.*"
> а если "\program" нужно "c:\program\*.*"
Тогда тебе надо писать:
if path^<>"\" then ...
MegaVolt (2002-12-09 14:51:00) [10]Кстати если применять строки то придётся таскать за собой delphimm.dll ^(
MegaVolt (2002-12-09 14:16:00) [11]Просто мне приходит путь и его нужно преобразовать так
если "\" нужно "c:\*.*"
а если "\program" нужно "c:\program\*.*"
Anatoly Podgoretsky (2002-12-09 13:01:00) [12]Ответь что ты там делаешь, модет ничего странного и нет, смысл этого действия.
MegaVolt (2002-12-09 12:58:00) [13]Так что именно странно всё целиком или строчка какая? :(
Anatoly Podgoretsky (2002-12-09 12:52:00) [14]MegaVolt (09.12.02 09:32)
Что не так не знаю, тебе виднее что ты здесь делаешь, но выглядит странно.
MegaVolt (2002-12-09 12:48:00) [15]Кстати ошибка пошла из сайта по функциям дельфи www.atrussk.ru/delphi/5/string/str5211.htm
где написано чтоо дельфи под длянные строки выделяет память динамически (и как я понял без моей помощи)
MegaVolt (2002-12-09 09:32:00) [16]String(path)<>"\" а что в этой строке не так?
Я просто пытался сделать практически так же как в примере на С++ вот от сюда и получился PChar и WinAPI. Так и чувствовал что не выделяю память под PChar но SetLength не прошло и я решил что дельфя всё за меня сделает а про stralloc strdispose забыл :(
Anatoly Podgoretsky (2002-12-06 20:10:00) [17]Юрий Федоров © (06.12.02 18:36)
Вообще то он выделяет, но только для двух символов (Drive:="C:";), к тому же в кодовом сегменте.
MegaVolt (06.12.02 18:29)
Какая нужда тебя заставляет заниматься садомохохизмом, второй твой пример нормальный, за исключением этой странной штуки
String(path)<>"\"), но может в этом есть какой то смысл.
Anatoly Podgoretsky (2002-12-06 19:47:00) [18]Юрий Федоров © (06.12.02 18:36)
Вообще то он выделяет, но только для двух символов (Drive:="C:";), к тому же в кодовом сегменте.
MegaVolt (06.12.02 18:29)
Какая нужда тебя заставляет заниматься садомохохизмом, второй твой пример нормальный, за исключением этой странной штуки
String(path)<>"\"), но может в этом есть какой то смысл.
Sha (2002-12-06 19:29:00) [19]Ох, не люблю я платить. Не люблю даже больше, чем эти PCharы :)
Antonius (2002-12-06 19:17:00) [20]я делаю. Могу и за тебя делать. О цене договоримся? :)))