![]() |
#1 |
Гость
|
Скопировать объект Form в Runtime
можно? как это сделать?
|
|
![]() |
#2 |
Боец
|
А подробнее?
|
|
![]() |
#3 |
Гость
|
Есть объект (экземпляр) класса Form. Необходимо сделать его копию.
|
|
![]() |
#4 |
Banned
|
Если даже и можно, то не стоит: опыт показывает, что можно легко спровоцировать утечки памяти и/или креш клиента.
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
![]() |
#5 |
Участник
|
Согласен с предыдущим оратором.
Но если очень хочеться: TreeNode.AOTDuplicate() P.S.: Расскажите. Зачем данная операция понадобилась вам? |
|
![]() |
#6 |
Ищущий знания...
|
Цитата:
Автору данной ветки, если я правильно понял, необходимо создать новый экземпляр класса Form, который был бы точно таким же (точной копией) другого экземпляра Form.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#7 |
Ищущий знания...
|
не знаю насколько корректен мой ответ, если что меня поправят
![]() скопировать экземпляр класса Form можно простым присвоение ему того экземпляра, который хотите скопировать. пример: X++: Form form; Form formCopy; ; form = classFactory.createClass(classNum(Form)); form.addDataSource('InventTable'); formCopy = form; form = null; info(formCopy.dataSource(1).name()); З.Ы. оговорюсь, возможно я ошибаюсь, буду очень признателен если меня поправят ![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#8 |
Участник
|
Не, не правда. Обе ссылочные переменные ссылаются на одну и туже область памяти. Просто в последствии переменная form получает ссылку "в никуда", а formCopy остается ссылаемой на прежний объект в памяти.
|
|
|
За это сообщение автора поблагодарили: lev (2). |
![]() |
#9 |
Ищущий знания...
|
Цитата:
Тогда прошу считать мой пример, как пример того, как делать не надо ![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#10 |
Участник
|
Для явного удаления объекта из памяти следует использовать метод finalize объекта.
|
|
![]() |
#11 |
Ищущий знания...
|
ага, попробовал - это действительно так. спасибо.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#12 |
Участник
|
Если так, то почему бы просто ещё раз не открыть ту же форму с тем же Args?
Последний раз редактировалось S.Kuskov; 24.11.2010 в 10:35. |
|
|
За это сообщение автора поблагодарили: Gustav (3). |
![]() |
#13 |
Ищущий знания...
|
Цитата:
хорошо бы если на этот вопрос ответил автор темы ![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#14 |
Moderator
|
Цитата:
X++: static void Job_CreateCopyForm(Args _args) { Args args; FormRun formRun; FormRun formRunCopy; FormDataSource fds; FormDataSource fdsCopy; QueryBuildRange qbr; RAssetTable rassetTable; RecId prevRecId = intMin(); // -2 147 483 648; Set setRecId = new Set(Types::Integer); int i; ; // генерируем строку критерия по RecId (10 первых значений из таблицы) for (i=1;i<=10;i++) { select firstonly rassetTable order by RecId where rassetTable.RecId > prevRecId; prevRecId = rassetTable.RecId; setRecId.add(prevRecId); } // запускаем первую форму - основную args = new Args(formstr(RAssetTable)); formRun = classFactory.formRunClass(args); formRun.init(); formRun.design().caption(strFmt('ПЕРВАЯ ФОРМА: %1',formRun.design().caption())); formRun.design().visible(false); formRun.run(); // фильтруем и сортируем записи fds = formRun.dataSource('RAssetTable'); qbr = fds.queryRun().query().dataSourceNo(1).addRange(fieldNum(RAssetTable,RecId)); qbr.value(strRem(setRecId.toString(),'{ }')); fds.queryRun().query().dataSourceNo(1).addSortField(fieldNum(RAssetTable,AccountNum),SortOrder::Descending); fds.research(); // отображаем первую форму formRun.design().visible(true); // запускаем вторую форму - "копию первой" formRunCopy = classFactory.formRunClass(formRun.args()); formRunCopy.init(); formRunCopy.design().caption(strFmt('КОПИЯ - ВТОРАЯ ФОРМА: %1',formRunCopy.design().caption())); formRunCopy.design().visible(false); formRunCopy.run(); // "копируем" текущий фильтр и сортировку первой формы во вторую fdsCopy = formRunCopy.dataSource('RAssetTable'); fdsCopy.queryRun(fds.queryRun()); fdsCopy.research(); // отображаем вторую форму formRunCopy.design().visible(true); formRunCopy.wait(); formRun.wait(); } |
|
![]() |
#15 |
Гость
|
Цитата:
Вообще я пытаюсь добавить датасорс на форму в рантайме, но почему-то аксапта падает от этого или выдает странные ошибки рантайма. Поиском нашел эту тему Динамическое создание DataSource на форме, и добавление элементов дизайна., но это работает не всегда. |
|
![]() |
#16 |
Участник
|
Вы уверены что вашу задачу следует решать в Аксапте? Во что вы хотите превратить систему? Может быть раскажите что вы создаёте?
|
|
![]() |
#17 |
Гость
|
Хочу добавлять поля на формы динамически (с помощью настройки). Поля из связанной таблицы.
Вроде бы с помощью FormBuild* классов все просто сделать, но возникают непонятные ошибки или аксапта валится. Причем по-видимому проблема только с FormBuildDataSource. Кнопки/поля без проблем добавляются и все работает. |
|
![]() |
#18 |
Участник
|
Цитата:
Хотя не нужно, не отвечайте. Чуствую я, что вы уже в таки дебри залезли. Я туда не хочу ![]() ![]() |
|
![]() |
#19 |
Гость
|
напишу майкрасовту пожалуй, пускай чинят
|
|
|
|