+ Ответить в теме
Показано с 1 по 11 из 11
  1. #1
    Мастер Аватар для kazer_xxx
    Регистрация
    08.01.2011
    Адрес
    Копейск
    Сообщений
    1,148

    "Динамическое" onMouseDown и onMouseUp

    При динамическом добавлении действий( а именно, onMouseUp и onMouseDown) вылазит ошибка, которая ругается на запятую, которой там тооочно нет. Вот например код создания изображения и кнопки, который не хочет работать:
    PHP код:
    $btn = new TMImagec("Form1"));
    $btn->parent c("Form1");
    $btn->loadFromFile("C:\\2011-09-15_222858.png");
    $btn->$btn->300;
    $btn->onMouseDown "";
    $btn->onMouseUp "";
    $btn->$btn->0;
    $btn1 = new TBitBtnc("Form1"));
    $btn1->parent c("Form1");
    $btn1->onMouseDown 'echo "lol";'
    Как хочу быть красненьким и с надписью "Админ"

  2. #2
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    PHP код:
    function lol()
    {
            
    alert('lol');
    }
    $btn = new TMImagec("Form1"));
    $btn->parent c("Form1");
    $btn->loadFromFile("noavatar1.png");
    $btn->$btn->300;
    $btn->onMouseDown "lol";
    $btn->onMouseUp "lol";
    $btn->$btn->0;
    $btn1 = new TBitBtnc("Form1"));
    $btn1->parent c("Form1");
    $btn1->onMouseDown 'lol'
    Использовать полноценный php код не реккомендую, студия ожидает от вас название ф-и чтоб передать ей дополнительные параметры в аргументах ф-и такие как ObjectID key и т.д.
    а когда она получает "не понятный код" она не знает что с ним делать и получается фигня вобщем.

    Вот, попробуйте заменить код процедуры лол:

    PHP код:
    function lol()
    {
            
    pre(func_get_args());

    Оттуда и берётся запятая т.к. DS берёт то что вы передали тут:
    $btn1->onMouseDown = 'lol';
    и добавляет к этому:
    $self->onMouseDown .= '($oid, $key, чёта ещё);' а потом пытается эту строку eval($self->onMouseDown);
    В итоге если вы туда записали echo "lol" то получится:
    echo "lol";($oid, $key, чёта ещё); - а этот код не получится скомпилировать т.к. это ошибка.
    А если там было название вашей процедуры то всё было бы нормально:
    lol($oid, $key, чёта ещё);
    Последний раз редактировалось vGhost; 18.09.2011 в 12:50.

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

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

    WxMaper (18.09.2011)

  4. #3
    Мастер Аватар для kazer_xxx
    Регистрация
    08.01.2011
    Адрес
    Копейск
    Сообщений
    1,148
    Цитата Сообщение от vGhost Посмотреть сообщение
    PHP код:
    function lol()
    {
            
    alert('lol');
    }
    $btn = new TMImagec("Form1"));
    $btn->parent c("Form1");
    $btn->loadFromFile("noavatar1.png");
    $btn->$btn->300;
    $btn->onMouseDown "lol";
    $btn->onMouseUp "lol";
    $btn->$btn->0;
    $btn1 = new TBitBtnc("Form1"));
    $btn1->parent c("Form1");
    $btn1->onMouseDown 'lol'
    Использовать полноценный php код не реккомендую, студия ожидает от вас название ф-и чтоб передать ей дополнительные параметры в аргументах ф-и такие как ObjectID key и т.д.
    а когда она получает "не понятный код" она не знает что с ним делать и получается фигня вобщем.
    А мне именно надо было передать параметp на функцию
    Как хочу быть красненьким и с надписью "Админ"

  5. #4
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    я дополнил свой предыдущий ответ


    Цитата Сообщение от kazer_xxx Посмотреть сообщение
    А мне именно надо было передать параметp на функцию
    Я вам посоветовал бы записать этот параметр куда нибудь. Я тоже сталкивался с такой необходимостью, но пока решения не нашёл, надо точно смотреть как создаётся в DS код события чтоб "подстроиться" под него(там на самом деле не всё так просто как я написал выше). Но я вышел из положения другим путём.

    код у меня был такой:

    PHP код:
        set_event($ConfigEditor->HideNoExecute->self,                'OnClick',        'OnClickCEAllCB');
        
    set_event($ConfigEditor->HideCubicFiles->self,                'OnClick',        'OnClickCEAllCB');
        
    set_event($ConfigEditor->HideSizeNoChange->self,            'OnClick',        'OnClickCEAllCB');
        
    set_event($ConfigEditor->HideSizeChange->self,                'OnClick',        'OnClickCEAllCB');
        
    set_event($ConfigEditor->HideCompressionNotChange->self,    'OnClick',        'OnClickCEAllCB');
    ......

    Function 
    OnClickCEAllCB($oid)
    {
        GLOBAL 
    $ConfigEditor;
        
        
    $obj c($oid);
        SWITCH(
    $obj->name)
        {
            Case 
    'HideCubicFiles':
            Case 
    'HideNoExecute':
                
    OnShowConfigEditor(FalseTrueFalse);
                Break;
            
            Case 
    'HideSizeNoChange':
                If(
    $obj->checked && $ConfigEditor->HideSizeChange->checked)
                {
                    
    $ConfigEditor->HideSizeChange->checked False;
                    Return;
                }
                
    OnShowConfigEditor(FalseTrueFalse);
                Break;
    ....
        }


    Ещё можно например так:

    PHP код:
    function lol($oid)
    {
            
    alert(c($oid)->MyOwnMegaParameterForLolFunc);
    }
    $btn = new TMImagec("Form1"));
    $btn->parent c("Form1");
    $btn->loadFromFile("noavatar1.png");
    $btn->$btn->300;
    $btn->onMouseDown "lol";
    $btn->onMouseUp "lol";
    $btn->MyOwnMegaParameterForLolFunc 234;
    $btn->$btn->0;
    $btn1 = new TBitBtnc("Form1"));
    $btn1->parent c("Form1");
    $btn1->onMouseDown 'lol';
    $btn1->MyOwnMegaParameterForLolFunc 777
    Последний раз редактировалось vGhost; 18.09.2011 в 13:38.

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

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

    kazer_xxx (20.09.2011)

  7. #5
    Мастер Аватар для kazer_xxx
    Регистрация
    08.01.2011
    Адрес
    Копейск
    Сообщений
    1,148
    Спасибо. Всё-таки решил динамически создавать функции...
    Как хочу быть красненьким и с надписью "Админ"

  8. #6
    Мастер Аватар для kazer_xxx
    Регистрация
    08.01.2011
    Адрес
    Копейск
    Сообщений
    1,148
    Придумал способ довольно извращенный, но рабочий. Решил работать с глобальными переменными.При фокусировке на определённом обьекте, в переменную будет заноситься параметр, например:
    PHP код:
    c("button1")->onMouseEnter 'global $but; $but=1;';
    c("button1")->onMouseDown 'lol';
    c("button2")->onMouseEnter 'global $but; $but=2;';
    c("button2")->onMouseDown 'lol'
    А функцию вынес в объект "Функция":
    PHP код:
    global $but;
    alert("lol".$but); 
    И вот так мы получаем вполне рабочую функцию.
    Как хочу быть красненьким и с надписью "Админ"

  9. #7
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Кошмарное решение в плане производительности и потребления системных ресурсов, честно. Лучше сделайте так как я писал выше, видимо вы не поняли примера, щас в виде проекта покажу в приложенном файле. Весь код находится в компоненте ф-я и событии "создание" у формы. Больше событий нету.
    Теоретически так можно вообще все события всех элементов формы обрабатывать одной процедурой, правда это совсем не будет логичным.

    З.Ы. у меня есть ещё одно более простое решение для объектно ориентированной модели работы с формами и свойствами, оно ещё проще, но в плане понимания "как работает" не для новичков. Могу показать если хотите, мне оно больше нравится (сама модель не "новость", так вобщем то с формами работают во всех языках, жаль что на ds разработчики решили сделать процедуральный стиль).
    Вложения
    Последний раз редактировалось vGhost; 25.09.2011 в 09:32.

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

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

    kazer_xxx (25.09.2011)

  11. #8
    Зачем столько извращений???

    PHP код:
    function lol($param){
    alert($param);

    потом так:

    PHP код:
    c("button1")->onClick 'lol("все что вашей дуще угодно");'
    или так:

    PHP код:
    $newparam 'все что вашей дуще угодно';
    c("button1")->onClick 'lol("'.$newparam.'");'
    lol..dvs

  12. #9
    Мастер Аватар для kazer_xxx
    Регистрация
    08.01.2011
    Адрес
    Копейск
    Сообщений
    1,148
    Цитата Сообщение от formatus Посмотреть сообщение
    Зачем столько извращений???
    Кэп? Смотрите на дату темы :
    18.09.2011 14:32
    Ещё до выхода ds3 с php5.3, а значит этот способ не подходит:
    PHP код:
    function lol($param){ 
    alert($param); 

    Цитата Сообщение от formatus Посмотреть сообщение
    потом так:
    Так и писалось, но речь была о событии onMouseDown и onMouseLeave
    PHP код:
    $btn1->onMouseDown 'echo "lol";'
    Третий способ тоже отметается.
    Как хочу быть красненьким и с надписью "Админ"

  13. #10
    а чем маусдаун отличается от клик? скачай мой пример, поменяй на то событие которое тебе нужно и проверь...
    просто у некоторых объектов может не быть события клик, но по сути то что в этом событии происходит работать будет.
    а что касается даты, люди которые ищут ответы на этот вопрос на форуме ничего кроме такого решения не найдут. Поэтому и написал.
    Последний раз редактировалось formatus; 19.01.2012 в 16:04.

  14. #11
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от formatus Посмотреть сообщение
    а чем маусдаун отличается от клик?
    А вот сделайте и узнаете чем отличается!

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

Ваши права

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