|
|
#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 |
|
Гость
|
напишу майкрасовту пожалуй, пускай чинят
|
|
|
|
|
|