
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.82] |
![]() |
|
![]() |
Сообщ.
#1
,
|
|
Запуска проекта на удаленном сервере
Когда вы закончите разрабатывать свой проект нужно сформировать рабочий проект Для этого в делфи есть «Deployment Wizard» (вызвать можно Tools-> Deployment Wizard или соответствующую кнопку в тулбаре) Мастер скопирует ваш проект в папку (которую вы ему укажите) и в ней папку vcl, в которой будут находится необходимые компоненты и файлы. Копируете это все на сервер с помощью ftp клиента. Заходим на сайт и смотрим результат. Бывает что мастер может не доложить какой-то файл. В этом случае его нужно поискать в vcl библиотеки %Program Files%\CodeGear\Delphi for PHP\2.0\vcl\ %Program Files%\Embarcadero\RadPHP\3.0\rpcl и положить в соответствующую папку в своем сформированном проекте. Для 3-й версии актуально не vcl, а папка rcpl Добавлено Проблема: Иногда возникает ошибка при использовании шаблона Smart Цитата Fatal error: Smarty error: the $compile_dir '/tmp' does not exist.... Решение: Открываем файл smartytemplate.inc.php Находим строчку ![]() ![]() $this->_smarty->compile_dir = '/tmp'; И указываем полный путь к темповой папке ![]() ![]() $this->_smarty->compile_dir = 'C:/WINDOWS/Temp'; //'C:/tmp' |
![]() |
Сообщ.
#2
,
|
|
Советы:
При создании шаблона в теле документа нужно незабыть указать три параметра {$HeaderCode} (В это месте будут формироватся JavaScript вставки), {$StartForm} и {$EndForm} (в этих местах будет вставлены теги начала и конца формы соответственно) Чтобы заставить обновится какойто контрол достаточно нажать по нему правой кнопкой мыши и вызвать control->repain или нажать Shift+Ctrl+F12 |
![]() |
Сообщ.
#3
,
|
|
Проблема:
При использовании DBGrida и Smarty с формы исчезает скрол. Решение: ![]() ![]() function Unit1JSLoad($sender, $params) { ?> //Add your javascript code here d.setOverflow("scroll"); <?php } |
![]() |
Сообщ.
#4
,
|
|
Тут есть процентное соотношение но подано слегка не стандартным для нас способом.
Каждай компонент-контейнер можно поделить виртуально сеткой на квадраты. Для этого в компонента есть свойства Layout.Cols и Layout.Rows Способ выравнивания определяется свойством Layout.Type После установки размера сетки растягиваем внутренний компонент на столько квадратов сколько нам нужно. Когда будет компнент-контейнер менятся то он будет автоматически менать размер и внутренних компонентов в соответствии занятых квадратов. |
![]() |
Сообщ.
#5
,
|
|
Проблема:
Как удалять из "Welcome Page" уже не существующие проекты? Решение: Записи о проектах лежат в реестре HKEY_CURRENT_USER\Software\CodeGear\Delphi for PHP\1.0\mru {в первой версии} HKEY_CURRENT_USER\Software\CodeGear\Delphi for PHP\2.0\mru {во второй версии} |
![]() |
Сообщ.
#6
,
|
|
Проблема:
В базу при помощи цикла записывал 100000 записей. При выполнении выдало ошибку ![]() ![]() Fatal error: Maximum execution time of 30 seconds exceeded in T:\home\localhost\ryterna\vcl\adodb\adodb.inc.php on line 831 Решение: В настройках по умолчанию стоит максимальное время выполнение скрипта 30 сикунд. изменить его можно в файл в php.ini.template. В секции "Resource Limits" есть параметр max_execution_time |
![]() |
Сообщ.
#7
,
|
|
Проблема:
Как изменить размер шрифта у ListView ? Решение: 1) ![]() ![]() function Button1JSClick($sender, $params) { ?> //Add your javascript code here document.getElementById('ListView1').style.font = "bold small-caps 12pt/14pt sans-serif"; // document.getElementById('ListView1').style.font = " 12pt/14pt sans-serif top"; <?php } ![]() ![]() document.all['ListView1'].style.left = 0; document.all['ListView1'].style.position = 'relative'; document.all['ListView1'].style.font = '20px verdana,arial,helvetica'; document.all['ListView1'].style.textAlign = 'right'; document.all['ListView1'].style['color'] = 'blue'; document.all['ListView1'].style['size'] = '18px'; document.all['ListView1'].style.fontSize = '22px'; |
![]() |
Сообщ.
#8
,
|
|
Проблема:
как узнать программно что страница/компонент отображается в редакторе форм Решение: ![]() ![]() if (($this->ControlState & csDesigning) != csDesigning) ... |
![]() |
Сообщ.
#9
,
|
|
Проблема:
Пустой проект выдает ошибку Цитата Warning: Unknown: Failed opening 'C:/Documents and Settings/User/Мои документы/Delphi for PHP Projects/unit1.php' for inclusion (include_path='.;C:\Program Files\Programming\Delphi for PHP 1.0\' ) in Unknown on line 0 Решение: Delphi for PHP не любит русские пути. Поэтому сохраняй проект в другом месте. Кроме этого стоит проверить что: - имя пользователя под которым Вы установили и используете Delphi For Php содержит только английские буквы и не содержит пробелов - после создания нового проекта сохраните его в папку, которая содержит только английские буквы и не содержит пробелов - если проект не запускается и находится на диске отличном от C: попробуйте сохранить его на диск C: |
![]() |
Сообщ.
#10
,
|
|
Проблема:
А каким образом без мышки можно перемещаться по элементам формы? Решение: 1) У каждого контрола, который имеет фокус, есть свойства TabOrder (параметр порядка предоставления фокуса), TabStop (Давать фокус по табу или нет) 2) Или можно решить это через JavaScript ![]() ![]() function Edit2JSKeyUp($sender, $params) { ?> //if (event.keyCode == 13|| event.keyCode == 9) if (event.keyCode == 40) // если нажата клавиша "стрелка вниз" { findObj("Edit1" ).focus(); } if (event.keyCode == 38) // если нажата клавиша "стрелка вверх" { findObj("Edit3").focus(); } <?php } |
![]() |
Сообщ.
#11
,
|
|
Проблема:
Какие настройки отвечают за кодировку? Решение: IDE/Tools/Options/Default Charset IDE/Tools/Options/Editor options/Text encoding Unit1->Encoding (Unit1 - это имя редактируемого модуля) |
![]() |
Сообщ.
#12
,
|
|
Проблема:
настройки Unit1->Encoding = Unicode (UTF-8) |utf-8 Unit2->Encoding = Unicode (UTF-8) |utf-8 IDE/Tools/Options/Default Charset = utf-8 (Language = "utf-8") IDE/Tools/Options/Editor options/Text encoding = utf-8 - ставим panel1 на форму unit1 - в инспекторе пишем panel1->caption = 'Тра-та-та' - ставим panel2 на форму unit2 - в инспекторе пишем panel2->include = unit1 видим в редакторе краказяблы а запускаем - нормально Решение: добавляется в модуль extctrls.inc.php две процедуры ![]() ![]() function get_include_contents($filename) { if (is_file($filename)) { ob_start(); include $filename; $contents = ob_get_contents(); ob_end_clean(); return $contents; } return false; } function GetANSI($str) { $charset = 'windows-1251'; $_encoding = mb_detect_encoding($str, "UTF-8, $charset"); if (strcasecmp($_encoding, 'UTF-8')==0) { return mb_convert_encoding($str, $charset, $_encoding); } else { return $str; } } Потом переписываем кусок ![]() ![]() if ($this->_include!="") { include($this->_include); } На ![]() ![]() if ($this->_include!="") { if (($this->ControlState & csDesigning) != csDesigning) { include($this->_include); } else { $string = get_include_contents($this->_include); echo GetANSI($string); } } тоесть когда код будет в дизайн тайме выводится то наша процедура будет его перекодировать в анси, а когда на сервере как сайт то будет выводится без переделки. |
![]() |
Сообщ.
#13
,
|
|
Проблема:
Как изменить кодировку файла? Решение: в окне редактирования тыкаеш правую кнопку мыши File Encoding с подпунктами. |
![]() |
Сообщ.
#14
,
|
|
Проблема:
Где ide хранить php.ini? Решение: Файл лежит тут: %Documents and Settings%\{user}\Application Data\CodeGear\Delphi for PHP\2.0\php\php.ini Но изменять его бесполезно так как среда его изменяет самостоятельно. Правильнее настройки вносить через саму ide. Если этого мало то тогда можно внести настройки в сам шаблон по которому среда формирует файл %Delphi for PHP%\2.0\php\php.ini.template |
![]() |
Сообщ.
#15
,
|
|
Проблема:
Хочу чтобы календать, находящийся в VCL, был по русски. Решение: В моделе comctrls.inc.php в класах MonthCalendar и DateTimePicker есть строка ![]() ![]() $this->_calendar = new DHTML_Calendar(VCL_HTTP_PATH."/jscalendar/", "en", 'calendar-win2k-2', false); Вот тут и меняй язык 'en' на 'ru' |
![]() |
Сообщ.
#16
,
|
|
Проблема:
Есть проблема с combobox. Не получалось программно определить текущее значение выбранного элемента. Решение: Можно воспользоватся такой функцией ![]() ![]() function GetComboSelectKey($Combo,$TypeValue=0) /* возвращает значение ключа(key) или текст выбранной записив Combobox $TypeValue=0 - key, =1 - текст*/ { if ($Combo->Count<1) return ''; $items=$Combo->Items; reset($items); while(list($key, $val)=each($items)) { if ($Combo->readSelected($key)) { if ($TypeValue==0) { return $key; } else { return $val; } } } } |
![]() |
Сообщ.
#17
,
|
|
Проблема:
Никак не пойму, какой метод или свойство у BDGrid содержит текущую выделенную строку и поле. Решение: ![]() ![]() document.getElementById('Edit1').value = DBGrid1.getTableModel().getValue(1, DBGrid1.getFocusedRow()) |
![]() |
Сообщ.
#18
,
|
|
Проблема:
Как центрировать форму с компонентами? Решение: выставляется параметр "Layout.Type" у формы отличающийся от "ABS_XY_LAYOUT"( например "XY_LAYOUT") и присваиваем свойству Alignment значение agCenter |
![]() |
Сообщ.
#19
,
|
|
Проблема:
DBGrid показывает все колонки, хотя в некоторых стоит свойство Visible=false Решение: 1) Открываем модуль dbgrids.inc.php и ищем там такой код: ![]() ![]() $dwidth=$value['Width']; $color=$value['Color']; $fontcolor=$value['FontColor']; $alignment=$value['Alignment']; $fname=$value['Fieldname']; $props=$this->_datasource->DataSet->readFieldProperties($fname); if ($props) { if (array_key_exists('displaywidth',$props)) { $dwidth=$props['displaywidth'][0]; } } echo " $this->Name.getTableColumnModel().setColumnWidth($i,$dwidth);\n"; Добавляем две строки перед или после той строки что я указал последней ![]() ![]() $_Visible=$value['Visible']; //Эту echo " $this->Name.getTableColumnModel().setColumnVisible($i,$_Visible);\n"; //и эту echo " $this->Name.getTableColumnModel().setColumnWidth($i,$dwidth);\n"; //Я поставил перед этой 2) Ну если вручную менять то можно так ![]() ![]() ?> DBGrid1.getTableColumnModel().setColumnWidth(1,50) // размер DBGrid1.getTableColumnModel().setColumnVisible(1, false) // видимость <?php Добавлено в компоненте нет свойства Visible для колонок поэтому там пока через JS ![]() ![]() ListViewBank.getTableColumnModel().setColumnVisible(0, false); |
![]() |
Сообщ.
#20
,
|
|
Проблема:
Где dbgrid хранит текстовые константы? (1 of 9 rows selected) Решение: в файле %Program Files%\CodeGear\Delphi for PHP\1.0\vcl\qooxdoo\framework\script\qx.js в масиве $=[....] лежит каждое слово по отдельности |
![]() |
Сообщ.
#21
,
|
|
Проблема:
Проект в кодировке windows-1251. Использую ajax. Вместо кириллицы получаю корокзяблы Решение: Открываем модуль xajax.inc.php и подправляем строку ![]() ![]() define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8'); // ставим нужную нам кодировку (в данном случаи windows-1251) |
![]() |
Сообщ.
#22
,
|
|
Проблема:
Если нужно закрыть компонент Window при запуске формы, а потом его по кнопке отобразить с помощью JavaScript то при установке свойства невидимости оно вообще не генерируется в код и соотвественно потом не вызывается из JavaScript Решение: ![]() ![]() function PageInfoAfterShow($sender, $params) { echo "<script type=\"text/JavaScript\"> Window1.close(); </script>"; } |
![]() |
Сообщ.
#23
,
|
|
Задача:
Если нужно использовать панель с набором компонентов на ней не в том месте где она установлена на форме, а в произвольном, определяемом неким порядком генерации страницы которым мы должны управлять, то есть использовать эту панель как шаблон Решение: нужно сделать так - ставим панель на форму (например с именем PanelNewCode) - панели устанавливаем в режиме редактирования : ![]() ![]() $this->PanelNewCode->Visible = false; $this->PanelNewCode->Layout->Type = 'REL_XY_LAYOUT'; - прописываем в то место где хотим вставить панель такой код (например встроить панель в таблицу): ![]() ![]() $mycodetable = '<table> <tr><td>здесь встроена моя панель 1-й раз '.$this->PanelNewCode->show(true).'</td></tr> // вставляем панель первый раз <tr><td>здесь встроена моя панель 2-й раз '.$this->PanelNewCode->show(true).'</td></tr> // вставляем панель второй раз </table>'; echo $mycodetable; - однако т.к. PanelNewCode невидимая, то есть проблема если на этой панели есть компоненты у которых прописаны обработчики событий (например кнопка) то vcl не сгенерирует их в страницу, т.к. родитель не видимый решение здесь такое: прописываем сгенерировать код события принудительно (например для кнопки Button1, которая находится на невидимой панели и имеет обработчик события) ![]() ![]() function zakazinfoAfterShow($sender, $params) { echo "<script type=\"text/JavaScript\">"; $this->Button1->dumpJsEvents(); echo "</script>"; } это событие здесь для формы с названием zakazinfo |
![]() |
Сообщ.
#24
,
|
|
Задача:
Передать параметры из формы в форму Например: значение первой колонки из выбранной записи DBGrid1 Решение: ![]() ![]() function BitBtn4JSClick($sender, $params) { ?> if (confirm("Вы уверены, что хотите удалить этого сотрудника?")) { t_id=DBGrid1.getTableModel().getValue(0, DBGrid1.getFocusedRow()); location.href="/formdelete.php?act=delete&id="+t_id; } <?php } в форме formdelete.php получаем в событии BeforeShow($sender, $params) ![]() ![]() $action=$this->input->act; if (is_object($action)) { $del_id=$this->input->id; ... |
![]() |
Сообщ.
#25
,
|
|
Задача:
Нужно управлять DBGrid (или ListView) Решение: 1. установка ширины колонок (JavaScript) ![]() ![]() ListView1.getTableColumnModel().setColumnWidth(0,250); ListView1.getTableColumnModel().setColumnWidth(1,250); DBGrid1.getTableColumnModel().setColumnWidth(0,1); // скрывема колонку путём установки ширины=1 2. добавить значения в ListView ![]() ![]() var rowData = []; rowData = tableModel.getData(); rowData.push(['111', '222','333']); tableModel.setData(rowData); ListView1.getTableModel().setColumnEditable(0, true); // сделать колонку редактируемой ListView1.getTableModel().setColumnEditable(1, true); ListView1.getTableModel().setColumnEditable(2, true); 3. ПОСЧИТАТЬ СУММУ некоторой колонки ![]() ![]() var totcases=1*0 ,totsale=1*0 var model = dbgrid.getTableModel(); var rowCount = model.getRowCount(); for(var row = 0; row < rowCount; row ++ ) { var order=parseInt(model.getValue(5,row)); if (order != model.getValue(5,row)) order=0; var multi=parseInt(model.getValue(10,row)); if (multi != model.getValue(10,row)) multi=1; var price=parseFloat(model.getValue(6,row)); if (price != model.getValue(6,row)) price=0; totcases+=order; totsale+=parseInt(order*multi*price*100)/100; } 4. ПОЛУЧИТЬ ЗНАЧЕНИЕ ЯЧЕЙКИ ![]() ![]() var row = dbgrid1.getFocusedRow(); var col = dbgrid1.getFocusedColumn(); var value=dbgrid1.getTableModel().getValue(col,row); alert('col = '+col+' row = '+row+' cell = '+value); 5. ДИНАМИЧЕСКИ ПРОПИСАТЬ КОЛОНКИ ![]() ![]() function Unit306BeforeShow($sender, $params) { $prop=array(); $prop['products']['products_id']=array('displaylabel'=>array('ID')); $prop['products']['products_quantity']=array('displaylabel'=>array('Quantity')); $this->dboscommerce1->DictionaryProperties=$prop; } 6. ЧАСТО ИСПОЛЬЗУЕМЫЕ МЕТОЫ ![]() ![]() var row = dbgrid.getFocusedRow(); var column = dbgrid.getFocusedColumn(); var value=dbgrid.getTableModel().getValue(col,row); dbgrid.getTableModel().setValue(col,row,value); dbgrid.sortByColumn (col, true); dbgrid.setFocusedCell(col, row, true); dbgrid.getSelectionModel().setSelectionInterval(row, row); 7. ПРИМЕР ПРОГРАММЫ КОТОРАЯ ДЕЛАЕТ ПОИСК ПО DBGRID (проверено, работает) ![]() ![]() function jsDBGfindtext(model,thetext,startingRow,column) { //zips thru a dbgrid to find something var rowCount = model.getRowCount(); for(var row = startingRow; row < rowCount; row ++ ) { var desc = model.getValue(column,row); if (typeof(desc)=="number") desc=desc.toString(); if (typeof(thetext)=="number") thetext=thetext.toString(); desc = desc.toUpperCase(); thetext = thetext.toUpperCase(); if ( desc.indexOf(thetext)>=0) return (row); } return (-1); } //the calling routine from a basic edit function EsearchdbgridJSKeyUp($sender, $params) { ?> var lookfor = findObj('Esearchdbgrid').value; if (lookfor.length < 2) startRow = 0; if (lookfor.indexOf(' ',0)) //use space bar as a look for next occurrence. { var look = lookfor.split(' '); lookfor=look[0]; } if (typeof(startRow)=='undefined') startRow=-1; startRow++; startRow=jsDBGfindtext(dbgrid.getTableModel(),lookfor,startRow,4); if (startRow>-1) { dbgrid.setFocusedCell(5, startRow, true); dbgrid.getSelectionModel().setSelectionInterval(startRow, startRow); } <?php } |
![]() |
Сообщ.
#26
,
|
|
Задача:
Передать содержимое панели(или другого элемента) в другую (копировать) Решение: - ставим на форму панель с чем то - ставим компонент Window1 - на Window1 ставим другую панель и кнопкой в javascripte передаём содержимое в окно Window1 ![]() ![]() document.getElementById("PanelBig_outer").innerHTML = document.getElementById("PanelPowerShow_outer").innerHTML Window1.open(); |
![]() |
Сообщ.
#27
,
|
|
Проблема:
В 1-й версии DelphiForPhp у компонента Query в редакторе колонок нет кнопок переместить колонки вверх, вниз. Это неудобно т.к. если нужно поменять их порядок то приходится перенабирать всё по новой. Решение: Взять 2-й DelphiForPhp (можно демо) и заменить у первого папку Program Files\CodeGear\Delphi for PHP\1.0\plugins на аналогичную от второго (там эти кнопки есть) IDE перезапустить здесь хранятся плагины редакторов свойств компонент, которые можно писать самостоятельно в Delphi (не на Delphi 7, а нужна версия выше) |
![]() |
Сообщ.
#28
,
|
|
в дополнение к FAQ (сообщение #2344473)
Проблема: При добавлении в шаблон SmartyTemplate компонент, которые построены на qx например: TreeView скролл пропадает и не появляется даже с кодом указанным в сообщении FAQ (сообщение #2344473) Решение: ![]() ![]() function mainAfterShow($sender, $params) { // FIX for Qadram's Scrollbar cockup!! ?> <script language="JavaScript" type="text/javascript"> var d = qx.ui.core.ClientDocument.getInstance(); d.setOverflow("auto"); </script> <?php } |
![]() |
Сообщ.
#29
,
|
|
Задача:
В шаблон SmartyTemplate добавить переменную, которая отсутствует как компонент на форме но которую нужно заполнить каким либо значением Решение: вариант шаблона: ![]() ![]() <html> <head> <title>{%$xCaption%}</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <table id="mytab" cellspacing="1" cellpadding="1" width="100%" border="1"> <tbody> <tr height="66"> <td> 5678</td> <td> {%$xtemp%}</td> <td> </td> </tr> <tr height="15"> <td> </td> <td> </td> <td> </td> </tr> </tbody> </table> </body> </html> код модуля php (событие onTemplate): ![]() ![]() function Unit5Template($sender, $params) { $template=$params['template']; $template->_smarty->assign('xtemp','1234567890'); $template->_smarty->assign('xCaption','MyTitle'); } |
![]() |
Сообщ.
#30
,
|
|
Проблема:
При подключении к SmartyTemplate некоторых компонент (решение не для всех компонент), например Panel,Label... нужно что бы они растягивались по контейнеру в который входят, например по размеру тега <td>, однако, они туда вставляются с шириной и высотой которую имеют на форме в дизайнере форм. Установка ширины или высоты в инспекторе объектов разрешается только в виде целых чисел, т.е. 100% не проходит. Как сделать 100% ? Решения: 1.Решение 1 - форме на которой находятся компоненты установить Layout.Type = FLOW_LAYOUT - дать команду конкретному компоненту writeAdjustToLayout(True) (по умолчанию там значение False) в этом случае при генерации компонента подставляются не установленные у него на форме высота и ширина, а height:100%;width:100%; ![]() ![]() function Unit9BeforeShow($sender, $params) { $this->Label1->writeAdjustToLayout(True); $this->Panel1->writeAdjustToLayout(True); $this->Button1->writeAdjustToLayout(True); } при этом панель растягивается по тегу в котором находится а Label1 и Button по ширине тега, высота подстраивается под содержимое файл unit1.tpl ![]() ![]() <html> ..... <body> {%$StartForm%} <table width=100% border=1> <tr><td width="150" height="200">{$Panel1}</td><td></td></tr> <tr><td width="150"></td><td></td></tr> <tr><td width="150" height="200">{$Label1}</td><td height="200">{$Button1}</td></tr> {%$EndForm%} </body> </html> если посмотреть код html полученной страницы, то видим следующее: (для вышеприведённого шаблона) ![]() ![]() <html> <body> <form style="margin-bottom: 0" id="Unit9" name="Unit9" method="post" action="/unit9.php"> <table width=100% border=1> <tr><td width="150" height="200"><div id="Panel1_outer"> <table id="Panel1_table" width="100%" height="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#00FF00" style=" border: 0px solid ; " > <tr> <td style=" font-family: Verdana; font-size: 10px; "><span style=" font-family: Verdana; font-size: 10px; ">Panel1</span> </td> </tr> </table> </div> </td><td></td></tr> <tr><td width="150"></td><td></td></tr> <tr><td width="150" height="200"><div id="Label1_outer"> <div id="Label1" style=" font-family: Verdana; font-size: 10px; background-color: #FF0000;height:100%;width:100%;" > Label1 seefwse we we twer twer twe wer we rwer w</div> </div> </td><td height="200"><div id="Button1_outer"> <input type="submit" id="Button1" name="Button1" value="Button1" onclick="return Button1ClickWrapper(event, document.forms[0].Button1SubmitEvent, 'Button1_Button1Click')" style=" font-family: Verdana; font-size: 10px; height:100%;width:100%;" tabindex="0" /> <input type="hidden" id="Button1SubmitEvent" name="Button1SubmitEvent" value="" /> </div> </td></tr> </form> </body> </html> 2.Решение 2 используем стили файл style.css ![]() ![]() .xx { width: 100%; height: 100%; } файл unit1.tpl ![]() ![]() <html> <link rel="stylesheet" href="style.css"> <body> {%$StartForm%} <table width=100% border=1> <tr><td width="150" height="200">{$Panel1}</td><td></td></tr> <tr><td width="150"></td><td></td></tr> <tr><td width="150" height="200">{$Label1}</td><td height="200">{$Button1}</td></tr> {%$EndForm%} </body> </html> форма в файл Unit10.php на ней Label1, Panel1, Button1 ставим маленьких размеров (что бы видно было масштабиравание) в инспекторе: Label1->Caption = 'Лучше нету того свету, Лучше нету того свету, Лучше нету того свету'; Button1->Style = .xx Unit10->TemplateEngine=SmartyTemplate Unit10->TemplateFileName=unit1.tpl |
![]() |
Сообщ.
#31
,
|
|
Если нужно создать простую таблицу с данными то можно воспользоваться компонентом HTML_Table который описан в vcl/PEAR/HTML/Table.php
простой пример использования: ![]() ![]() <?php require_once ('HTML/Table.php'); $table = new HTML_Table(); $table->setAttribute('border', 1); for ($x = 1; $x <= 9; $x++) { for ($y = 1; $y <= 9; $y++) { $table->setCellContents($x-1, $y-1, $x*$y); } } echo $table->toHtml(); ?> |
![]() |
Сообщ.
#32
,
|
|
Проблемы переноса проекта на хостинг проайдера
После создания проекта и его успешной отладки на локальном компьютере могут быть проблемы с переносом этого проета к провайдеру Приведу некоторые проблемы с которыми столкнулся я и их решения в основном эти проблемы из за не одинаковой настройки php или apache 1) у провайдера не была подключена библиотека с функциями фильтрации в php Проявлялось в виде сообщения типа: "The Input Filter PHP extension is not setup on this PHP installation, so the contents returned by Input is *not* filtered" удалось заставить подключить библиотеку путём предоставления примера, который не работал По phpinfo это не было видно (вроде бы), а программа выполненная на провайдере говорила, что функции не доступны на локальной же машине работало Пример в двух файлах: example04.php ![]() ![]() <?php if (!filter_has_var(INPUT_POST, 'submit')) { echo "form"; // include the form. } $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT); if (is_null($age)) { echo "Вы не ввели ничего(пустая переменная).<br />"; require_once('index.php'); } elseif ($age === FALSE) { echo "Введите число.<br />"; require_once('index.php); } else { echo "Привет.<br/>"; echo "<a href='test1.php'>В начало</a>.<br/>"; } ?> index.php ![]() ![]() <html> <head></head> <body > Проверка ввода числа <form action="example04.php" method="post" > Enter your age: <input name="age" size="2"> <input type="submit" name="submit" value="Go"> </form> </body> </html> 2)У провайдера небыла установлена переменная output_buffering Проявлялось сообщением об ошибке в связи с тем что header уже послан это решили созданием в корне папки проекта файла .htaccess и занесением в него следующих строк: php_flag output_buffering On php_value output_buffering 4096 |
![]() |
Сообщ.
#33
,
|
|
Задача: Открыть из одного окна другое (модально) и вернуть значения из него только по закрытию окна.
Раз модальное окно, то соответственно первое в этот момент будет недоступно. Решение: (Проверено в IE) делаем в первом окне ![]() ![]() function Unit12AfterShow($sender, $params) { echo "<script type=\"text/JavaScript\"> function returnInfo1(p_obr,p_name,p_fam,p_adr,p_city,p_country,p_tlf,p_tlf2) { document.getElementById('p_obr').value = p_obr; document.getElementById('p_name').value = p_name; document.getElementById('p_fam').value = p_fam; document.getElementById('p_adr').value = p_adr; document.getElementById('p_city').value = p_city; document.getElementById('p_country').value = p_country; document.getElementById('p_tlf').value = p_tlf; document.getElementById('p_tlf2').value = p_tlf2; } </script>"; } function Label3JSClick($sender, $params) { ?> res = window.showModalDialog("clientinfoz.php","","dialogHeight:576px; dialogWidth:616px;status=no"); if(res!=null) { returnInfo1(res[0],res[1],res[2],res[3],res[4],res[5],res[6],res[7]); } <?php } Возвращаем из второго окна (при этом закрываем его) 1)вариант с обычным html: ![]() ![]() <input type="button" value="добавить эту информацию о получателе в новый заказ" onClick="window.returnValue = ['555','666','777','888','999','000','111','222'];window.close();">' 2)вариант формы delphiforphp: ![]() ![]() function Button4JSClick($sender, $params) { ?> window.returnValue = ['555','666','777','888','999','000','111','222']; window.close(); <?php } |
Сообщ.
#34
,
|
|
|
Проблема:
Как связать D4php и Firebird? Решение: Хоть и официально D4php поддерживает FB, но у многих подключиться с помощью компонента Database не получается. Поэтому был применен следующий подход. 0. Если установлен Interbase или иная программа, которая юзает библиотеку GDS32.DLL, то останавливаем ее. 1. Устанавливаем FB с отмеченной галочкой о библиотеке GDS32.DLL 2. Идем по пути %systemroot%\system32\ и копируем библиотеку GDS32.DLL в 2.1 C:\Program Files\CodeGear\Delphi for PHP\2.0\apache2\bin\ 2.2 C:\Program Files\CodeGear\Delphi for PHP\2.0\ 2.3 C:\Program Files\CodeGear\Delphi for PHP\2.0\packages\ 2.4 C:\Program Files\CodeGear\Delphi for PHP\2.0\php\ 3. Все готово. Для связки D4php и Firebird используем Interbase компоненты. Примечание: Решения для использования ролей пока не найдено. Это сообщение было перенесено сюда или объединено из темы "Firebird + D4php" Примечание 2: В 3-й версии пишут что Firebird поддерживается |
![]() |
Сообщ.
#35
,
|
|
Задача: Доступ к свойствам компонента OpenGrid
Решение: 1.Получить значение 1-й колонки в текущей строке грида OpenGrid2 при выборе ячейки если у грида свойство readonly=1 ![]() ![]() function OpenGrid2JSCellSelect($sender, $params) { ?> //Add your javascript code here alert(jQuery('#OpenGrid2').getGridParam('selrow')); <?php } 2. Получить значения указанных колонок в текущей (выбранной) строке грида OpenGrid2 при выборе ячейки Работает это если у гида свойство readonly=1 Здесь вытаскиваются колонки с названием полей PR_ID,PR_DATE ![]() ![]() function OpenGrid2JSCellSelect($sender, $params) { ?> //Add your javascript code here var id = jQuery("#OpenGrid2").getGridParam('selrow'); if (id) { var ret = jQuery("#OpenGrid2").getRowData(id); alert("column pr_id="+ret.PR_ID+" column pr_date="+ret.PR_DATE+"..."); } else { alert("Please select row");} <?php } 3. Ещё несколько функций для доступу к параметрам грида ![]() ![]() function Button2JSClick($sender, $params) { ?> //Add your javascript code here alert(jQuery('#OpenGrid2').getGridParam('url')); // зачем это не понял пока alert(jQuery('#OpenGrid2').getGridParam('sortname')); // имя колонки в гриде по которой сейчас отсортированы данные alert(jQuery('#OpenGrid2').getGridParam('sortorder')); // порядок сортировки alert(jQuery('#OpenGrid2').getGridParam('selrow')); // значение первой колонки в строке alert(jQuery('#OpenGrid2').getGridParam('page')); // номер отображаемой страницы alert(jQuery('#OpenGrid2').getGridParam('rowNum')); // по сколько записей выводится на странице alert(jQuery('#OpenGrid2').getGridParam('datatype')); // тип данных alert(jQuery('#OpenGrid2').getGridParam('records')); // количесто записей в таблице базы данных <?php } 4. Реализовать связку master-detail Описано здесь установить easyGrid, OpenGrid (сообщение #2399428) 5. Раскраска грида по значениям ячеек исходные данные для примера: таблица с полями TEST_ID (integer), TEST_NAME (varchar(20)) заполнена всякими тестовыми значениями Раскрашиваем выбранную запись в гриде ![]() ![]() function Button1JSClick($sender, $params) { ?> //Add your javascript code here var id = jQuery('#OpenGrid1').getGridParam('selrow'); var ret = jQuery('#OpenGrid1').getRowData(id); //alert("TEST_ID="+ret.TEST_ID+" TEST_NAME="+ret.TEST_NAME+"..."); //тут надо вставить анализ данных и в зависимости от них окрашивать строку другим цветом // шрифт в выбранной ячейке красим в нужный цвет jQuery("#OpenGrid1").setCell(id,'TEST_NAME','',{'color':'#FF00FF'}); // фон в выбранной ячейке красим в нужный цвет jQuery("#OpenGrid1").setCell(id,'TEST_ID','',{'background-color': '#999999'}); // меняем атрибуты шрифта в выбранной ячейке jQuery("#OpenGrid1").setCell(id,'TEST_ID','',{'color':'#FF00FF', 'font-weight':'bold'},{'title': 'это не меняет ничего!'}); <?php } Пробежать по всем отображаемым строкам в гриде и раскрасить их по нужным критериям можно так ![]() ![]() function Button3JSClick($sender, $params) { ?> //Add your javascript code here var ids = jQuery("#OpenGrid1").getDataIDs(); // получаем массив ID for(var i=0;i < ids.length;i++) //бежим по всем отображаемым строкам грида { var id_value = ids[i]; // получаем значение перво колонки очередной строки var ret = jQuery("#OpenGrid1").getRowData(id_value); // получаем объект со значениями полей // alert('Строка№ '+i+', значение перовой колонки='+ id_value+' поле TEST_ID='+ret.TEST_ID+' поле TEST_NAME='+ret.TEST_NAME); if (ret.TEST_NAME=='eee') // проверяем на значение = eee { // фон в выбранной ячейке красим в нужный цвет jQuery("#OpenGrid1").setCell(id_value,'TEST_NAME','',{'background-color': '#999999'}); } if (ret.TEST_ID in [1,5]) // проверяем на значения 1 и 5 { // фон в выбранной ячейке красим в нужный цвет jQuery("#OpenGrid1").setCell(id_value,'TEST_NAME','',{'background-color': '#999999'}); } } <?php } Пробежать по всем отображаемым строкам в гриде и раскрасить их по нужным критериям сразу при отображении грида можно если предыдущий код вставить в событие OpenGrid1JSGridComplete 6. Получить получить значение ячейки из указанной по имени колонки и строки с указанным значением описано здесь плучить значение ячейки в OpenGrid (сообщение #2613574) |
![]() |
Сообщ.
#36
,
|
|
Задача: Как сделать чтобы данные в ячейки переносились т.е. высота ячейки менялась в зависимости от длинны данных OpenGrid
Решение: смотрим здесь OpenGrid ,вставка новой записи в Detail Grid (сообщение #2549108) |
![]() |
Сообщ.
#37
,
|
|
Задача: Как сделать что бы при открытии модального окна информация основной страницы затенялась или скрывалась
Решение: (проверялось в IE, в остальных проверяем сами) 1.на форме unit1 компонент Window1 и кнопка Button1 и ещё чего нибудь для демонстрации работы накидай, ну там вторую кнопку, мемо... 2. в инспекторе Winow1->Modal = true; Button1->ButtonType = btNormal; 3. в коде вариант с затемнением ![]() ![]() function Button1JSClick($sender, $params) { ?> //Add your javascript code here document.getElementById('unit1').style.background = 'gray'; // перекрашиваем форму Window1.show(); // открывем модальное окно (всё остальное блокируется пока окно открыто) <?php } function Window1JSClose($sender, $params) { ?> //Add your javascript code here document.getElementById('unit1').style.background = ''; // перекрашиваем форму назад // здесь возможно нужно восстанавличать цвет, а ранее его запоминать в какой то переменной, но в простом случае работает и так <?php } вариант где скрываем основную страницу пока отображаем модальное окно ![]() ![]() function Button1JSClick($sender, $params) { ?> //Add your javascript code here document.getElementById('unit1').style.display = 'none'; //block - отображает страницу или элемент, а none прячет Window1.show(); // открывем модальное окно (всё остальное блокируется пока окно открыто) <?php } function Window1JSClose($sender, $params) { ?> //Add your javascript code here document.getElementById('unit9').style.display = 'block'; //block - отображает страницу или элемент, а none прячет <?php } |
![]() |
Сообщ.
#38
,
|
|
Задача: Нужно в окне Windows1 открыть страницу с другого сайта (или со своего сайта другую форму)
Решение: нужно поместить на форму окно Window1, на него панель Panel1, а к панели привязать событие ![]() ![]() ..... class Unit2 extends Page { public $Panel1 = null; public $Window1 = null; function Panel1Show($sender, $params) { echo '<iframe src ="http://forums.delphi-php.net/" height="100%" width="100%"></iframe>'; // а так грузиш свою другую форму //echo '<iframe src ="Unit3.php" height="100%" width="100%"></iframe>'; } } ..... |
![]() |
Сообщ.
#39
,
|
|
Задача: сформировать список в Combobox
Решение: ![]() ![]() public function GetList($TempQuery,$ComboBox,$DataField) { $TempQuery->close(); $TempQuery->open(); $TempQuery->first(); $ComboBox->Clear(); while (!$TempQuery->eof) { $ComboBox->AddItem($TempQuery->$DataField); $TempQuery->next(); } } //вызываем так $this->TempQuery->SQL = 'select Car_RegNum as xName from car order by Car_RegNum'; GetListAuto($this->TempQuery,$this->ComboBox1, Car_RegNum ); Тема решения: ComboBox |
![]() |
Сообщ.
#40
,
|
|
Задача: очистить свойство Text у всех компонент на форме
Решение: http://blog.onenerd.net/?p=69 ![]() ![]() function ClearAllTextBoxes () { try { foreach($this as $obj) { if(substr($obj->name,0,3)==”txt”) { $obj->Text = “”; } } } catch (Exception $e) {} } или ![]() ![]() function ClearAllTextBoxes () { reset($this->controls->items); while(list($key, $obj)=each($this->controls->items)) { if ($obj->inheritsFrom(”Edit”)) { $obj->Text = “”; } } } |
![]() |
Сообщ.
#41
,
|
|
Задача: добавить ссылку на файл .js в форму
Рещение: В событие OnShowHeader добавить ![]() ![]() echo “<script language=\”javascript\” src=\”../_lib/js/validate.js\”></script>”; Кроме того если у вас есть php библиотека функций, которую вы всегда включаете в страницы формы, добавьте туда следующую функцию: ![]() ![]() function JSInclude($js_path_and_filename) { echo “<script language=\”javascript\” src=\”{$js_path_and_filename}\”></script>\n”; } вызываем так ![]() ![]() JSInclude(”../lib/js/validate.js”); Добавлено Проблема: на одной кнопке висит два обработчика один php, а второй javascript Событие Javascript срабатывает, но до события php никода не доходим Решение: в конец обработчика javascript добавить return true; неправильно: ![]() ![]() function Button2Click($sender, $params) { echo “Мы никогда сюда не попадаем.”; } function Button2JSClick($sender, $params) { ?> //Add your javascript code here alert(”Это видим всегда”); <?php } правильно ![]() ![]() function Button2Click($sender, $params) { echo “И это теперь видим.”; } function Button2JSClick($sender, $params) { ?> //Add your javascript code here alert(”return true;”); return true; <?php } |
![]() |
Сообщ.
#42
,
|
|
Прблема: при переносе на провайдер проект н работает с компонентами ExtJS
Решение: на провайдере обычно нужнот учитывать регистр букв, в отличии от Windows меняем Ext на ext здесь: файл vcl/ext/functions.inc.php было так ![]() ![]() <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/Ext/library/resources/css/ext-all.css" /> <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/Ext/library/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/Ext/library/ext-all.js"></script> <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/Ext/library/examples/examples.js"></script> <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/Ext/library/examples/examples.css" /> стало так ![]() ![]() <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/ext/library/resources/css/ext-all.css" /> <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/ext/library/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/ext/library/ext-all.js"></script> <script type="text/javascript" src="<?php echo VCL_HTTP_PATH; ?>/ext/library/examples/examples.js"></script> <link rel="stylesheet" type="text/css" href="<?php echo VCL_HTTP_PATH; ?>/ext/library/examples/examples.css" /> |
![]() |
Сообщ.
#43
,
|
|
Проблема: не работает SimpleChart - не показывает график после добавления данных
Решение: после добавления компонента на форму проверить: порядок подключения модулей нужно так (закоментированное - это неправильно) ![]() ![]() /* require_once("rpcl/rpcl.inc.php"); use_unit("forms.inc.php"); use_unit("extctrls.inc.php"); use_unit("stdctrls.inc.php"); use_unit("chart.inc.php"); // <= это неправильно */ require_once("rpcl/rpcl.inc.php"); use_unit("chart.inc.php"); // <= это правильно use_unit("forms.inc.php"); use_unit("extctrls.inc.php"); use_unit("stdctrls.inc.php"); |
![]() |
Сообщ.
#44
,
|
|
Задача: Динамически создать объекты на форме и прописать им события
Решение: вариант на примере динамического создания 10 чекбоксов с событием на JS Примечание: проверено в RadPHP XE, версия rpcl=289 На 2-й версии не сработало, но думаю что если обновить vcl до rpcl должно работать (во накрутили названий... ![]() ![]() ![]() <?php require_once("rpcl/rpcl.inc.php"); //Includes use_unit("forms.inc.php"); use_unit("extctrls.inc.php"); use_unit("stdctrls.inc.php"); //Class definition class Page2 extends Page { public $Panel1 = null; function Page2StartBody($sender, $params) { for($i = 1; $i <= 10; $i++) { $xch = new Checkbox($this); $xch->Left = 10; $xch->Top = $i * 20; $xch->Name = 'chb_' . $i; $xch->Caption = $xch->Name; $xch->setjsOnClick("ChbJSClick($xch->Name)"); $xch->Parent = $this->Panel1; // $xch->show(); } } function Page2BeforeShow($sender, $params) { echo" <script type=\"text/JavaScript\"> function ChbJSClick(thisobject) { alert(thisobject.name+' отмечено: '+thisobject.checked); } </script> "; } } global $application; global $Page2; //Creates the form $Page2 = new Page2($application); //Read from resource file $Page2->loadResource(__FILE__); //Shows the form $Page2->show(); ?> |
![]() |
Сообщ.
#45
,
|
|
Задача: выполнить хранимую процедуру MySQL и получить результат в DbGrid
Решение: Хранимая процедура не работает (сообщение #2772214) |
![]() |
Сообщ.
#46
,
|
|
Задача: выполнить цепочку AJAX процедур, когда одна вызывает выполнение другой
Решение: Рассмотрим на примере двух DBGrid работающих по принципу Master-Detail При изменении строки в первом гриде вызываем ajax процедуру на фильтрацию данных во втором гриде. А после перечитывания и отрисовки данных второго грида автоматически вызываем ajax процедуру для вывода сообщений или выполнения других функций на JS. На форме: DBGrid1, DBGrid2, Edit1, AjaxScripter1 Оба грида подключены к одной и той же таблице (через соответствующие компоненты), у которой ключевое поле TEST_ID. При выборе записи в первой таблице возьмём значение TEST_ID этой записи, пропишем его в Edit1 и отфильтруем по нему DBGrid2 (через компонент Table2, к которому подключен грид). После этого установим фокус на первую строку во второй таблице и выведем сообщение. ![]() ![]() function DBGrid1JSRowChanged($sender, $params) { ?> params = DBGrid1.getTableModel().getValue(0, DBGrid1.getFocusedRow()); <?php echo $this->DBGrid1->ajaxCall("xxx", array("DBGrid1")); ?> <?php } function xxx($sender, $params) { $this->Edit1->Text = $params[0]; $this->Table2->Filter = "TEST_ID=$params[0]"; $this->Table2->refresh(); $this->AjaxScripter1->Script = ' //DBGrid1.getTableColumnModel().setColumnVisible(0, false); - здесь мы могли бы установить видимость колонки в гриде или сделать другие установки var xx =document.getElementById("Edit1").value; DBGrid2.getSelectionModel().setSelectionInterval(0, 0); '; } function Page10AfterShow($sender, $params) { echo ' <script type="text/JavaScript"> DBGrid1.getTableColumnModel().setColumnVisible(0, false); DBGrid2.getTableColumnModel().setColumnVisible(0, false); </script> '; } function DBGrid2JSRowChanged($sender, $params) { ?> params = DBGrid2.getTableModel().getValue(0, DBGrid2.getFocusedRow()); <?php echo $this->DBGrid1->ajaxCall("yyy", array("DBGrid2")); ?> <?php } function yyy($sender, $params) { $this->AjaxScripter1->Script = ' alert(\'Я сработал после обновления грида 2\'); '; } компонент AjaxScripter не входит в стандартную поставку, но давно описан здесь Delphi for PHP (RAD PHP XE): Компоненты (сообщение #2410953) Сообщения были разделены в тему "Пустая вкладка при старте проекта" |
![]() |
Сообщ.
#47
,
|
|
Задача: Получить список методов объекта JS
Решение: используем функцию ![]() ![]() function Page1BeforeShow($sender, $params) { echo ' <script type="text/javascript"> function fnShowProps(obj, objName){ var result = ""; for (var i in obj) result += objName + "." + i + " = " + obj[i] + "<br />\n"; document.write(result); } </script> '; } function Label1JSClick($sender, $params) { ?> //begin js // fnShowProps(window.location, "location"); // fnShowProps(Label1, "Label1"); fnShowProps(LabeledEdit1, "LabeledEdit1"); //end <?php } Сообщения были разделены в тему "пытаюсь разместить пробную страничку на хостинге" |
![]() |
Сообщ.
#48
,
|
|
Проблема: Deployment Wizard не всегда копирует нужные файлы в папку rpcl
Решение: делает это самостоятельно 1. выполняем Deployment Wizard 2. создаём файл copy_rpcl.bat кидаем его в ту директорию, в которую экспортировали проект 3. выполняем содержимое copy_rpcl.bat ![]() ![]() @echo off rem кидаем файл в нужную папку и запускаем, файлы будут скопированы в подпапку этой папки set folderRPCLsource=C:\Program Files\Embarcadero\RadPHP\3.0\rpcl rem папка куда копировать (если rpcl, то скопирует в текущую папку, в подпапку rpcl) set folderRPCLdest=rpcl cls; echo 1 - копировать всю папку RPCL (не включая svn) echo 2 - копировать только необходимый минимум папок RPCL (не включая svn) echo 0 - прекратить это безобразие :) echo; set /P variantcopy="Введите вариант копирования: " if "%variantcopy%" == "1" goto all ELSE goto minimum if "%variantcopy%" == "0" goto end1 :minimum rem здесь сами себе задаём минимум необходимых папок mkdir "%folderRPCLdest%" xcopy "%folderRPCLsource%" "%folderRPCLdest%\*.php" /Y mkdir "%folderRPCLdest%\qooxdoo" xcopy "%folderRPCLsource%\qooxdoo" "%folderRPCLdest%\qooxdoo" /R/E/K/Y mkdir "%folderRPCLdest%\adodb" xcopy "%folderRPCLsource%\adodb" "%folderRPCLdest%\adodb" /R/E/K/Y mkdir "%folderRPCLdest%\js" xcopy "%folderRPCLsource%\js" "%folderRPCLdest%\js" /R/E/K/Y mkdir "%folderRPCLdest%\xajax" xcopy "%folderRPCLsource%\xajax" "%folderRPCLdest%\xajax" /R/E/K/Y mkdir "%folderRPCLdest%\language" xcopy "%folderRPCLsource%\language" "%folderRPCLdest%\language" /R/E/K/Y mkdir "%folderRPCLdest%\smarty" xcopy "%folderRPCLsource%\smarty" "%folderRPCLdest%\smarty" /R/E/K/Y echo 'Скопирован необходимый МИНИМУМ'; goto end; :all mkdir "%folderRPCLdest%" xcopy "%folderRPCLsource%" "%folderRPCLdest%" /R/E/K/Y echo 'Скопировано ВСЁ'; goto end; :end pause :end1 теперь в папке экспорта находятся нужные файлы для переноса на сервер |
![]() |
Сообщ.
#49
,
|
|
Проблема: QDBGrid1 на QWindow1 не работает, работает когда оба просто на форме
Решение: ![]() ![]() function QWindow1BeforeShow($sender, $params) { $this->QDBGrid1->dumpRPC(); } |
![]() |
Сообщ.
#50
,
|
|
Проблема: В RadPhp XE не получается подключится к MSSQL 2000 с помощью DataExplorer
Решение: Качаем новый клиент MSSQL отсюда http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c6c3e9ef-ba29-4a43-8d69-a2bed18fe73c а конкретно этот: http://go.microsoft.com/fwlink/?LinkId=123717&clcid=0x409 |