|
|
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
Всем доброго вечера. Разбираюсь с методами записей - вещь вельми удобная и интересная, начал использовать ее для работы с БД. Но вот не могу разобраться. У меня уже немало кода используют локальные переменные-записи. недавно обнаружил, что объявленные локально в функциях/процедурах/событиях переменные-записи содержат внутри мусор, по моей логике работы с записями - не всегда все поля задаются явно по алгоритму, и не присвоенные в коде процедуры поля записи остаются непроинициализированные, соотв. с мусором. Так выявилась проблема, что поле типа TDateTime, которое не было присвоено в коде, при записи в БД вызывало арифметическую ошибку. Суть проблемы - я так понял, нельзя задать свой дефолтный конструктор для записи. То есть задать во всех моих записях конструктор по умолчанию, чтоб он занулял все поля. Нужно добавить свой конструктор с каким-то параметром и потом перед использованием переменной-записи вызывать его явно в начале использования. (как-то сумбурно описал, но надеюсь вы смогли что-то понять). Грубо говоря - есть уже готовый код с использованием переменных-записей. Можно ли без добавления явного конструктора-обнулятора в каждом применении переменной-записи обнулить переменную-запись? Как я понял из документации - нельзя, но вдруг я плохой чукча-читатель? Вот пример. Код: 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. SetParamIfNot0 - это функция, которая очищает параметр (clear), если значение поля нулевое Так вот, если я какое-то поле принудительно не зануля в своем коде - по умолчанию оно может быть совсем не нулевое и выходить за рамки сущности (как с датой - в поле TDateTime был мусор, который и не нулевой, и при записи в БД сыпал ошибку) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2020, 21:53 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
GrigoriyFomin, В 10.4 появилась возможность перегружать операторы инициализаци, финализации и присваивания: Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2020, 22:12 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey GrigoriyFomin, В 10.4 появилась возможность перегружать операторы инициализаци, финализации и присваивания: Код: pascal 1. 2. 3. на 10.4 смысла переходить пока не вижу - сыро и убого пока. А на более ранних получается нет возможности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2020, 22:20 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
GrigoriyFomin А на более ранних получается нет возможности? Без хаков - нет. С хаками, можно захучить продеруру InitializeRecord из system.pas, но решение так себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2020, 22:34 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
GrigoriyFomin, Лайфхак: добавьте в запись динамический массив и выставьте ему длину 1 элемент при обнулении полей. Далее проверяйте длину массива. Если массив пуст, значит работать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2020, 09:07 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
Извратное, но рабочее, решение: Можно сделать переменные рекорда приватными, доступ к ним организовать через проперти. Дополнительно в рекорде добавить манаджед переменную (например строку). И в геттере проверять на значение этой строки, если она пустая - инициализировать значения всх анманаджед переменных в рекорде. Ну и зачение строки менять на признак того что рекорд заинициализирован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2020, 15:33 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
GrigoriyFomin, хороший вопрос уже содержит ответ - вызывать его явно в начале использования или засплайсить/подменить InitializeRecord (да, лень она такая!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 01:40 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
rgreat Извратное, но рабочее, решение: Можно сделать переменные рекорда приватными, доступ к ним организовать через проперти. Да нормальное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 10:39 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
Переменные типа record, как и остальные "простые" переменные, требует явной инициализации (без которой в себе содержат мусор). Если есть привычка обнулять локальные переменные простым присваиванием и нет желания дёргать спец.функцию инициализации, можно сделать, например так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 10:48 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
delphinotes, F1: Declaring variables ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 12:24 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
delphinotes Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 12:44 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
delphinotes, так лучше: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 13:05 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
makhaon delphinotes, так лучше: Код: pascal 1. И зачем вообще эта прокладка нужна?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 13:11 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
alekcvp, какая прокладка? Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 13:27 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
makhaon alekcvp, какая прокладка? Он эту переменную создал чтобы её обнулить и присваивать её нормальным. Зачем так делать, если можно обнулять сразу нужные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 14:03 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
alekcvp Он эту переменную создал чтобы её обнулить и присваивать её нормальным. Зачем так делать, если можно обнулять сразу нужные? После появления Default не нужно. Это прием из старой школы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 14:07 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
alekcvp, не понял о чем речь. вот глобальная переменная: Код: pascal 1. 2. 3. ее нужно очищать. и лучше это делать как Default, а не как ZeroMemory. какая прокладка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 17:42 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
ГЛОБАЛЬНЫЕ переменные очищать НЕ НУЖНО! RTFM уже в конце концов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 17:44 |
|
||
|
как задать конструктор записи по умолчанию?
|
|||
|---|---|---|---|
|
#18+
makhaon alekcvp, не понял о чем речь. вот глобальная переменная: ее нужно очищать. и лучше это делать как Default, а не как ZeroMemory. какая прокладка? Ему нужно очищать локальные переменные, а не глобальные. И он делает это присваивая им пустую глобальную переменную , т.е. прокладку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2020, 21:41 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39990325&tid=2038066]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
160ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 477ms |

| 0 / 0 |
