На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА
Прежде чем задать вопрос, зайдите в раздел FAQ, возможно там уже есть ответ на него.
Если вы хотите вставить код в сообщение, то пожалуйста выделяйте его тегом [code=dfp] ... [/сode].
Для этого используйте кнопку [code=dfp] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Delphi for PHP.
Модераторы: ViktorXP, vicis
  
> Sender
    Привет друзья! Недавно начал знакомство с delphi4php, и сразу появился вопрос. При работе с компонентами в run-time, иногда необходимо обратиться к какому - либо свойству компонента: caption, tag, и т.д., в Делфях пользовался кодом (Sender as TButton).Caption, существует ли альтернатива в delphi4php?
      Вообще тут немного другая история, так же как в дельфи не получится :) Работа с компонентами в основном идет на строне клиента средствами javascript-ов. Например так:
      ExpandedWrap disabled
            //Обработчик события по клику на кнопку
            function bOKJSClick($sender, $params)
            {
                ?>
                //eCustomer - обычный Edit контрол. grCustomer - грид с данными из таблицы БД
                document.getElementById('eCustomer').value = grCustomer.getTableModel().getValue(1,grCustomer.getFocusedRow());
                <?php
            }


      Всё это выполняется на стороне клиента, если же нужно что-то на стороне сервера сделать, то юзается примерно так:
      ExpandedWrap disabled
            function DBGrid1JSDblClick($sender, $params)
            {
                ?> //здесь JScript
                //params передается на сторону сервера. можно передавать массив переменных
                params = 'field1=123';
                <?php
                //здесь PHP
                //формирование запрос через Ajax  
                echo $this->DBGrid1->ajaxCall("SetFilterD");
            }
         
           function SetFilterD($sender, $params)
           {
              //функция выполняется на стороне сервера (здесь устанавливается фильтр, значение которого передано в переменной $params
              $this->tabDetails->Filter = $params;
              $this->tabDetails->refresh();
           }


      На форме обязательно должна быть включена поддержка Ajax в своействе "UseAjax".
        на всякий случай
        если имеется ввиду работа с Sender в php событиях то к ним можно просто обращаться:
        ExpandedWrap disabled
          function Button1Click($sender, $params)
          {
            echo $sender->Caption;
          }
        В php нет строгой типизации, поэтому приводить к типам не надо.
          Цитата
          echo $sender->Caption;

          Не выводит абсолютно ничего.

          Немного не понятна мне конструкция, а есть ли способ перебрать компоненты? Нечто типа этого:
          ExpandedWrap disabled
            function Button1Click($sender, $params)
            {
             for ($i=0; $this->ComponentCount-1; $i++)
             {
              if ($this->Components[$i]->Name == $params[0])
              {
               echo $this->Components[$i]->Caption;
              }
             }
            }
          Сообщение отредактировано: ViktorXP -
            Цитата capirurso @
            Не выводит абсолютно ничего.
            Если это написать в событии кнопки то работает.
            Цитата capirurso @
            Нечто типа этого:
            цикл немного переписать нужно
            ExpandedWrap disabled
                    for ($i=0; $i < $this->ComponentCount; $i++)
                    {
                      echo  $this->Components->items[$i]->Name;
                    }
              Цитата Monstre @
              Вообще тут немного другая история, так же как в дельфи не получится Работа с компонентами в основном идет на строне клиента средствами javascript-ов.

              что значит не получится <_<
              почему это в основном только на javascript ?
              ты разберись сначала потом пиши
              твои примеры с гридом это частный случай
              в большинстве же случаев, а тем более без ajax, всё прекрасно работает на сервере

              ExpandedWrap disabled
                function Button1Click($sender, $params)
                {
                  $this->Button1->Caption = 'Это сработало на сервере, несмотря на то что ты в help не заглядывал';
                }


              идеология простая
              - всё что нужно что бы сработало на сервере - пишеш на php
              - всё что нужно что бы сработало на клиенте - пишеш на javascript
              - если нужно что бы сработало на клиенте, но использовало данные кода выполненного на сервере, то пишеш на php, генерируя по ходу Javascript
              - события php срабатывают на сервере
              - события javascript при формировании страницы генерируются (из смеси кода на php и javascript) в законченные события javascript и далее выполняются на клиенте
              - ajax работает как и должен работать ajax: посредством javascript выполняется код на сервере и возвращает в браузер результат без полного перечитывания страницы

              Ты посмотри примеры, их там масса и большинство вопросов отпадёт
              только перепиши их куда нибудь в c:\Sample например, во избежание проблем с запуском
                Цитата ViktorXP @
                Цитата capirurso @
                Не выводит абсолютно ничего.
                Если это написать в событии кнопки то работает.
                Цитата capirurso @
                Нечто типа этого:
                цикл немного переписать нужно
                ExpandedWrap disabled
                        for ($i=0; $i < $this->ComponentCount; $i++)
                        {
                          echo  $this->Components->items[$i]->Name;
                        }

                Спасибо огромное разобрался, не выводилось через $sender->Caption, потому что компонент нечто подобное popup-меню, и имен у айтемов как-бы нет, до меня, позже дошло, и данные хранятся в Array of Array Of String, проблему решил перебором, и сравнению с именем айтема в массиве.

                Если кому-нибудь нужен будет код, чтобы узнать caption нажатого айтема в меню из библиотеки JT components:
                $MenuPrefix - Имя компонента меню
                $ItemsArrayOfArray - Айтемы этого меню, в моем случае имена хранились как 1, 2, 3, 4...
                $param - $param[0] который возвращял имя айтема на который нажимаем
                ExpandedWrap disabled
                  function GetItemCaption($MenuPrefix, $ItemsArrayOfArray, $param)
                  {
                    for ($i=0; $i < count($ItemsArrayOfArray); $i++)
                    {
                      $item = $MenuPrefix .$ItemsArrayOfArray[$i][0] .'_tdc';
                      if ($item == $param)
                      {
                        return $ItemsArrayOfArray[$i][1];
                      }
                    }
                  }


                Всем спасибо.
                  Цитата capirurso @
                  JT components

                  это ты про эти http://www.jomitech.com/components4phpfree.php

                  если так, то пример здесь http://www.jomitech.com/components4phpfull/samples/JTMenu/index.php
                  а в коде страницы примера видим такую функцию (без циклов)
                  ExpandedWrap disabled
                    function JTMenu1JSClick( event )
                    {
                        var event = event || window.event;
                        var params = new Array( getEventTarget( event ).id );
                        // The following JavaScript variables are available inside this event
                        // handler:
                        //
                        // event: Event, The event object returned by the browser.
                        // params: Array, Contains a single item: the combined name of the menu and menu item
                     
                        // To get the name of the menu and menu item, split the combined name on the underscore:
                        var pieces = params[0].split("_");
                        var menuName = pieces[0];
                        var menuItemName = pieces[1];
                     
                        // Now that we have the menu item name, we can take appropriate action:
                        if (menuItemName == "JTMenuItem1") {
                            // If the first item is clicked, we set a label to some text.
                            findObj("Label3").innerHTML = "You clicked the first item.";
                        }
                        else if (menuItemName == "JTMenuItem2") {
                            // If the second item is clicked, we show a message.
                            alert("You clicked the second item.");
                        }
                        else if (menuItemName == "JTMenuItem3") {
                            // If the third item is clicked, we set a label to some text.
                            findObj("Label3").innerHTML = "You clicked the third item.";
                        }
                        else if (menuItemName == "JTMenuItem4") {
                            // If the fourth item is clicked, we set a label to some text.
                            findObj("Label3").innerHTML = "You clicked the fourth item.";
                        }
                     
                    }
                  Сообщение отредактировано: vicis -
                    Цитата
                    что значит не получится <_<
                    почему это в основном только на javascript ?
                    ты разберись сначала потом пиши
                    твои примеры с гридом это частный случай
                    в большинстве же случаев, а тем более без ajax, всё прекрасно работает на сервере

                    Работает-то оно работает :) Лично мне такой подход не нравится, ведь по сути весь интерфейс (для создания и управления чего в основном и юзают Rad средства) находится на стороне клиента, а посему (имхо), и работать с его компонентами лучше через JS скрипты (и лишь в случае действительной надобности - обращаться к серверу, т.е. свести обмен с сервером к минимуму), чем через обмен с сервером или я не прав? :)
                      Цитата Monstre @
                      или я не прав

                      Не то что не прав.
                      Просто для каждого конкретного случая это индивидуально.
                      Тем более, что многие вещи на стороне клиента делать не следует из соображений безопасности,
                      а многие просто не сделаеш на javascript.
                      Я уж не говорю о том, что пользователь может в браузере вообще отключить js.

                      Сообщения были разделены в тему "На лету обновлять множество компонентов"
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0458 ]   [ 15 queries used ]   [ Generated: 27.04.24, 17:27 GMT ]