|
|
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Есть поле fXMLDoc: TXMLDocument. Нужно сделать публичную property для нее. Что в сеттере должно быть? Как правильно сеттер написать? ================= Док. Win7 Ultim x64/Deb 10 (MATE; gtk3) amd64: FB 3.0.5.33220, Lazarus 2.1(r.62825); FPC 3.3.1 (r.44456) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 18:40 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 18:52 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
zedxxx Код: pascal 1. 2. 3. 4. 5. 6. Это не похоже на сеттер :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 19:00 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док Есть поле fXMLDoc: TXMLDocument. Нужно сделать публичную property для нее. Что в сеттере должно быть? Как правильно сеттер написать? Зависит от того, владеет ли объект этим XMLDocument. Я бы сделал так (добавив свойство владения): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 19:05 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, Думаю будет достаточно: Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 19:14 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
x1ca4064, а если так Код: pascal 1. 2. 3. 4. 5. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 19:15 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
DarkMaster, почти угадал :) Спасибо за советы. Приду домой - попробую зы. Код: pascal 1. не катит, нет в Лазаревских компонентах такого метода :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 19:16 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док x1ca4064, а если так Код: pascal 1. 2. 3. 4. 5. ? Здесь допускается, что объект всегда владеет TXMLDocument, т.е. два объекта TMyObj не могут иметь один и тот же документ,верно ли это - решать Вам. Возможно и другое решение - если TXMLDocument является потомком TPersistent (или как-то по другому поддерживает метод Assign) в сеттере делается копирование: Код: sql 1. 2. 3. 4. 5. но этот способ может быть медленным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 19:25 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Если без ассигна, то надо делать проверку в сеттере на равенство поля и значения. Иначе возможны проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 20:45 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док не катит, нет в Лазаревских компонентах такого метода :( Код: pascal 1. 🤣 Название методов взял от балды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 21:18 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
white_nigger надо делать проверку в сеттере на равенство поля и значения вроде так работает Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 22:40 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, Прими решение, кто управляет XMLDoc твоим... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 22:43 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
DarkMaster Прими решение, кто управляет XMLDoc твоим... с этим как раз нет проблем в OnCreate главной формы Код: 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. в ее OnClose Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Попробовал на тестовом проекте в другой форме поработать со свойством главной формы XMLDoc Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. - все пучком. xml-файл содержит все данные, добавляемые обеими формами Код: xml 1. 2. 3. 4. 5. 6. 7. Спасибо за советы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2020, 23:19 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, Я бы сделал через интерфейс Не понятно, документ используется ещё где-то или нет А ты его дестроишь ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 02:06 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU Я бы сделал через интерфейс я их практически не знаю, только знаком с концепцией :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 08:39 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док SOFT FOR YOU Я бы сделал через интерфейс я их практически не знаю, только знаком с концепцией :) Меняешь определение XMLDoc на Код: pascal 1. везде, где оно используется и заменяешь везде XMLDoc.Free на Код: pascal 1. Главное чтобы библиотека это поддерживала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 08:56 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, Ну ты даёшь ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 11:01 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Это мое хобби, а нужды не было ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 13:38 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, странно, что вопрос возник, а чем классика VCL не устраивает? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 14:18 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, В OnClose, либо поменяй местами except и finally, либо совсем убери finally. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 14:25 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Zelius Док, странно, что вопрос возник, а чем классика VCL не устраивает? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Да все так. Весь вопрос собственно сводится к использованию. Вариант 1й: MyObject.XMLDocument.DoSome(); в этом случае XMLDocument принадлежит обьекту/классу, который и должен его создавать/разрушать. И собственно сеттера в этом случае не нужно - можно обойтись конструктором/деструктором Вариант 2й: MyObject.XMLDocument := NewXMLDocument; MyObject.XMLDocument.DoSome(); Во втором варианте сеттер уже нужен (в общем случае), но вот FreeAndNil() уже становится проблематичным, т.к. только автор знает, нужно ли обнуливать документ, который уже был до этого - класс об этом не знает ни разу и вполне можно занулить используемый где-то (потом) компонент - по факту в класс попадает ссылка на что-то извне и отследить ее использование - уже на совести автора. Поэтому наверное наиболее правильным решением будет делать копию того, что пришло извне через Assign(), если возможно или использовать интерфейсы, как уже советовали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 15:07 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док вроде так работает Код: pascal 1. 2. 3. 4. 5. 6. Код: pascal 1. 2. 3. А дальше смотри сам. При соблюдении принципа Тараса БульбыЗа уничтожение объекта отвечает его создательжить сильно легче ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 19:02 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Zelius Док, странно, что вопрос возник, а чем классика VCL не устраивает? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. А если этот Value ещё где-нибудь используется? А ты потом ещё другой этому свойству назначишь?.. И да, классика - это через .Assign(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 19:23 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
alekcvp И да, классика - это через .Assign(). "Ну нету у меня, мужик, холодильника!" (с) Нет такого метода у этого класса. Zelius Док, странно, что вопрос возник, а чем классика VCL не устраивает? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. я про него просто не знал. Попробую и так. Kazantsev Alexey, ага, вижу. To @All , если учесть, что я пока не стремлюсь к универсально правильному коду, то в ситуации, когда XMLDoc один раз создается(в OnCreate) и один раз разрушается (в OnClose) главной формы, хотелось бы услышать советы в контексте данного условия. Далее по коду у меня в основном идут проверки существования XMLDoc при передаче его в функции. И да, любое его безусловное уничтожение обязательно тет же сопровождается его созданием и инициализацией, типа Код: pascal 1. 2. 3. 4. 5. 6. 7. Единственное неудобство проперти в том, что для компилятора оно - константа, поэтому для манипуляций с ним либо приходится передавать его по ссылке в процедуру, либо городить лишнюю переменную ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2020, 23:11 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док XMLDoc один раз создается(в OnCreate) и один раз разрушается (в OnClose) главной формы, хотелось бы услышать советы в контексте данного условия. Код: pascal 1. Док Далее по коду у меня в основном идут проверки существования XMLDoc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2020, 19:01 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док "Ну нету у меня, мужик, холодильника!" (с) Нет такого метода у этого класса. А CloneNode не подходит? Глубоко dom.pp не смотрел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2020, 19:52 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Зачем? Если объект всегда создается дурная привычка проверять на все возможные ошибки, даже их вероятность ничтожно мала. x1ca4064 А CloneNode не подходит? Глубоко dom.pp не смотрел. есть такой https://lazarus-ccr.sourceforge.io/docs/lazutils/laz2_dom/tdomnode.clonenode.html т.е. так будет корректно? Код: pascal 1. 2. 3. 4. 5. 6. 7. Кстати, хотел уточнить Код: pascal 1. будет возвращать True, если оба аргумента равны nil? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2020, 23:32 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док т.е. так будет корректно? не-а, при попытке создать экземпляр XMLDoc получаю отлуп Project fb_util_wrapper raised exception class 'EDOMNotSupported' with message: EDOMNotSupported in Cloning/importing of TXMLDocument is not supported In file 'laz2_dom.pas' at line 1345: raise EDOMNotSupported.Create(Format('Cloning/importing of %s is not supported', [ClassName])); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2020, 23:45 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док Док т.е. так будет корректно? не-а, при попытке создать экземпляр XMLDoc получаю отлуп Project fb_util_wrapper raised exception class 'EDOMNotSupported' with message: EDOMNotSupported in Cloning/importing of TXMLDocument is not supported In file 'laz2_dom.pas' at line 1345: raise EDOMNotSupported.Create(Format('Cloning/importing of %s is not supported', [ClassName])); Я что-то нигде не нашёл, что CloneNode само создаёт XMLDocument. Попробуй вместо FreeAndNil вызывать Clear (или что-там у него). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2020, 09:36 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
alekcvp Я что-то нигде не нашёл, что CloneNode само создаёт XMLDocument. Попробуй вместо FreeAndNil вызывать Clear (или что-там у него). У Лазарусовского XML нет ни Clear, ни Assign - только Free, только хардкор TextContent :) Короче, отказался я пока от этого. Перед созданием дочерней формы решил сохранять настройки формы-owner'а в файл, а после уничтожения дочки (которая меняет содержимое файла настроек) - опять грузить в хозяина настйроки из измененного файла. Слишком уж стремно где-то "потерять" ссылку на свойство и получить утечку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2020, 16:19 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док, А почему не пользуешься XMLPropStorage? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2020, 18:00 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, чет мне как-то не зашел он, функционал показался бедным, да и компонент кривой, КМК. Может я чего не понял. В любом случае, я решил использовать пакеты Laz2_DOM и иже с ним, тем более, что они понимают UTF8. Время будет, попробую еще JSON Tools ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2020, 18:45 |
|
||
|
Сеттер проперти
|
|||
|---|---|---|---|
|
#18+
Док чет мне как-то не зашел он, функционал показался бедным Свойства пишет/читает, и автоматически, и кастомно. Чего тебе ещё-то нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2020, 19:00 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037900]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
145ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 465ms |

| 0 / 0 |
