Логотип   Простое и понятное управление
  Уникальные возможности по настройке
  Open Server скачали уже 1 021 071 раз!

Форум

Добро пожаловать, Гость!

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

Советы и рекомендации, полезные инструкции, обмен опытом
Lucas
Сообщения: 4
C нами: 5 лет 6 мес

Непрочитанное сообщение Lucas » 30 май 2011, 09:13

Прочитал вашу статью про 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.

Аватара пользователя
Максим
Сообщения: 4877
C нами: 5 лет 11 мес
Контакты:

Непрочитанное сообщение Максим » 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, все их лотки будут открываться если в них нет диска!

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

Lucas
Сообщения: 4
C нами: 5 лет 6 мес

Непрочитанное сообщение Lucas » 30 май 2011, 21:40

->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, значит диска вообще нет.

Аватара пользователя
Максим
Сообщения: 4877
C нами: 5 лет 11 мес
Контакты:

Непрочитанное сообщение Максим » 30 май 2011, 22:45

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

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

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

Lucas
Сообщения: 4
C нами: 5 лет 6 мес

Непрочитанное сообщение Lucas » 31 май 2011, 00:15

Вот пример набрасал, все прокручивается у меня, по нажатию на кнопку, правда я не тестировал в Seven, но там тоже должно работать.

Аватара пользователя
Максим
Сообщения: 4877
C нами: 5 лет 11 мес
Контакты:

Непрочитанное сообщение Максим » 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:

Аватара пользователя
Максим
Сообщения: 4877
C нами: 5 лет 11 мес
Контакты:

Непрочитанное сообщение Максим » 01 июн 2011, 00:46

А вот сегодня проверил ваше предложение насчет osinfo_drivetype. Переделал так же перебор дисков с COM на osinfo_drivetype. Огромное спасибо за помощь.

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

Lucas
Сообщения: 4
C нами: 5 лет 6 мес

Непрочитанное сообщение Lucas » 01 июн 2011, 09:31

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

Аватара пользователя
duxabilii
Сообщения: 216
C нами: 5 лет 5 мес
Контакты:

Непрочитанное сообщение duxabilii » 26 июл 2011, 11:46

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

<?php
    $ext = new ReflectionExtension('curl');
    var_dump ( $ext->getFunctions() );
?>

где вместо curl, нужное Вам расширение

Аватара пользователя
Максим
Сообщения: 4877
C нами: 5 лет 11 мес
Контакты:

Непрочитанное сообщение Максим » 09 сен 2011, 14:03

Спасибо большое, полезная функция!


Вернуться в «Полезные советы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость