Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа со строками и PChar [D5, Win95/98]


Страницы:   1 2

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]

я делаю. Могу и за тебя делать. О цене договоримся? :)))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо