Показать сообщение отдельно
Старый 13.02.2003, 14:30   #20  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Привет, Вась. Давно не виделись.
Мы, кстати, в ПРК вместе работали.
Единственное, что прошу учесть - я аналитик, а не программист. Так что возможны тупые ошибки. Ну это лирика...

Теперь к делу.
Была у меня мечта - на лету делать 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       tnTablemethodsNode;
    
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(sourcefalse);
    
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();

За это сообщение автора поблагодарили: Lemming (1).