Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 .. 45 46 47 48 49 [50] 51 52 53 54 .. 56 вперед Ctrl→ |
Василий 2 Member Откуда: Сообщений: 1016 |
Неочевидный нюанс - PChar от пустой строки вовсе не nil!var p: Pointer; s: string; begin s := ''; p := PChar(s); Debug(IntToStr(Integer(p))); // Debug Output: 4224380 Process pr.exe (3984) p := Pointer(s); Debug(IntToStr(Integer(p))); // Debug Output: 0 Process pr.exe (3984) |
14 янв 20, 17:01 [22059044] Ответить | Цитировать Сообщить модератору |
Квейд Member Откуда: Kyiv, Ukraine Сообщений: 5397 |
|
||||
14 янв 20, 18:07 [22059115] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Поразмыслив, можно догадаться, что в этом есть некий смысл - ведь указатель на пустую строку это вполне себе нормальный ненулевой указатель на #0 где-то в памяти. Но при вызове API функций, принимающих непустые PChar либо NULL, может сработать не так, как ожидается |
14 янв 20, 18:24 [22059126] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2731 |
Это специально сделано, чтобы пустая строка и в PChar была пустой строкой. Хотите nil - пишите PChar(Pointer(string)). |
||||
15 янв 20, 09:58 [22059455] Ответить | Цитировать Сообщить модератору |
KtoI Member [заблокирован] Откуда: Сообщений: 20 |
Василий 2, если смотреть в чистый космос очищенный от всего. То там останется материя. Всё логично, там где ты видишь нелогичность. |
18 янв 20, 04:59 [22062071] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Неочевидность, а не нелогичность |
||||
20 янв 20, 10:40 [22062884] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15038 |
вот так я ложанулся 22077252 с наследованием фреймов ![]() думал, у меня два фрейма, а их оказалось три |
11 фев 20, 15:40 [22077685] Ответить | Цитировать Сообщить модератору |
ёёёёё Member Откуда: Сообщений: 2017 |
X11, циклическая ссылка. |
11 фев 20, 17:01 [22077750] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3788 |
X11, налицо нарушение принципа kiss - сделай это проще, дурачек. все претензии с названием к авторам принципа если что :) Сообщение было отредактировано: 11 фев 20, 20:32 |
11 фев 20, 20:31 [22077874] Ответить | Цитировать Сообщить модератору |
ёёёёё Member Откуда: Сообщений: 2017 |
makhaon, дурачОк. |
11 фев 20, 23:26 [22077928] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Вечер сюрпризовprocedure TForm1.Button2Click(Sender: TObject); var s: string; rb: RawByteString; begin ShowMessage(IntToStr(StringCodePage(rb))); // 1251 rb := '1'; ShowMessage(IntToStr(StringCodePage(rb))); // кодировка проекта s := 'тест'; rb := RawByteString(s); ShowMessage(IntToStr(StringCodePage(rb))); // 1251 end; Конечно, справка, которая не рекомендует применять переменные подобного типа, это всё хорошо, но что ж тогда применять-то? |
5 мар 20, 19:02 [22093874] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Василий 2, Просто разберись, что такое RawByteString, и не будет ни каких сюрпризов ;) |
5 мар 20, 19:19 [22093896] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2731 |
А что вам требуется и чем не устраивают AnsiString, Utf8String или какой-нибудь
GreekString = type Ansistring(1253)
?
Сообщение было отредактировано: 5 мар 20, 19:38 |
||||
5 мар 20, 19:39 [22093910] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
По аналогии с объявлением type AnsiString(##) не ожидаешь особого поведения. Логика подсказывает, что кодовая страница должна сохраняться всегда, а вот фиг - на каждом присвоении сбрасывается. То есть это не RawByte string, а AnyCodePage string. Переменная типа RawByte в моем идеальном мире вообще не заботится о кодовой странице. Ну и ещё неочевидный нюанс var rb: RawByteString; begin SetLength(rb, 1); ShowMessage(IntToStr(StringCodePage(rb))); // 1251 (ACP)
Тем, что мне нужна универсальная строка до применения кодировок. P.S. TBytes не предлагать. |
||||||||
5 мар 20, 20:26 [22093948] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Она и сохраняется. Просто не так, как ты думаешь. Доку читай:
Ну и дальше там, о применимости. |
||||||
5 мар 20, 20:51 [22093960] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Строка без кодировок это... UCS4String? Нет в дельфе таких строк. |
||||
5 мар 20, 20:55 [22093961] Ответить | Цитировать Сообщить модератору |
Василий 2 Member Откуда: Сообщений: 1016 |
Нет, обычный абстрактный MBCS с неизвестной кодировкой, где первые 127 символов гарантированно занимают по байту. AnsiString<0> или AnsiString<$ffff> - неважно.
Она не сохраняется у переменной типа RawByteString. По факту, даже так сразу и не скажешь, как можно получить строку с кодовой страницей $ffff без SetCodePage. Всё время сбивается на ACP. |
||||||||
6 мар 20, 11:05 [22094311] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2731 |
Логично, что она сохраняет ту страницу, текст в которой ей присвоили, как иначе?
|
||||||||||||
6 мар 20, 11:09 [22094314] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2731 |
ShortString? Не помню, перекодируются они или нет?.. |
||||||||
6 мар 20, 11:10 [22094317] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4988 |
Для чего тебе это? Чем не устраивают имеющиеся строки?
RawByteString сохраняет кодовую страницу присваиваемых ей строк. Это просто хранилище любых long strings, не требующее преобразований. |
||||||||
6 мар 20, 11:28 [22094338] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1780 |
Вызвал метод sort() у TStringList и посчитал, что этого достаточно, чтобы свойство sorted стало true... :) |
19 май 20, 17:22 [22135952] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 587 |
Напоролся тут на фатальный вылет программы - до экрана "Работа программы была прекращена", хотя все try-except обернуты и App.OnException тоже. При этом дополнительно вспухал мессаджбокс с сообщением об исключении типа TFreedObject от FastMM. Обнаружил, что причина - это перевызов исключения конструкцией except on E: Exception do ... raise E; // а должно быть просто "raise;" которая выкидывает объект исключения после его удаления, что ловит FastMM, подставляя вместо удаленного объекта свой, в результате чего raise кидает именно его, а Application.HandleException не пропускает его в OnException из-за проверки "if O is Exception", передавая в System.SysUtils.ShowException, который и выкидывает мессаджбокс. А если не использовать FastMM с режимом детектирования, то исключение может просто пропасть procedure Pr(); begin try raise Exception.Create('Error Message'); except on E: Exception do raise E; end; end; procedure TForm1.Button3Click(Sender: TObject); begin Pr; // ничего не выдаст end; |
2 ноя 20, 15:01 [22224951] Ответить | Цитировать Сообщить модератору |
softwarer Member Откуда: 127.0.0.1 Сообщений: 64874 Блог |
Fr0sT-Brutal, угу. Другая веселуха - что оператор raise вполне понимает аргументом и то, что не является Exception. Например, можно написать raise TButton.Create(nil); или raise Exception('Shit happens'); Тогда тоже бывают забавные эффекты. |
2 ноя 20, 15:12 [22224963] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
||||||||
2 ноя 20, 17:02 [22225106] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 587 |
Да, неочевидно. Хотя это пригождается, если хочется сделать код с исключениями, но без SysUtils для минимизации бинарника |
||||
2 ноя 20, 18:33 [22225198] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 .. 45 46 47 48 49 [50] 51 52 53 54 .. 56 вперед Ctrl→ |
Все форумы / Delphi | ![]() |