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

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

Корректна ли запись PAnsiChar := @string ?


Страницы:   1 2 3

Kolan ©   (2007-10-15 10:45:00) 

Можно ли так делать?
ShellExecute(0,'open', @FlexCelReport1.filename[1],nil,nil,sw_show);


Kolan   (2007-10-15 11:36:00) [21]

> как в таком случае

А это понятно. Мне интересно про ав все таки.
И про превращение. Я рассуждаю как ты в [17]:
ShellExecute не знает, что по смещению —4 хранится длина строки. Он определит длину по нулевому символу.
Так ли это…


Ins   (2007-10-15 11:36:00) [22]

В общем, еще раз, а то я как-то криво сформулировал:
1. Если функция требует параметром PChar, а у вас есть переменная типа String, то передавать этот параметр нужно так:
SomeFunc(PChar(Str));
2. Если функция требует параметром PChar, а у вас есть строковая константа (литерал), то передавать этот параметр нужно так:
SomeFunc('бла-бла');
Но не так:
SomeFunc(PChar('бла-бла'));
так как в последнем случае глупый компилятор может сделать совсем не то, чего вы от него ждете и получите законное AV.


Ins   (2007-10-15 11:29:00) [23]


> Ins, Kolan — неверное превращежние в случае 'aaaa#0bbbbb'

Я имел в виду, что нужно всегда писать PChar(str), если требуется параметр PChar, но не приводить к PChar, если str - не переменная, а строковая константа, как в таком случае:
MessageBox(0,PChar('Text'),PChar('Caption'),0); - не нужно
MessageBox(0,'Text','Caption',0); - нужно так.


Kolan   (2007-10-15 11:25:00) [24]

Тааак мнения разделильсь…

То что так писать ненадо понятно.

А вот что с ошибкой:
будет:

Palladin — AV
Ins, Kolan — неверное превращежние в случае 'aaaa#0bbbbb'

--
не будет:

Anatoly Podgoretsky — Можно
clickmaker — это все равно массив байтов…


Palladin   (2007-10-15 11:22:00) [25]

AV будет или не будет... по встречной полосе тоже ехать можно...


Ins   (2007-10-15 11:22:00) [26]


> Я вотч чего смущаюсь. А есои строка 'aaaa#0bbbbb', то что
> будет? Не останется ли от нёё aaaa при сабжевом вызове?

ShellExecute не знает, что по смещению -4 хранится длина строки. Он определит длину по нулевому символу. Так что извращаться нет смысла. Вывод такой - всегда писать PChar(String) за исключением случаев строковых литералов. В случае их к PChar приводить не надо.


Kolan   (2007-10-15 11:21:00) [27]

FlexCelReport1.filename := '';
 ShellExecute(0,'open',@FlexCelReport1.filename[1],nil,nil,sw_show);


Да нет, открылась рабочая папка, никаких АВ…


Kolan   (2007-10-15 11:19:00) [28]


> @string[1] — чуть более в том плане, что если строка пустая
> — будет AV

так все таки ошибка возможна, щас проверю…


Kolan   (2007-10-15 11:18:00) [29]

> Можно, но не нужно, ерунда получается.

Ясно, кстати, раз уж зашла речь, то я пишу так:
ShellExecute(0,'open', P AnsiChar(DataModuleRep.FlexCelReport.FileName), nil,nil, SW_SHOW);

Типа что просят, то и даю. Я не прав?


Palladin   (2007-10-15 11:16:00) [30]


> Kolan ©

Не знаю как в других версиях делфи, но в D6, PAnsiChar := @string ни в коем разе не корректно, бо PAnsiChar - это PChar, @string - указатель на указатель, чуть более корректно только так @string[1] - чуть более в том плане, что если строка пустая - будет AV


clickmaker   (2007-10-15 11:15:00) [31]


> есои строка 'aaaa#0bbbbb', то что будет? Не останется ли
> от нёё aaaa при сабжевом вызове?

это зависит от того, как функция обрабатывает строку. По сути, это все равно массив байтов


Anatoly Podgoretsky   (2007-10-15 11:13:00) [32]

Kolan ©   (15.10.07 10:45)  
Можно, но не нужно, ерунда получается.


Kolan   (2007-10-15 11:10:00) [33]


> просто, глядя на PChar(xxx), сразу видно, что параметр типа
> PChar

И все? Ошибки нет?
Я вотч чего смущаюсь. А есои строка 'aaaa #0bbbbb', то что будет? Не останется ли от нёё aaaaпри сабжевом вызове?


Kolan   (2007-10-15 11:08:00) [34]

filename — это string
> filename — это string


Точнее TFileName…


Kolan   (2007-10-15 11:08:00) [35]

filename — это string


Ega23   (2007-10-15 11:05:00) [36]


>
> [1] там лишнее
>
> просто, глядя на PChar(xxx), сразу видно, что параметр типа
> PChar


Стоп-стоп...
filename - это string или TStrings? Если первое - то, конечно, как в [4]. Если второе - то как в [1]


clickmaker   (2007-10-15 11:03:00) [37]


> Почему

[1] там лишнее

просто, глядя на PChar(xxx), сразу видно, что параметр типа PChar


Kolan   (2007-10-15 11:00:00) [38]

> не надо

Почему, вот что самое интересное для меня в данном вопросе… Мне кажется, что тут кроется ошибка, но хотелось бы узнать точно.


clickmaker   (2007-10-15 10:56:00) [39]


> Я бы написал как Ega…

не надо
лучше так PChar(FlexCelReport1.filename)


Kolan   (2007-10-15 10:54:00) [40]

> нравится значок @ ?

не нравиться. Я бы написал как Ega… Вот не пойму а так вообще можно?


Страницы:   1 2 3

Наверх

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