Привет, Вась. Давно не виделись.
Мы, кстати, в ПРК вместе работали.
Единственное, что прошу учесть - я аналитик, а не программист. Так что возможны тупые ошибки.
Ну это лирика...
Теперь к делу.
Была у меня мечта - на лету делать Dialog, в него пихать мой любимый ListView и там его заполнять какими-то данными, рисовать контекстное меню и.т.д.
В коде ниже по нажатию на кнопку рисуется диалог, в него добавляется ListView и перегружается метод mouseDblClick. Делается так:
1. В форму Dialog добавляем метод с именем:
<MyFormControlName>_<OverloadedMethodName>
сигнатура метода должна совпадать с сигнатурой стандартного метода. (Все это описано выше в тексте, приведенным ART)
2. В Source метода пишем свой код (стоит его заранее отладить, это просто).
3. Сохраняем все это добро, компилируя без вывода в окно сообщений.
4. Создаем и инициализируем диалог
5. Включаем "режим" перегрузки методов контролов
6. Создаем свой контрол с именем <MyFormControlName>
7. Пускаем диалог
8. Удаляем свой метод
Это "топорный метод", неприемлемый для боевых условий по очевидным причинам (динамически изменяется форма Dialog). И когда у нас хотябы 70 юзеров запустят этот диалог (пусть даже с проверками на существование метода), может быть плохо. Решение я вижу в том, чтобы сделать "свою" форму диалога и добавить туда сразу методов, а потом просто манипулировать именем создаваемого контрола. Вот.
Код:
PHP код:
void clicked()
{
Dialog dlgTest;
FormRun fr;
FormDesign fd;
UtilElements ueTable;
TreeNode tnTable, methodsNode;
MemberFunction newMethod;
str source;
;
select firstonly ueTable
where ueTable.recordType == UtilElementType::Form
&& ueTable.name == 'Dialog';
tnTable = xUtilElements::getNodeInTree(ueTable);
methodsNode = tnTable.findChild('Methods');
methodsNode.AOTadd('MyListView_mouseDblClick');
newMethod = methodsNode.findChild('MyListView_mouseDblClick');
source = ' public int MyListView_mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)' +
' {' +
' int ret;' +
' FormListControl listView = element.controlCallingMethod();' +
' ; ' +
' ret = listView.mouseDblClick(_x, _y, _button, _Ctrl, _Shift); info("It works!");' +
' Return ret;' +
' }';
newMethod.AOTsetSource(source, false);
newMethod.AOTsave();
tnTable.AOTcompile(1);
tnTable.AOTsave();
dlgTest = new Dialog('TestDialog');
dlgTest.doInit();
fr = dlgTest.formRun();
fd = fr.design();
fr.controlMethodOverload(true);
fd.addControl(FormControlType::LISTVIEW, 'MyListView');
dlgTest.run();
newMethod.delete();
newMethod.AOTsave();
tnTable.AOTcompile(1);
tnTable.AOTsave();
}