Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.107.241] |
|
Сообщ.
#1
,
|
|
|
Привет друзья! Недавно начал знакомство с delphi4php, и сразу появился вопрос. При работе с компонентами в run-time, иногда необходимо обратиться к какому - либо свойству компонента: caption, tag, и т.д., в Делфях пользовался кодом (Sender as TButton).Caption, существует ли альтернатива в delphi4php?
|
Сообщ.
#2
,
|
|
|
Вообще тут немного другая история, так же как в дельфи не получится Работа с компонентами в основном идет на строне клиента средствами javascript-ов. Например так:
//Обработчик события по клику на кнопку function bOKJSClick($sender, $params) { ?> //eCustomer - обычный Edit контрол. grCustomer - грид с данными из таблицы БД document.getElementById('eCustomer').value = grCustomer.getTableModel().getValue(1,grCustomer.getFocusedRow()); <?php } Всё это выполняется на стороне клиента, если же нужно что-то на стороне сервера сделать, то юзается примерно так: 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". |
Сообщ.
#3
,
|
|
|
на всякий случай
если имеется ввиду работа с Sender в php событиях то к ним можно просто обращаться: function Button1Click($sender, $params) { echo $sender->Caption; } |
Сообщ.
#4
,
|
|
|
Цитата echo $sender->Caption; Не выводит абсолютно ничего. Немного не понятна мне конструкция, а есть ли способ перебрать компоненты? Нечто типа этого: function Button1Click($sender, $params) { for ($i=0; $this->ComponentCount-1; $i++) { if ($this->Components[$i]->Name == $params[0]) { echo $this->Components[$i]->Caption; } } } |
Сообщ.
#5
,
|
|
|
Цитата capirurso @ Если это написать в событии кнопки то работает. Не выводит абсолютно ничего. Цитата capirurso @ цикл немного переписать нужноНечто типа этого: for ($i=0; $i < $this->ComponentCount; $i++) { echo $this->Components->items[$i]->Name; } |
Сообщ.
#6
,
|
|
|
Цитата Monstre @ Вообще тут немного другая история, так же как в дельфи не получится Работа с компонентами в основном идет на строне клиента средствами javascript-ов. что значит не получится почему это в основном только на javascript ? ты разберись сначала потом пиши твои примеры с гридом это частный случай в большинстве же случаев, а тем более без ajax, всё прекрасно работает на сервере function Button1Click($sender, $params) { $this->Button1->Caption = 'Это сработало на сервере, несмотря на то что ты в help не заглядывал'; } идеология простая - всё что нужно что бы сработало на сервере - пишеш на php - всё что нужно что бы сработало на клиенте - пишеш на javascript - если нужно что бы сработало на клиенте, но использовало данные кода выполненного на сервере, то пишеш на php, генерируя по ходу Javascript - события php срабатывают на сервере - события javascript при формировании страницы генерируются (из смеси кода на php и javascript) в законченные события javascript и далее выполняются на клиенте - ajax работает как и должен работать ajax: посредством javascript выполняется код на сервере и возвращает в браузер результат без полного перечитывания страницы Ты посмотри примеры, их там масса и большинство вопросов отпадёт только перепиши их куда нибудь в c:\Sample например, во избежание проблем с запуском |
Сообщ.
#7
,
|
|
|
Цитата ViktorXP @ Цитата capirurso @ Если это написать в событии кнопки то работает. Не выводит абсолютно ничего. Цитата capirurso @ цикл немного переписать нужноНечто типа этого: 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] который возвращял имя айтема на который нажимаем 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]; } } } Всем спасибо. |
Сообщ.
#8
,
|
|
|
Цитата capirurso @ JT components это ты про эти http://www.jomitech.com/components4phpfree.php если так, то пример здесь http://www.jomitech.com/components4phpfull/samples/JTMenu/index.php а в коде страницы примера видим такую функцию (без циклов) 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."; } } |
Сообщ.
#9
,
|
|
|
Цитата что значит не получится почему это в основном только на javascript ? ты разберись сначала потом пиши твои примеры с гридом это частный случай в большинстве же случаев, а тем более без ajax, всё прекрасно работает на сервере Работает-то оно работает Лично мне такой подход не нравится, ведь по сути весь интерфейс (для создания и управления чего в основном и юзают Rad средства) находится на стороне клиента, а посему (имхо), и работать с его компонентами лучше через JS скрипты (и лишь в случае действительной надобности - обращаться к серверу, т.е. свести обмен с сервером к минимуму), чем через обмен с сервером или я не прав? |
Сообщ.
#10
,
|
|
|
Цитата Monstre @ или я не прав Не то что не прав. Просто для каждого конкретного случая это индивидуально. Тем более, что многие вещи на стороне клиента делать не следует из соображений безопасности, а многие просто не сделаеш на javascript. Я уж не говорю о том, что пользователь может в браузере вообще отключить js. Сообщения были разделены в тему "На лету обновлять множество компонентов" |