Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];

Вниз

Работа со строками и PChar   Найти похожие ветки 

 
MegaVolt   (2002-12-06 18:29) [0]

Вот пример:
<\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 то не работает. Где я что неправильно делаю?


 
Diamond Cat   (2002-12-06 18:35) [1]

а dll-ка у тебя не под си была написана, если под си то она не воспринимает pchar


 
Юрий Федоров   (2002-12-06 18:36) [2]

Потому что под PChar нужно выделять память, чего явно не происходит в первом случае


 
MegaVolt   (2002-12-06 18:38) [3]

Так это и есть кусок DLLки и написана она на дельфях


 
Sha   (2002-12-06 19:07) [4]

Когда пишешь на API, приходится так часто самому
выделять-освобождать память, что прямо-таки устаешь.
Вот если б кто-то это делал за меня...
А может кто-то уже делает?


 
Antonius   (2002-12-06 19:17) [5]

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


 
Sha   (2002-12-06 19:29) [6]

Ох, не люблю я платить. Не люблю даже больше, чем эти PCharы :)


 
Anatoly Podgoretsky   (2002-12-06 19:47) [7]

Юрий Федоров © (06.12.02 18:36)
Вообще то он выделяет, но только для двух символов (Drive:="C:";), к тому же в кодовом сегменте.

MegaVolt (06.12.02 18:29)
Какая нужда тебя заставляет заниматься садомохохизмом, второй твой пример нормальный, за исключением этой странной штуки
String(path)<>"\"), но может в этом есть какой то смысл.


 
Anatoly Podgoretsky   (2002-12-06 20:10) [8]

Юрий Федоров © (06.12.02 18:36)
Вообще то он выделяет, но только для двух символов (Drive:="C:";), к тому же в кодовом сегменте.

MegaVolt (06.12.02 18:29)
Какая нужда тебя заставляет заниматься садомохохизмом, второй твой пример нормальный, за исключением этой странной штуки
String(path)<>"\"), но может в этом есть какой то смысл.


 
MegaVolt   (2002-12-09 09:32) [9]

String(path)<>"\" а что в этой строке не так?
Я просто пытался сделать практически так же как в примере на С++ вот от сюда и получился PChar и WinAPI. Так и чувствовал что не выделяю память под PChar но SetLength не прошло и я решил что дельфя всё за меня сделает а про stralloc strdispose забыл :(


 
MegaVolt   (2002-12-09 12:48) [10]

Кстати ошибка пошла из сайта по функциям дельфи www.atrussk.ru/delphi/5/string/str5211.htm
где написано чтоо дельфи под длянные строки выделяет память динамически (и как я понял без моей помощи)


 
Anatoly Podgoretsky   (2002-12-09 12:52) [11]

MegaVolt (09.12.02 09:32)
Что не так не знаю, тебе виднее что ты здесь делаешь, но выглядит странно.


 
MegaVolt   (2002-12-09 12:58) [12]

Так что именно странно всё целиком или строчка какая? :(


 
Anatoly Podgoretsky   (2002-12-09 13:01) [13]

Ответь что ты там делаешь, модет ничего странного и нет, смысл этого действия.


 
MegaVolt   (2002-12-09 14:16) [14]

Просто мне приходит путь и его нужно преобразовать так
если "\" нужно "c:\*.*"
а если "\program" нужно "c:\program\*.*"


 
MegaVolt   (2002-12-09 14:51) [15]

Кстати если применять строки то придётся таскать за собой delphimm.dll ^(


 
Fantasist   (2002-12-09 23:44) [16]


> где написано чтоо дельфи под длянные строки выделяет память
> динамически


Правильно, но имеются ввиду делфийский тип строки string.
PChar - не является строкой ни в каком виде - это указатель на char. Этот тип, естесственно, не управляется компилятором, как и любой другой указатель.


> Просто мне приходит путь и его нужно преобразовать так
> если "\" нужно "c:\*.*"
> а если "\program" нужно "c:\program\*.*"


Тогда тебе надо писать:
if path^<>"\" then ...


 
MegaVoltik   (2002-12-10 13:08) [17]

Fantasist:
возможно так и правильно но вроде всё работает и так. А почему?


 
Anatoly Podgoretsky   (2002-12-10 13:18) [18]

MegaVolt (09.12.02 14:16)

Так вот у тебя работает только для "если "\" нужно "c:\*.*"", а для "\program" не будет, поэтому это и казалось странным, теперь уже не странно, это уже точно неправильно, тебе надо проверять последний символ строки на "\", а не всю строку


 
MegaVoltik   (2002-12-10 13:31) [19]

Да нет просто без этой проверки если мне пришло "\" по на выходе я получу "c:\\*.*" а вот для "program" получу то что нужно "c:\program\*.*". И чтобы не было двойного слеша когда мне передано "\" я делаю проверку и не добавляю слеш.
Кстати этот пример заработал после того как я выделил память под Drive.
Конечно он может работать некоректно но почему я не понимаю :( Растолкуйте пли-и-из


 
Anatoly Podgoretsky   (2002-12-10 13:40) [20]

Нет для "program" ты воолще ничего не получишь, так как if ( String(path)<>"\") then Drive:=Drive+"\"; не будет никогда выполнено, странная часть отмечена жирным


 
Anatoly Podgoretsky   (2002-12-10 13:50) [21]

Маленькая ошибка в моем предыдущем сообщении
Точнее ты всегда добавишь слеш в конце, есть он там или нет, то есть для program получишь program\ и для program\ получишь program\\ и если пришло "" то получишь c:*.*

Проверять надо только последний символ строки с удалением пробелов в конце (при необходимости если такое может произойти).

Drive:="C:" + Trim(String(path));
if Drive[Length(Drive)] <> "\" then Drive := Drive + "\";


 
MegaVolt   (2002-12-12 09:21) [22]

Да нет не так:
формат данных которые мне приходят таков:
обратный слешь + путь без имени диска без слеша в конце следовательно мне нужно в начале всегда добавлять "c:" без слеша в конце так как он есть в пути. А конце мне нужно добавить "\*.*" и всё бы работало правильно кроме случая пустого пути т.е. мне придёт один обратный слеш и если прогнать его по алгоритму получится "c:\\*.*" так вот чтобы такого небыло я проверяю пришол ли мне один слеш и если пришол то один слешь не добавляю.


 
Fantasist   (2002-12-12 21:37) [23]


> формат данных которые мне приходят таков:
> обратный слешь + путь без имени диска без слеша в конце
>


Значит тебе нужно проверять первый символ (как я и подумал вначале), а значит делать так, как я сказал выше.


 
MegaVolt   (2002-12-13 17:19) [24]

Fantasist я понял тебя но что самое интересое моя запись тоже работает т.е. я пишу без ^ а это ни на что не влияет почему?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
14-74924
Ежик
2002-11-18 15:57
2002.12.23
Мастаки из Эстонии...


3-74596
ev1972
2002-11-28 15:49
2002.12.23
Master-Detail в Halcyon


3-74559
BorisUK
2002-12-04 08:54
2002.12.23
Сделать Hint на гриде


1-74804
Shaman7
2002-12-05 17:03
2002.12.23
Какой build delphi 7 последний?


14-74968
cyborg
2002-12-03 11:36
2002.12.23
Психологи есть?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский