![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректна ли запись PAnsiChar := @string ?
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 Вот не пойму а так вообще можно?