Страница 1 из 1

Несколько замечаний по поводу статьи на хабре

Добавлено: 30 май 2011, 09:13
Lucas
Прочитал вашу статью про OpenServer на хабре и есть замечание на счет некоторого кода, который бы можно было укоротить раз в 10.

Вот этот код:
$WshShell = new COM("WScript.Shell");
if (c("pages1")->pageIndex == 0) c("memo1")->setFocus(); // установка фокуса на текстовое поле
elseif (c("pages1")->pageIndex == 1) c("memo2")->setFocus();
elseif (c("pages1")->pageIndex == 2) c("memo3")->setFocus();
elseif (c("pages1")->pageIndex == 3) c("memo4")->setFocus();
elseif (c("pages1")->pageIndex == 4) c("memo5")->setFocus();
elseif (c("pages1")->pageIndex == 5) c("memo6")->setFocus();
elseif (c("pages1")->pageIndex == 6) c("memo7")->setFocus();
$WshShell->SendKeys("^{END}"); // нажатие клавиши END чтобы попасть в конец
$WshShell->SendKeys("{HOME}"); // Нажатие клавиши HOME чтобы вернуться в начало последней строки
Можно сократить в этот:
$index = c("pages1")->pageIndex;
$memo = c("memo".($index+1)); // достаем нужный компонент
$memo->setFocus();
$memo->selStart = strlen($memo->text) - 1; // устанавливаем курсор в конечный символ
Чтобы получить список существующих дисков можно использовать следующий код:
function diskBusyArray(){
   $result = array(); 
   for($i = 'A'; $i<'Z'; $i++){
        if ( is_dir($i.':/') )
           $result[] = $i;
   }
}
Функция вернет вам массив из занятых букв для дисков. Это намного проще чем ваш код.

В общем, это лишь советы, как усовершенствовать код, не прибегая к использованию COM.

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 30 май 2011, 15:02
Максим
Lucas, спасибо за замечания, однако ни одно из них не является верным. Всё предложенное Вами я уже проходил и пробовал в процессе написания программы и тот код, который получился в итоге совершенно неслучайный. Единственное с чем соглашусь, так это с тем, что код можно укоротить, но я указал в статье, что целью была правильная работа программы, а не красота кода.

Итак, первое:
$memo->selStart = strlen($memo->text) - 1; // устанавливаем курсор в конечный символ
Данная конструкция не даст нужного нам эффекта, поскольку этот код лишь установит курсор в заданное положение, причём не в то, которое требуется (необходимо установить курсор в начало строки, а не в конец). И самое главное - код задаст положение только курсору, тогда как сам текст и полоса прокрутки не сдвинуться с места.

Второе:
function diskBusyArray(){
   $result = array(); 
   for($i = 'A'; $i<'Z'; $i++){
        if ( is_dir($i.':/') )
           $result[] = $i;
   }
}
PHP функцию is_dir и любые ей подобные нельзя использовать для определения существования дисков в системе. Почему? Всё очень просто - если использовать такие функции, то при каждом опросе диска, который есть в системе, но временно отсутствует, мы будем получать сообщение об ошибке в Windows, а при опросе дисков которые окажутся CD/DVD ROM, все их лотки будут открываться если в них нет диска!

Как видите, всё это я проходил и выбор конечного кода неслучаен. Однако спасибо за желание помочь.

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 30 май 2011, 21:40
Lucas
->selStart - задает начало курсора
->selLength - задает длину выделения курсора.

При желании можно легко высчитать позицию курсора начала строки, что для этого надо? Взять текст как массив (схематично, не проверял):
$lines = $memo->items->lines; // $lines это будет массив строк
$sel    = 0;
foreach($lines as $i=>$t){
    $sel += strlen($t) + strlen(_BR_);
}
$sel -= strlen($lines[ count($lines)-1 ]);
$memo->selStart = $sel;
Полоса прокрутки прекрасно сдвигается с места, отсутствие сдвига возможно лишь в том случае, если установлен не актуальный старт для выделения.

Ну а с is_dir, у меня cd+rom не открывается, у вас открывался? :D

Можно попробовать использовать функцию osinfo_drivetype - из расширения php_osinfo, она возвращает тип диска, первый параметр это буква диска. Скорее всего если функция вернет 0, значит диска вообще нет.

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 30 май 2011, 22:45
Максим
1) Полоса прокрутки никуда не сдвигается. При правильном старте. Невозможность двигать прокрутку подтверждает даже разработчик среды DevelStudio. Почему вы утверждаете обратное, не пойму... :|

2) По поводу дисков - не вижу смысла что-либо менять в реализованном варианте. К тому же php_osinfo оказалась наполовину нерабочей, когда я ее проверял, потому не факт что ваш способ в ней сработает если попробовать его сделать.

P.s. Такое впечатление, что вы не любите использование COM. Чем он вам так не угодил, если не секрет? :roll:

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 31 май 2011, 00:15
Lucas
Вот пример набрасал, все прокручивается у меня, по нажатию на кнопку, правда я не тестировал в Seven, но там тоже должно работать.

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 31 май 2011, 00:43
Максим
Поэкспериментировал с вашим кодом. Проблема оказалась в $memo->selLength = 0;, без этого прокрутка не выполняется, только устанавливается курсор. Итоговый рабочий код таков:
$index = c("logs->pages1")->pageIndex;
$memo = c("logs->memo".($index+1));
$lines = $memo->items->lines;
$sel  = strlen( $memo->text ) - strlen($lines[ count($lines)-1 ]);
$memo->setFocus();
$memo->selStart = $sel;
$memo->selLength = 0;
Большое Вам спасибо за помощь в развитии Open Server. Ваш вариант будет уже в ближайшем обновлении программы. Вправду получилось очень полезно :ugeek:

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 01 июн 2011, 00:46
Максим
А вот сегодня проверил ваше предложение насчет osinfo_drivetype. Переделал так же перебор дисков с COM на osinfo_drivetype. Огромное спасибо за помощь.

Только вот меня кое что смущает... :) Эта функция osinfo_drivetype нигде не документирована, о ней не знает ни справка, ни форум DevelStudio, ни Google и Yandex. Откуда вы всё это знаете :roll:

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 01 июн 2011, 09:31
Lucas
В php можно получить все функции любого расширения, не помню как эта функция называется.

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 26 июл 2011, 11:46
duxabilii
Lucas писал(а):В php можно получить все функции любого расширения, не помню как эта функция называется.
<?php
    $ext = new ReflectionExtension('curl');
    var_dump ( $ext->getFunctions() );
?>
где вместо curl, нужное Вам расширение

Re: Несколько замечаний по поводу статьи на хабре

Добавлено: 09 сен 2011, 14:03
Максим
Спасибо большое, полезная функция!