|
|
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
Есть такой класс Код: 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. если сделать такой вызов Код: pascal 1. 2. 3. 4. 5. 6. 7. то увидим OK. А если такой Код: pascal 1. 2. 3. 4. 5. 6. 7. получим Fail. Т.е. для второго вызова классовый конструктор не вызывается. Кто объяснит причину бага? Повторяется на XE3 и 10.3.1 С уважением, Vasilisk ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 13:57 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
С таким объявлением Код: pascal 1. работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 14:04 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
Баг завязан на конкретный класс. Если заменить TEncoding на TMBCSEncoding то все работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 14:13 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Баг компилятора. На 10.4 воспроизводится. Можно репортить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 14:20 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
Обошел багу так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 14:24 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
Порядок вызовов конструкторов классов неопределен. Все классы (наверное) создаются при старте приложения, но очередность создания непонятна. Вполне возможно, что в момент вызова Код: pascal 1. 2. 3. 4. 5. класс TEncoding или класс TMBCSEncoding, к которому идет обращение внутри, еще не существует, и экземпляр TMBCSEncoding не может быть создан. Логично ожидать Access Violation в таком случае, однако, вероятно, там предусмотрены пути обхода. Когда же вы вызываете GetEncoding как геттер при действиях на форме, к этому моменту приложение уже живет полной жизнью и все классы давно созданы. Ну, может, не совсем так, но засада где-то рядом. Еще не созданы все классы, а вы уже хотите создать экземпляр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 15:23 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
Если я прав, то ваш обход работает лишь до поры, до времени. В один прекрасный момент компилятор решит изменить порядок вызова конструкторов, и вы опять напоретесь на ту же ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 15:29 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
shalamyansky класс TEncoding или класс TMBCSEncoding, к которому идет обращение внутри, еще не существует shalamyansky Логично ожидать Access Violation в таком случае, однако, вероятно, там предусмотрены пути обхода. shalamyansky Когда же вы вызываете GetEncoding как геттер при действиях на форме, к этому моменту приложение уже живет полной жизнью и все классы давно созданы. Попробуйте сделать так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. а потом замените выделенное на любой другой класс. И расскажите потом о порядке создания Kazantsev Alexey Можно репортить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 15:55 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Голосуем Я уже :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 16:00 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
Собрал ваш пример. Заметил следующее - если создать экземпляр вашего класса TTest1, или даже не создавать экземпляр, а хотя бы зарезервировать ссылку для него, например вот так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. то пример работает и с TEncoding. То есть причина не в классе TEncoding как таковом, а в неких зависимостях, которые влияют прежде всего на порядок исполнения начальных вызовов. Класс же TEncoding не похож на класс TMBCSEncoding и прочие тем, что для него не создается экземпляра. В случае вызова TEncoding.GetEncoding(1251), как у вас, создается экземпляр TMBCSEncoding. Не знаю, можно ли это считать багом, но поведения хотелось бы более определенного. Отпишитесь, что скажут создатели, любопытно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 18:54 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
shalamyansky , а хотя бы зарезервировать ссылку для него, shalamyansky Класс же TEncoding не похож на класс TMBCSEncoding и прочие тем, что для него не создается экземпляра. shalamyansky Отпишитесь, что скажут создатели, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 19:57 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ А как его использовать: обратиться к методу или объявить переменную - не важно Оказывается, важно. Важно даже, как объявить. Потому что если вот так работает: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. То вот так уже нет: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Собственно, я согласен, что это есть баг. Но вы попросили его объяснить, и я выдвинул гипотезу, на мой взгляд правдоподобную. Любая гипотеза нуждается в доказательствах, но пока их нет, я в неё просто верю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 20:28 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ shalamyansky Класс же TEncoding не похож на класс TMBCSEncoding и прочие тем, что для него не создается экземпляра. Это что-то новое, что для TStream не предусмотрено создание экземпляра класса. C TFile и TDirectory тоже работет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2020, 20:45 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
alekcvp Это что-то новое, что для TStream не предусмотрено создание экземпляра класса. alekcvp C TFile и TDirectory тоже работет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2020, 15:30 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. Тогда как при обращении к объекту он ищется у конкретного класса Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2020, 15:34 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. А где freeAndNil ? Ты проверяешь что адрес объекта помечен как NIL то free не помечает адрес переменной в nil И когда объект освобождён, - переменная остаётся со старыми данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2020, 19:54 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный А где freeAndNil ? Ты проверяешь что адрес объекта помечен как NIL то free не помечает адрес переменной в nil И когда объект освобождён, - переменная остаётся со старыми данными. "procedure TForm1.Button1Click(Sender: TObject);" не может быть вызвана после "class destructor TTest1.Destroy;" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2020, 20:37 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
rgreat, В любом случае баг у меня не воспроизводится Delphi 10.4 Version 27.0.37889.9797 Memo1 OK: TMBCSEncoding OK: TObject OK: TObject OK: TMBCSEncoding Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2020, 21:41 |
|
||
|
Создание TEncoding в классовом конструкторе
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный В любом случае баг у меня не воспроизводится Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2020, 13:17 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39968566&tid=2038214]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 466ms |

| 0 / 0 |
