+ Ответить в теме
Показано с 1 по 20 из 20
  1. #1
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033

    Альтернативный способ обращения к компонентам (альтернатива процедуре с('...')->... )

    Предыстория:
    Я просто привык обращаться к объектам по переменным ссылающимся на объекты напрямую. В ДС к сожалению такого нет, место этого там есть процедура c() которя возвращает ссылку на объект. По этому я решил немного поковырять и исправить сие положение вещей.

    Плюсы моего метода:
    1) Производительность. Посчитайте сколько раз в своих приложениях (а чем они больше тем хуже) вы обращаетесь к каким либо объектам вызывая при этом процедуру c() для того чтоб получить ссылку на объект? Даже если вы делаете так:
    PHP код:
    $TextWindow c('richEdit1');

    $TextWindow->setFocus();
    $TextWindow->selStart    $TextWindow->vGLength;
    $TextWindow->bold        True;
    $TextWindow->fontColor   0x900000;
    $TextWindow->selText     $Head;
    $TextWindow->vGLength   += StrLen($Head); 
    Это не решит проблемы. Представьте себе что это код некой ф-и, представьте что вы за время работы приложения вызываете её 10,000 раз? Значит c('richEdit1'); будет вызвана 10,000 раз!

    Да, есть ещё такая штука как:
    PHP код:
    STATIC $edit1;
    If(!
    $edit1)
    {
        
    $edit1 c('edit1');

    Это частично решит проблему производительности, но только частично. Кроме того, представьте, вам это придётся писать в каждой ф-и! А если их 100, 200, больше?

    А представьте ситуацию, когда у вас на форме 20 компонентов, а таких форм ещё 10?!
    Вот вам простой код, который выводит информацию с двух форм на которых в общей сумме 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 'Отмечен' 'Не отмечен'); 
    Процедура c() была вызвана 14 раз. И будет вызываться по 14 раз каждый раз когда вы будете выполнять сей код!
    Само по себе вызов пустой процедуры это уже затраты вычислительной мощности процессора, а ведь эта процедура ещё и какой то полезный код выполняет по поиску и выдачи вам нужной ссылки на объект.


    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
    Последний раз редактировалось vGhost; 08.09.2011 в 01:20.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  2. 7 пользователя(ей) сказали cпасибо:

    flocker (07.09.2011), Inlife (07.09.2011), noRoman (07.09.2011), rasend (14.09.2011), roxblnfk (08.09.2011), Simple (08.09.2011), WxMaper (08.09.2011)

  3. #2
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    раза в три быстрее. Примерно. Спасибо.
    Это если постоянно получать текст из edit и записывать обратно

    зы Devel-у на заметку
    Последний раз редактировалось noRoman; 07.09.2011 в 20:54.
    PS Я хороший программист потому что читаю это!

  4. #3
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Вообще, если честно, для меня производительность была побочным фактором :-d
    Мене больше всего не нравилось постоянно писать такое:
    PHP код:
    $TextWindow c('richEdit1'); 
    $OutFormat c('combobox1'); 
    $Compression c('combobox2');

    $TextWindow->....
    $TextWindow->....
    $OutFormat->....
    .... 
    Куда удобней сразу обращаться к свойствам по именам объектов не присваивая их постоянно к каким то переменным.
    Т.е. вот так:
    PHP код:
    GLOBAL $FirstForm$SecondForm;

    // очищаем тест
    $SecondForm->TextWindow->text '';
    $SecondForm->TextWindow->vGLength 0;


    AppendRTF('В 1 поле на форме 1 было'$FirstForm->edit1->text);
    AppendRTF('В 2 поле на форме 1 было'$FirstForm->edit2->text);
    AppendRTF('В 3 поле на форме 1 было'$FirstForm->edit3->text);

    ну и т.д
    А если учесть что практически все новички обычно пишут так:
    PHP код:
    c("richEdit1")->setFocus();
    c("richEdit1")->selStart     $SecondForm->TextWindow->vGLength;
    c("richEdit1")->bold         True;
    c("richEdit1")->fontColor    0x900000;
    c("richEdit1")->selText      $Head;
    c("richEdit1")->vGLength    += StrLen($Head); 
    То будь в ds такой механизм что я привёл, по умолчанию, это совсем не было бы проблемой! Ибо написав вот так:

    PHP код:
    $Form1->richEdit1->setFocus();
    $Form1->richEdit1->selStart     $SecondForm->TextWindow->vGLength;
    $Form1->richEdit1->bold         True;
    $Form1->richEdit1->fontColor    0x900000;
    $Form1->richEdit1->selText      $Head;
    $Form1->richEdit1->vGLength    += StrLen($Head); 
    Они совершенно не потеряли бы в производительности!Более того, даже выйграли бы, при чём выйграли бы даже перед таким методом:
    PHP код:
    $TextWindow c('richEdit1'); 

    $TextWindow->setFocus(); 
    $TextWindow->selStart    $TextWindow->vGLength
    $TextWindow->bold        True
    $TextWindow->fontColor   0x900000
    $TextWindow->selText     $Head
    $TextWindow->vGLength   += StrLen($Head); 
    Выйграли бы из за отсутствия: $TextWindow = c('richEdit1');
    Последний раз редактировалось vGhost; 07.09.2011 в 21:20.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  5. #4
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    лень - двигатель прогресса!!! Это давно известно

    зы новичкам советую писать по-старому. Запутаетесь и не будет завершение кода работать.
    Последний раз редактировалось noRoman; 07.09.2011 в 21:24.
    PS Я хороший программист потому что читаю это!

  6. #5
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от noRoman Посмотреть сообщение
    Запутаетесь и не будет завершение кода работать.
    Это как? Можно примером? Не могу что то себе представить ситуацию чтоб это не работало.

    Класс сделан так что его подключение к проекту "ни к чему не обязывает", т.е. работать верно будут оба способа (старый/новый) одновременно.
    Последний раз редактировалось vGhost; 07.09.2011 в 21:36.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  7. #6
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    Цитата Сообщение от vGhost Посмотреть сообщение
    Это как? Можно примером? Не могу что то себе представить ситуацию чтоб это не работало.

    Класс сделан так что его подключение к проекту "ни к чему не обязывает", т.е. работать верно будут оба способа (старый/новый) одновременно.
    проблема не с классом, а с программистом-новичком
    PS Я хороший программист потому что читаю это!

  8. #7
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Я не об этом спросил, а про пример кода который может написать новичёк чтоб всё перестало работать. Потому что у меня чёта фантазия не позволяет придумать что надо сделать чтоб это не работало. Не имея примера такого кода я не смогу сделать "защиту от дурака" под такую ситуацию.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  9. #8
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    проблема в том, что при написании кода обычным способом новичкам помогает завершение кода (показывает методы и свойства объекта). С новым способом написания таких подсказок не будет. Будут путаться. Думать почему не работает, а окажется просто невнимательность. Почитайте раздел новичкам и увидите какие вопросы там задают. Особенно тяжело новичкам только вставших на путь ООП.
    PS Я хороший программист потому что читаю это!

  10. #9
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от noRoman Посмотреть сообщение
    проблема в том, что при написании кода обычным способом новичкам помогает завершение кода (показывает методы и свойства объекта).
    Ааа... Вот вы о чём, да, теперь всё понял про что вы. Это да, это проблема для новичков. Я то уже этим давно не пользуюсь, я вообще код не в студии пишу, а в EditPlus 3.
    А вообще, теоретически это можно реализовать и для этого метода, но мне кажется это только Devel может реализовать, если захочет конечно.
    Последний раз редактировалось vGhost; 07.09.2011 в 21:55.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  11. #10
    Мастер Аватар для noRoman
    Регистрация
    22.03.2010
    Адрес
    Новочебоксарск
    Сообщений
    757
    вот и написал ему "зы Devel-у на заметку"
    PS Я хороший программист потому что читаю это!

  12. #11
    Пользователь Аватар для Simple
    Регистрация
    31.07.2011
    Сообщений
    159
    Конечно умно... Но по моему, Devel уже говорил про подобную вещь в третей версии... Если я конечно не ошибаюсь.

  13. #12
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Ну, в таком случае, скажу что велосипеды изобретать мне не впервой :-d
    Или скажем так, это для 2.0.0.6 аналог :-p Типа бэкпорт из 3.0 версии, в версию 2.0.0.6.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  14. #13
    Пользователь Аватар для Simple
    Регистрация
    31.07.2011
    Сообщений
    159
    А вы до сих пор на 2.0.0.6? А как-же 2.0.0.9?

  15. #14
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    ещё, чтобы не писать везде global, можно сделать супер глобальную переменную
    global $Form1,$Form2;
    DSApi::reg_glVar('Form1');
    DSApi::reg_glVar('Form2');

  16. Пользователь сказал cпасибо:

    vGhost (08.09.2011)

  17. #15
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от Simple Посмотреть сообщение
    А вы до сих пор на 2.0.0.6? А как-же 2.0.0.9?
    Знаете анегдот такой:
    Подходит сын к отцу сисадмину:
    - Пап, а почему солнце по утрам встаёт, а по вечерам заходит?
    - Оно так каждый день происходит?
    - Да
    - Вот раз работает, то и не трогай!

    Если уж обновлять, то ради чего нибудь глобального! Так что я третью подожду.
    Кроме того, у меня не стандартная 2.0.0.6 а вот из этого поста: http://community.develstudio.ru/show...ull=1#post7402
    И я не знаю реализована ли в 2.0.0.9 эта (grid_colWidth) процедура. А поставить новую версию чтоб потом снова переустанавливать на старую чёта не хочется.
    А без grid_colWidth мне ну совсем никак!

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    ещё, чтобы не писать везде global, можно сделать супер глобальную переменную
    global $Form1,$Form2;
    DSApi::reg_glVar('Form1');
    DSApi::reg_glVar('Form2');
    Да можно. Но это не будет везде работать, например в ваших пхп файлах в которых будут ваши ф-ии оно не станет работать. А если учесть что я стандартным редактором кода студии практически не пользуюсь, то в моём случае оно нигде работать не будет, по этому я его не вставил, но вообще вы правы, хуже от этого не станет если добавить.

    Обновлённый файл vGHook..rar
    Последний раз редактировалось vGhost; 08.09.2011 в 00:51.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  18. Пользователь сказал cпасибо:

    WxMaper (08.09.2011)

  19. #16
    Круть! Спасибо

  20. #17
    Ученик
    Регистрация
    23.05.2010
    Адрес
    Минск
    Сообщений
    41
    нужно, спс)

  21. #18
    Цитата Сообщение от noRoman Посмотреть сообщение
    раза в три быстрее. Примерно. Спасибо.
    Это если постоянно получать текст из edit и записывать обратно

    зы Devel-у на заметку
    Собствено а что быстрее то?
    Мой сайт: www.SnAkE.uCoz.ua
    Форум: www.SnAkE.Gip-Gip.Ru

  22. #19
    Модератор Аватар для ily2811
    Регистрация
    11.04.2010
    Адрес
    Новороссийск
    Сообщений
    438
    Ох, круто молодец vGhost, но соглашусь: многим будеттрудновато если они начнут сразу с этим методом
    :/
    Код:
    #!/bin/bash
    Tr="Hello World!"
    echo $Tr

  23. #20
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от ily2811 Посмотреть сообщение
    Ох, круто
    Уже нет, это уже устарело..
    Есть вариант лучше, но я пока к нему никак не осилю себя написать инструкцию.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения