|  24.09.2009, 21:16 | #1 | 
| Участник | Динамическое добавление контролов на форму 
			
			Привет эксперты! Есть вопрос на засыпку. У меня задача динамически создавать и добавлять контролы на форму в зависимости от текущей записи на родительской форме (т.е. вызывать обновление в linkActve() дочерней формы) Родительская форма содержит инф-ю о том какие контролы должны быть добавлены на дочернюю форму (их имена и т.п.), т.е. заранее добавить контролы и прятать/показывать - не подходит. В дочерней форме уже добавлен dataSource и все динамические контролы должны связываться с ним и показывать значение полей текущей записи (которая связана с таблицей в родительской форме и также обновляется по linkActive() ). Теперь вопрос знатокам: Исходя из вышеописанного сценария, контролы добавляются уже после вызова init() в дочерней форме и соотв. formBuildControl-классы наследники уже использовать нельзя, а только обычные formControl-классы. При это возникается проблема - контролы теряют размер EDT, не показывают данные записи и т.п. Как это решить? Может я что-то упускаю? Буду очень БЛАГОДА за любые идеи! Последний раз редактировалось Gustav; 25.09.2009 в 09:29. Причина: "Баден-Баден"; текст сообщения был повторен дважды; удалил повтор | 
|  | 
|  24.09.2009, 22:27 | #2 | 
| Участник | Цитата: 2. вместо того, чтобы "создавать" лучше "удаляйте" контролы. создайте одну большую форму на все случаи жизни и просто скрывайте ненужные контролы. И будет вам щастье. Именно в таком подходе заключается "дао Аксапты". 3. (унылым голосом Иа-Иа) если же не хотите слушать, а хотите непременно "проложить свою колею", то посмотрите в форму tutorial_Form_AddControl | 
|  | |
| За это сообщение автора поблагодарили: sukhanchik (2), alex55 (1). | |
|  24.09.2009, 22:41 | #3 | 
| Боец | 
			
			1. Добавил в форму \Forms\tutorial_Form_AddControl датасорс InventTable 2. Модифицировал метод \Forms\tutorial_Form_AddControl\Designs\Design\[ButtonGroup:ButtonGroup]\Button:Button\Methods\clicked: X++: void clicked() { FormBuildDesign formBuilddesign = form.design(); FormBuildGroupControl formBuildGroupControl; FormStringControl c; ; c = addGroup.addControl(FormControlType::String,'RunTimeControl'); c.label("New control"); // DSPIC --> c.dataSource(InventTable_ds.id()); c.dataField(fieldnum(InventTable, ItemId)); c.displayLengthValue(10); InventTable_ds.executeQuery(); // DSPIC <-- formBuildGroupControl = formBuildDesign.control( addGroup.id() ); } См. также \Classes\SysTableBrowser | 
|  | 
|  24.09.2009, 22:48 | #4 | 
| Administrator | 
			
			Аксапта - такая система, в которой скажем так... разработчики ядра (ax32.exe) не соревнуются в плане качества поставляемых API (системных классов, таблиц и т.д.), т.е. какие-то вещи, которые с т.з. разработчика должны работать - могут не работать или иметь какие-то глюки. Это, кстати - говоря - не про Микрософт будет сказано - а про тех, кто это писал до Микрософта. Поэтому - какие-то (иногда кажущиеся очевидными) идеи технически нереализуемы и поэтому приходится менять постановку задачи. В Вашем случае - лучшим решением будет отказаться от решения Вашей задачи таким способом. "дао Аксапты" состоит в том, чтобы "посмотреть как это сделано в другом месте Аксапты и сделать по аналогии". Если какой-то прием в Аксапте не применяется - то и нечего его применять. С одной стороны есть риск нарваться на "особенности работы" ядра, с другой стороны - система вылезет из однообразия в интерфейсе для пользователя и других программистов - что усложнит жизнь всем. Конструктивно, по вопросу - "на лету" добавлять контрольки (т.е. не formBuild*-классами) - нельзя. Ну точнее - есть проблемы с привязкой к данным и т.д. В 3.0, я, поковырявшись с этим, похоронил эту идею. В 4.0 - может что-то и изменилось - но не думаю. В примере, указанном DSPIC контрол действительно добавляется... Но боюсь, что на linkActive такое может не сработать. Просто потому что linkActive. А SysTableBrowser не показатель - т.к. там контролы добавляются до вызова run(), т.е. через FormBuild*, а не через Form*-классы 
				__________________ Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 25.09.2009 в 00:13. | 
|  | 
|  25.09.2009, 08:49 | #5 | 
| Боец | Цитата: 
		
			Сообщение от sukhanchik
			   Аксапта - такая система, в которой скажем так... разработчики ядра (ax32.exe) не соревнуются в плане качества поставляемых API (системных классов, таблиц и т.д.), т.е. какие-то вещи, которые с т.з. разработчика должны работать - могут не работать или иметь какие-то глюки. Это, кстати - говоря - не про Микрософт будет сказано - а про тех, кто это писал до Микрософта. Поэтому - какие-то (иногда кажущиеся очевидными) идеи технически нереализуемы и поэтому приходится менять постановку задачи.  нифига не понял, это вы о чем? Цитата: Цитата: 
		
			Сообщение от sukhanchik
			   "дао Аксапты" состоит в том, чтобы "посмотреть как это сделано в другом месте Аксапты и сделать по аналогии". Если какой-то прием в Аксапте не применяется - то и нечего его применять. С одной стороны есть риск нарваться на "особенности работы" ядра, с другой стороны - система вылезет из однообразия в интерфейсе для пользователя и других программистов - что усложнит жизнь всем. Цитата: - Контролы добавлять можно, проблем с данными нет - я это показал - "поковырявшись с этим, похоронил эту идею" - возможно, вам не хватило навыков, ковыряясь в 3.0 ? В чем именно была проблема ? Цитата: потому что гладиолус (С)   | 
|  | 
|  25.09.2009, 10:51 | #6 | 
| Участник | Цитата:  Лично я похоронил потому что слишком много метапрогрограмминга, слишком тяжело такие решения сопровождать и апгрейдить. | 
|  | |
| За это сообщение автора поблагодарили: oip (1). | |
|  25.09.2009, 10:57 | #7 | 
| Axapta | Цитата:  +1 к словам mazzy и sukhanchik. Контролы надо не добавлять, а скрывать. | 
|  | 
|  25.09.2009, 11:26 | #8 | 
| Боец | 
			
			Да, высказывания sukhanchik'а в очередной раз не аргументированы, более того, противоречивые. Тем не менее, извините. Цитата: В общем, развернутое ТЗ в студию, после чего можно продолжить по существу. Последний раз редактировалось DSPIC; 25.09.2009 в 11:28. | 
|  | 
|  25.09.2009, 11:53 | #9 | 
| Участник | 
			
			Есть задачи, которые по другому кроме как динамическим добавлением контролов не реализуются. В Ax-e пока с таким не сталкивался. Но если будут, твёрдо утверждать что задача плохая и нужно пересматреть её реализацию или отказаться не буду. Пример. Давно была такая задача. Реализовывал на C++ Builder. Есть таблица в неё забиваються операции и время работы этих операций. Эти операции должны были появиться на сэнсорном экране в два столбца в виде кнопок с названиями этих операций. Форма на весь экран. На протяжении дня кнопки могли перераспределяться в зависимости от того сколько времени и обрабатываеться ли это операция в это время. Пришлось делать. Подобные задачи думаю и в аксе могут быть. Кликнул оператор склада одну из волшебных кнопок и наступило счастье, кликнул кнопку которая рядом счастье отсторнировалось. Если есть у человека время и желание зачем отговаривать. Я думаю что он уже понял, что нужно ещё раз подумать, а только потом приступать. 
				__________________ Энергия молодых и неравнодушных способна изменить мир к лучшему. | 
|  | 
|  25.09.2009, 19:40 | #10 | 
| Administrator | 
			
			За день моего отсутствия со стороны DSPIC столько возражений - что прям уж даже удивительно почему у него ко мне такое неравнодушие   Я думаю, что те люди, которые сталкиваются с программированием в Аксапте, придя из других систем - понимают о чем я писал. У Вас никогда не бывало такого, что Вы ожидаете от метода некий результат - а по факту он не соответствует Вашим ожиданиям? Чтобы не быть голословным - скажу, что на таблице есть методы validateField и validateWrite. Методы похожи по своему названию и предназначению. Но validateField только информирует пользователя о том что не прошла проверка, но при этом записывая в поле неверное значение, а validateWrite не дает обновить (добавить) запись, если проверка не прошла. Возможно - этот нюанс описан в документации (=> это не бага, а фича). Но для программиста, начинающего осваивать систему (коим скорее всего является автор ветки) - это как раз тот случай, когда ожидания не соответствуют реалиям. Цитата: Цитата: Цитата: Контролы добавлять технически можно. Это как с оповещениями в 4-ке - работают? Да. Маркетинг рекламирует. А то, что эта система ляжет, если повесить оповещения на InventTrans при относительно спокойной одновременной работе 15 пользователей с заказами - об этом нигде не говорится. Так и тут. Пример есть. Просто можно пойти своим путем, насобирав кучу граблей и глюков, а можно пойти проверенным путем (FormBuild*) и прийти к тому же результату - только без грабель. Т.е. что-то где-то не отобразится, что-то где-то не подтянется, EDT может некорректно подхватиться, форма будет тормозить с перерисовыванием и т.д. Я не знаю всего. В свое время я делал форму, в которой настройками в таблице задавалось - какие контролы нужно отображать. Помню - что в конечном счете я пришел к варианту показа скрытых контролов - иначе то ли чего-то вылетало толи еще чего-то. Но и то - форма тормозила и определенные визуальные "прыжки" иногда наблюдались. Вывод - так делать неправильно. Хотя и технически возможно. Цитата: Со своей стороны попрошу Вас, DSPIC - обосновать Ваше утверждение ссылками "Да, высказывания sukhanchik'а в очередной раз не аргументированы". А то иначе получается откровенный наезд (я бы даже это счел за оскорбление). 
				__________________ Возможно сделать все. Вопрос времени | 
|  | 
|  25.09.2009, 21:15 | #11 | 
| Боец | |
|  | 
|  27.09.2009, 03:21 | #12 | 
| Участник | 
			
			Всем отвещавшим огромное спасибо! Получил много полезной инф-ии для размышления. После всего вышеуслышенного, постараюсь пойти немного другим путём и всё таки следуя "дао Аксапты" создавать контролы до init() используя FormBuild-классы, а в методе active() родительской формы, проверять открыта ли дочерняя форма и если да, то закрывать и открывать её заново. Есть сомнения насчёт UI - мерцаний и т.п., но т.к. лучшего варианта похоже нет, то пользователю придётся смириться. Ещё раз большое спасибо за скорую помощь! | 
|  | 
|  28.09.2009, 16:34 | #13 | 
| Боец | |
|  | 
|  23.12.2009, 14:16 | #14 | 
| Участник | 
			
			вопрос, а реализуемо ли такое добавление контролов на web форме ? webForm.addControl - будет работать? | 
|  | 
|  28.02.2013, 07:05 | #15 | 
| Участник | 
			
			а как из класса динамически добавить контрл?
		 | 
|  | 
| Теги | 
| добавить, контрол, программно, форма | 
|  | 
| 
 |