|
|
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
Столкнулся с вариантом у которого Vtype = 14. Делфи этот тип не поддерживает Код: pascal 1. Захотелось к нему написать наследника TCustomVariantType, где описать все манипуляции с ним. Нарвался на такие строчки Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Для varDecimal LSlot будет меньше нуля и возникнет исключение. Правильно ли я понимаю, что для varDecimal сделать TCustomVariantType невозможно? Или есть обходные пути? Сейчас, в момент получения такого варианта вызывается VariantChangeType с кастом в минимально доступный тип С уважением, Vasilisk ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 18:21 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Там не только дело в конструкторе, там CMinVarType везде фигурирует, и для varDecimal ты TCustomVariantType не переопределишь Но зачем? varDecimal обрабатывается как системный Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 23:38 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
Кстати целочисленная часть не Int64, а UInt64 А знак определяется старшим битом Reserved1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2018, 23:43 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUvarDecimal обрабатывается как системныйЕсли бы обрабатывался, я бы и тему такую не поднимал SOFT FOR YOUКстати целочисленная часть не Int64, а UInt64Кстати, целочисленная часть это UInt96 (12 байт) SOFT FOR YOUА знак определяется старшим битом Reserved1А еще есть точность. Вообще, для корректного доступа к полям, нужно TVarData напрямую приводить к TDecimal ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 00:25 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUКстати целочисленная часть не Int64, а UInt64 А знак определяется старшим битом Reserved1 Код, который я привёл выше, у тебя не работает? У меня работает. Windows 7, Delphi XE 8. И точность в примере тоже указана - 1 разряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 10:10 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Кстати, целочисленная часть это UInt96 (12 байт) Да, ты прав, ещё нужно Reserved2 и Reserved3 заполнять Или RawData[1], или VLongs[0] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 10:19 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUКод, который я привёл выше, у тебя не работает?Так. Задумался. На Tokyo все работает. На XE3, но немного не такой пример. Ага, понял, что меня смутило. Каст работает. Не работает сравнение Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Project Project1.exe raised exception class EVariantInvalidOpError with message 'Invalid variant operation'.А вот так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. все работает. Но мне нужно сравнить на равенство именно два варианта с произвольными типами. И в моем понимании, varInteger и varDecimal типы сравниваемые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 14:16 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
Похоже вместо Код: pascal 1. нужно писать Код: pascal 1. и тогда все работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 14:18 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
Обнаружилась еще одна особенность. VarCmp почти в три раза быстрее. Тест Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Результаты Типы=VarCmpvarInteger-varInteger130464969varInteger-varDouble179697468 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 16:44 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, интересная информация. видимо сравнение идёт через преобразование, а varcmp нативно сравнивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 18:44 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
Та возьмите, да посмотрите в трейсе ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 20:37 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
makhaonвидимо сравнение идёт через преобразованиеТак и есть Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. makhaonvarcmp нативно сравнивает.Не совсем понятно, что такое "нативно". У VarCmp есть один минус.Он Windows-only. Но мне не понятно, что мешало Эмбаркадере для Windows вызывать родную VarCmp, а для остальных платформ - свою реализацию. Для некоторых функций они так и делают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 20:40 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Из-за Delphi-like типов AnsiString, например, или UnicodeString А хочешь быстрое сравнение - сам напишешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 20:43 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUИз-за Delphi-like типовМдя. Не подумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 20:56 |
|
||
|
TCustomVariant (varDecimal)
|
|||
|---|---|---|---|
|
#18+
Хрень полная Код: pascal 1. 2. 3. 4. LWinCmp = VAR_CMP_GT; LNativeCmp = True; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2018, 21:24 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2041371]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
181ms |
get topic data: |
12ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 208ms |
| total: | 516ms |

| 0 / 0 |
