Предыстория:
Я просто привык обращаться к объектам по переменным ссылающимся на объекты напрямую. В ДС к сожалению такого нет, место этого там есть процедура c() которя возвращает ссылку на объект. По этому я решил немного поковырять и исправить сие положение вещей.
Плюсы моего метода:
1) Производительность. Посчитайте сколько раз в своих приложениях (а чем они больше тем хуже) вы обращаетесь к каким либо объектам вызывая при этом процедуру c() для того чтоб получить ссылку на объект? Даже если вы делаете так:
Это не решит проблемы. Представьте себе что это код некой ф-и, представьте что вы за время работы приложения вызываете её 10,000 раз? Значит c('richEdit1'); будет вызвана 10,000 раз!PHP код:$TextWindow = c('richEdit1');
$TextWindow->setFocus();
$TextWindow->selStart = $TextWindow->vGLength;
$TextWindow->bold = True;
$TextWindow->fontColor = 0x900000;
$TextWindow->selText = $Head;
$TextWindow->vGLength += StrLen($Head);
Да, есть ещё такая штука как:
Это частично решит проблему производительности, но только частично. Кроме того, представьте, вам это придётся писать в каждой ф-и! А если их 100, 200, больше?PHP код:STATIC $edit1;
If(!$edit1)
{
$edit1 = c('edit1');
}
А представьте ситуацию, когда у вас на форме 20 компонентов, а таких форм ещё 10?!
Вот вам простой код, который выводит информацию с двух форм на которых в общей сумме 14 компонентов.
Процедура c() была вызвана 14 раз. И будет вызываться по 14 раз каждый раз когда вы будете выполнять сей код!PHP код:AppendRTF('В 1 поле на форме 1 было', c('FirstForm->edit1')->text);
AppendRTF('В 2 поле на форме 1 было', c('FirstForm->edit2')->text);
AppendRTF('В 3 поле на форме 1 было', c('FirstForm->edit3')->text);
AppendRTF('На форме 1 чекбокс 1', c('FirstForm->checkbox1')->checked ? 'Отмечен' : 'Не отмечен');
AppendRTF('На форме 1 чекбокс 2', c('FirstForm->checkbox2')->checked ? 'Отмечен' : 'Не отмечен');
AppendRTF('На форме 1 чекбокс 3', c('FirstForm->checkbox3')->checked ? 'Отмечен' : 'Не отмечен');
AppendRTF('На форме 1 в комбобоксе 1', c('FirstForm->combobox1')->inText);
AppendRTF('На форме 1 в комбобоксе 2', c('FirstForm->combobox2')->inText);
AppendRTF('В 1 поле на форме 2 было', c('SecondForm->edit1')->text);
AppendRTF('В 2 поле на форме 2 было', c('SecondForm->edit2')->text);
AppendRTF('В 3 поле на форме 2 было', c('SecondForm->edit3')->text);
AppendRTF('На форме 2 чекбокс 1', c('SecondForm->checkbox1')->checked ? 'Отмечен' : 'Не отмечен');
AppendRTF('На форме 2 чекбокс 2', c('SecondForm->checkbox2')->checked ? 'Отмечен' : 'Не отмечен');
AppendRTF('На форме 2 чекбокс 3', c('SecondForm->checkbox3')->checked ? 'Отмечен' : 'Не отмечен');
Само по себе вызов пустой процедуры это уже затраты вычислительной мощности процессора, а ведь эта процедура ещё и какой то полезный код выполняет по поиску и выдачи вам нужной ссылки на объект.
2) Удобность. Тут конечно каждому своё, но лично мне начинать каждый кусок кода, каждую процедуру кодом вида:
для каждого компонента который я буду юзать - не фига не кажется удобным. Я привык что ко всем дочерним компонетам формы можно обратиться напрямую по сылке с формы.PHP код:$TextWindow = c('richEdit1');
$OutFormat = c('combobox1');
$Compression = c('combobox2');
......
Результат:
---------------------------------------------------------------------------------------------------------------------
Немного подумав, я написал небольшое расширение для ds.
Вот этот вот vGHook..rar файл достаточно положить в папку scripts в папке с проектом и вуаля что мы имеем:
Каждая ваша форма которую вы создали будет зарегистрирована в глобальных переменных с тем именем которое вы ей дали, будь то стандартное Form1 или MyMegaForm.
Вам в своих процедурах и событиях достаточно один раз в самом верху написать:
GLOBAL $Form1;
Или место Form1 то как вы её обозвали и все компоненты с формы которые на ней находятся будут вам доступны по их именам.
Например если положить на форму 2 текстовых поля edit1 и edit2 то обратиться к их свойству текст можно так:
Всё!PHP код:$Form1->edit1->text = 'ля ля ля';
$Form1->edit2->text = 'ля ля ля';
Более полный пример смотрите в приложенном файле демо проекта: demo..dvs
Весь код восновном на SecondForm в ф-и AppendRTF и под кнопкой "Получить результат заполнения полей"
Я не буду объяснять подробности оптимизации производительности, просто скажу что мой класс гарантирует что при его использовании вызов процедуры получения ссылки на объект будет производиться только 1 раз за время работы программы. Всё остальное время вы будете работать с готовой ссылкой как с обычной переменной или свойством.
---------------------------------------------------------------------------------------------------------------------
Класс: vGHook..rar (обновлён обновления в связи с этим постом)
Демо: demo..dvs



Ответить с цитированием
