+ Ответить в теме
Показано с 1 по 36 из 36
  1. #1

    Дизассемблирование программы написанной в Devel Studio

    На днях завершив писать очередную программу на php в devel studio, перед тем как ее выложить, я задумался, а не взломают ли "добрые" люди эту программу путем дизассемблирования (получения исходного алгоритма на языке ассемблер) или декомпилирования (воссоздание исходного кода на языке высокого уровня, в данном случае php)?

    Я пришел к выводу, что нужно произвести тестирование, наткнувшись, на одном форуме, на некое объявление "ломаем EXE", нашел человека "хакера", который за некоторую плату, в течении 1 дня, произвел взлом, прислав мне исходный код моей программы (которого у него 100% не было), мистика??? нет декомпилирование((

    Вот собственно вопрос: так как этот "хакер", мне ни слова не сказал, как он это сделал, меня интересую подобный метод и при помощи чего можно декомпилировать программу, написанную на php и скомпилированную в devel studio, а так же как (если это вообще возможно) защитить программу, от несанкционированного пользования?

    Спасибо всем участникам поста!

  2. #2
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от Максим Посмотреть сообщение
    OllyDbg
    мне повезло больше, у меня была старая версия студии, там даже OllyDbg не потребовался.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  3. #3
    Цитата Сообщение от vGhost Посмотреть сообщение
    мне повезло больше, у меня была старая версия студии, там даже OllyDbg не потребовался.
    старая это какая? 2010 года 2.0b?

  4. #4
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    2.0.0.6 (сечас уже 2.0.0.9 есть). В 2.0.0.6 по словам Devel'а бкомпилер не работал, т.е. галочку при компиляции ставиш, а толку не будет.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  5. #5
    понятно, все с ними) т.е. у меня 2010 года 2.0b - это уже более менее свежачок, я правильно понял?

  6. #6
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от Максим Посмотреть сообщение
    понятно, все с ними) т.е. у меня 2010 года 2.0b - это уже более менее свежачок, я правильно понял?
    Судя по всему тоже самое что и у меня, т.е. 2.0.0.6.
    2.0.0.9 вышла в конце августа 2011. Вот http://community.develstudio.ru/show...BD%D0%B8%D0%B5

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  7. Пользователь сказал cпасибо:

    Максим (10.10.2011)

  8. #7
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Да, этого достаточно. Часть будет в base64, часть в urlencode, но я на своём опыте скажу, не одной строчки не писал, всё выковырил. Даже формы.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  9. Пользователь сказал cпасибо:

    Максим (10.10.2011)

  10. #8
    Главный Разработчик Аватар для Devel
    Регистрация
    11.03.2010
    Сообщений
    1,231
    BCompiler компилирует реально в байт-код, он похож на асм код, только чуть по-проще. В 2.0.0.6 он просто не работал, поэтому сделав дамп памяти программы можно обнаружить куски пхп кода, а в 2.0.0.9 эта функция исправлена, хочу заметить, что через бкомпилер проходит только код в событиях. Проверено, OllyDebug ничего не находит, это было последний раз когда я тестировал. Программы, которые были не собраны, а просто скомпилированы - легко взломать, ибо код не перекодируется в байт-код.

    Формы никак не шифруются, и все остальное тоже.

  11. #9
    vGhost еще раз вам спасибо, вроде все по удалял)

    P.S. Опыт - это то, что накапливается коллективно, в течении столетий...

  12. #10
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Кстати, Devel, а не хотите поставить в студию bcompiler поновей, ну хотяб 0.18, а то, то что в ней стоит, вообще древность. 0.18 кстати, любой код умеет компилить, и процедуры, и классы и даже простой код из main() потока. Проверял, на ура всё идёт.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  13. #11
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от Devel Посмотреть сообщение
    Проверено, OllyDebug ничего не находит, это было последний раз когда я тестировал. Программы, которые были не собраны, а просто скомпилированы - легко взломать, ибо код не перекодируется в байт-код.
    Ну, я как то терь ручками если надо код бкомпилером формирую, в файликах в папочке скриптс. Потом эти файлики цепляются и проблем нет. Просто мне, если чесно не очень нравится подход "пихаем всё в один exe", а также я всё ещё сижу на 2.0.0.6 по причине её большей стабильности в работе с потоками.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  14. #12
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    Цитата Сообщение от vGhost Посмотреть сообщение
    Ну, я как то терь ручками если надо код бкомпилером формирую, в файликах в папочке скриптс. Потом эти файлики цепляются и проблем нет.
    Не подскажете как это делать?

  15. #13
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Тут вобщем то ничего сложного нет, вам просто лень подумать, честно лень! Ладна, ждите, щас сваяю небольшой пример. Заодно посмотрите мою новую модель объектно ориентированного программирования в ds! Которая ИМХО охренеть как мегаудобна по сравнению с тем процедуральным подходом который заложен в ds по умолчанию Devel'ом.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  16. #14
    Главный Разработчик Аватар для Devel
    Регистрация
    11.03.2010
    Сообщений
    1,231
    Цитата Сообщение от vGhost Посмотреть сообщение
    Кстати, Devel, а не хотите поставить в студию bcompiler поновей, ну хотяб 0.18, а то, то что в ней стоит, вообще древность. 0.18 кстати, любой код умеет компилить, и процедуры, и классы и даже простой код из main() потока. Проверял, на ура всё идёт.
    Этот тоже все это умеет. Там уже версия 1+ есть, для php 5.3

  17. #15
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    может просто не там копаю... bamcompiler ведёт меня только на bambalam сайт, а это прямой путь к WinBinder
    ------
    кажется я совершил фатальную ошибку... надо искать bcompiler а не bam... можете не утруждать себя, если ещё не поздно, кажется я вышел на след :Р
    ------
    да, всё очень просто... значит буду использовать, спасибо

    Цитата Сообщение от vGhost Посмотреть сообщение
    Заодно посмотрите мою новую модель объектно ориентированного программирования в ds! Которая ИМХО охренеть как мегаудобна по сравнению с тем процедуральным подходом который заложен в ds по умолчанию Devel'ом.
    Если это $Form1->button вместо c('Form1->button') , то я уже оценил
    Когда начну новый преокт - перейду на вашу модель, а сейчас в существующих проектах ссылки на объекты присваиваются переменным при инициализации программы, чтобы в процессе основной работы не встречались c()
    Да и в инициализации этих c() мало, т.к. в основном все объекты создаются динамически
    Последний раз редактировалось roxblnfk; 10.10.2011 в 23:57.

  18. #16
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от Devel Посмотреть сообщение
    Этот тоже все это умеет. Там уже версия 1+ есть, для php 5.3
    А тогда почему в 2.0.0.6 оно не работало?



    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Если это $Form1->button вместо c('Form1->button') , то я уже оценил
    Нее, даже рядом не стояло. В той модели ооп работой с формами даже не пахло.

    Это совершенно другая идея, хотя выросла она вобщем то из той. Вернее она ещё не совсем выросла, я всё ещё продолжаю её совершенствовать

    Короче вот архив приложенный, как это работает, исходники программы кладутся в папочку scripts_source (в нём же смотреть новую модель), далее там же есть файл dd.bat в нём прописать правильный путь к php.exe, в файле "compile.php" сам компилятор в байткод, если его можно так назвать. В нём вписываются сами файлики.. После компиляции файлики помещаются в папочку data ДА ДА! Иначе вы не сможете их прицепить к exe, ds упорно ругается на байткод. В папочку скриптс кладётся маленький пхп файл заглушка который потом при старте подключает эти байт-компилированные файлы из ресурсов exe'шника.. Вуаля готово. Программу можно не собирать в 1 exe, ту хрень что в папке дата окажется смело можно с программой класть рядом, всё равно ваши пхп файлики трудно будет превратить в исходник.


    Теперь про модель. Я позже наверное создам отдельную тему, но суть этой новой модели:
    1) в самой дс строяться только формы и компоненты (мне так удобней)
    2) не одного события в самой дс вы не найдёте, их там просто нет.
    3) всем компонентам и формам даются нормальные имена (можете не давать если не хотите, но я привык писать "правильные" программы)
    4) вся логика работы формы находится в классе который называется FormNameClass
    5) на каждую форму создаётся свой класс и свой файл который повторяет имя этой формы.

    События на форму цепляются в объекте так:
    Код HTML:
    'onClick'           => Array('AddHellow', 'AddSomeText', 'AddDate', 'CloseProg'),
    тип события   ->    массив имён компонентов которым это событие вешать
    В качестве вызываемого метода будет использован метод текущего класса (если не указано иное, потом покажу как) с именем состоящим из типа события и имени компонента, т.е. для кнопки с именем AddHellow при клике будет вызван метод onClickAddHellow

    Если надо повесить на нескольких разных событий всего один метод, то это делается так:
    Код HTML:
    'OnKeyUp'			=> Array(Array('ServerList', 'onChangeServerList')),
    'onMouseUp'			=> Array(Array('ServerList', 'onChangeServerList')),
    Где первый элемент внутреннего массива это имя компонента, а второй элемент это название метода.

    Вот пример простого класса (сорри за комменты у меня широкий монитор):

    PHP код:
    <?php

    CLASS MainFormClass  EXTENDS vGObjectForm
    {
        Protected   
    $MemoLength     0;
        Protected   
    $Texts          = Array(
                                        
    'Мама мыла раму',
                                        
    'Самая страшная борьба во мне - это борьба моего чувства юмора с моим воспитанием :(',
                                        
    'Интернет держится на двух китах: порнографии и котах.',
                                        
    'Делаю пристройку к кафе. Вместо швеллеров хозяин будет класть рельсы, потому что он их украл.',
                    );
        
        
    //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        
    Protected   $___Events      = Array(
                                        
    'onClick'           => Array('AddHellow''AddSomeText''AddDate''CloseProg'),
                                        
    'onCloseQuery'      => Array('self'),
                    );
        
    //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        // property -> array(global_name, [property, [property, .... N * [property]]])
        
    Protected   $___MustBeObj   = Array(
                                        
    'SCR'               => Array('SCREEN'),
                                        
    'APP'               => Array('APPLICATION'),
                    );
        
    //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        
    Static      $SelfObj        False;
        
        
    /*
        *   Можете сие считать аналогом onCreate, хотя и onCreate событие создать можно, но имхо это смысла лишено т.к. 
        *   выполняться они всё равно будут практически одновременно но по очереди с данным конструктором. Кто первей не проверял.
        */
        
    Public Function __construct($Name)
        {
            
    parent::__construct($Name);
            
    self::$SelfObj $this;
            
            
    $this->self->doubleBuffered True;
            
    $this->ChangeStatusTimer    SetTimer(1000'MainFormClass::onTimerChangeStatus();');
        }
        
        
    //########################################################################################################################################################################################################
        
        /*
        *   Описание метода
        *
        *   @return void
        */
        
    Public Function onClickAddHellow()
        {
            
    $this->AddTextToTextM('Hellow World!');
        }
        
        
    //########################################################################################################################################################################################################
        
        /*
        *   Описание метода
        *
        *   @return void
        */
        
    Public Function onClickAddSomeText()
        {
            
    $this->AddTextToTextM($this->Texts[Rand(03)]);
        }
        
        
    //########################################################################################################################################################################################################
        
        /*
        *   Описание метода
        *
        *   @return void
        */
        
    Public Function onClickAddDate()
        {
            
    $this->AddTextToTextM(Date('Y.m.d H:i:s'));
        }
        
        
    //########################################################################################################################################################################################################
        
        /*
        *   Описание метода
        *
        *   @param  integer идентификатор вызываемого объекта
        *
        *   @return void
        */
        
    Public Function onClickCloseProg($OID)
        {
            If(
    $this->onCloseQueryMainForm($OID))
            {
                
    $this->APP->terminate();
            }
        }
        
        
    //########################################################################################################################################################################################################
        
        /*
        *   Описание метода
        *
        *   @param  integer идентификатор вызываемого объекта
        *   @param  boolean флаг передающий можно ли приложению закрыться?
        *
        *   @return boolean флаг передающий можно ли приложению закрыться после выбора юзера
        */
        
    Public Function onCloseQueryMainForm($OID$CanClose True)
        {
            
    $CanClose MessageBox('Вы действительно хотите выйти из программы?''Внимание:'MB_YESNO MB_ICONINFORMATION) == 6;
            
    __setVarEx($CanClose);
            Return 
    $CanClose;
        }
        
        
    //########################################################################################################################################################################################################
        
        /*
        *   Описание метода
        *
        *   @return void
        */
        
    Static Public Function onTimerChangeStatus()
        {
            
    self::$SelfObj->MainStatus->simpleText 'Йа статик таймер, текущее время: ' Date('H:i:s');
        }
        
        
    //########################################################################################################################################################################################################
        
        /*
        *   Описание метода
        *
        *   @param  string  текст для добавления в компонент
        *
        *   @return void
        */
        
    Protected Function AddTextToTextM($text)
        {
            
    $this->TextM->setFocus();
            
    $this->TextM->selStart  $this->MemoLength;
            
    $this->TextM->selText   $text "\r\n";
            
    $this->MemoLength       $this->MemoLength StrLen($text);
        }
    }

    ?>
    Вложения
    Последний раз редактировалось vGhost; 11.10.2011 в 01:55.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  19. Пользователь сказал cпасибо:

    roxblnfk (11.10.2011)

  20. #17
    vGhost, Как жеж красиво код оформлен))) прямо загляденье. Похвально. Вот все бы так...

  21. #18
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Да, забыл сказать, вот в этом моменте:
    далее там же есть файл dd.bat в нём прописать правильный путь к php.exe,
    Следите чтоб версия bcompiler'а вашего внешнего php никак не была выше той что в ds (v0.14s) иначе работать не будет, до тех пор пока вы не обновите bcompiler в дс.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  22. #19
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    ЗАЧЁТ!

    по мелочи выскажу мыслишки:

    [s]php.exe требуемой версии нужно сложить в папке scripts_source или поставлять с архивом:
    указал путь до php.exe вебсервера, нашёл нужную php_bcompiler под него, скомпилил скрипты... при запуске прога ругается на отсутствие класса vGFormLinks по причине того, что скомпилил я в версии 5.3.1, ибо нужной 5.2.4 нету... придётся искать и качать [/s] (опоздал)

    чтобы не путаться, лучше сразу переименовывать файлы с байт-кодом в *.phb
    (исчезнет надобность указывать файлы вручную для инклуда, да и видно сразу будет, куда текстовым редактором не надо залезать )

    Судя по коду
    PHP код:
    ForEach(Array_Keys($GLOBALS['__config']['formsInfo']) AS $name)
    {
        GLOBAL $
    $name;
        
    $CName $name 'Class';
        $
    $name Class_Exists($CName) ? (NEW $CName($name)) : NEW vGFormLinks($name);
        
    DSApi::reg_glVar($name);

    Сейчас переменным $$name ($name - имя форм) присваиваются объекты соответствующих классов $name.'Class'
    Мне кажется удобнее взять префикс Form_ для классов форм вместо постфикса Class (или оба использовать с приоритетом на первый)
    Либо пользоваться ассоциативным массивом Array('FormName'=>'className', 'Form2'=>'Form2Class') [вариант не для всех]

    PHP код:
    ForEach(Array_Keys($GLOBALS['__config']['formsInfo']) AS $name)
    {
        
    $FName 'vGAutoReg' $name 'OnCreate';
        If(
    Function_Exists($FName))
        {
            
    $FName();
        }

    [s]А функции, обрабатывающие событие OnCreate для форм, зануть в классы этих форм[/s] (опять наперёд написал, а потом только прочитал комменты в коде )

    Пока не совсем понимаю, как быть с динамически создаваемыми компонентами.
    На моём опыте присваивание созданному таким образом компоненту имени ничего не даёт, т.е. c($name) не работает (работает с идентификатором: c($obj->self) ). Можно зацепиться, конечно, за $obj->self, т.к. это int а не string
    Да и не для всех объектов целесообразно применять имена

    [hr]
    *[s] - зачеркнуто, кажется на форуме не весь привычный bbcode включен
    Последний раз редактировалось roxblnfk; 11.10.2011 в 12:18.

  23. #20
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от roxblnfk Посмотреть сообщение
    [s]php.exe требуемой версии нужно сложить в папке scripts_source или поставлять с архивом:
    указал путь до php.exe вебсервера, нашёл нужную php_bcompiler под него, скомпилил скрипты... при запуске прога ругается на отсутствие класса vGFormLinks по причине того, что скомпилил я в версии 5.3.1, ибо нужной 5.2.4 нету... придётся искать и качать [/s] (опоздал)
    У меня в c:\wlmp php версии 5.2.14, а в ds 5.2.4 но работает. А вот с 5.3 уже да, не выйдет, там нужен другой bcompiler, ибо тот bcompiler что с 5.2 работает не станет цепляться к 5.3. Devel говорил выше что для 5.3 вышел bcompiler версии 1.+


    Цитата Сообщение от roxblnfk Посмотреть сообщение
    чтобы не путаться, лучше сразу переименовывать файлы с байт-кодом в *.phb
    В принципе можно, хуже не станет, хотя я не путаюсь и так, т.к. они лежат в другой папке.

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    (исчезнет надобность указывать файлы вручную для инклуда, да и видно сразу будет, куда текстовым редактором не надо залезать )
    Это как это она исчезнет? Студия ругается на байткод при проверке синтаксиса, она его не понимает при сборке или компиляции. По этому эти файлы можно только в ресурсы запихать, а оттудова они никак не будут подключаться сами. По этому их придётся ручками.
    Или вы нашли другой способ?

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Судя по коду
    Сейчас переменным $$name ($name - имя форм) присваиваются объекты соответствующих классов $name.'Class'
    Мне кажется удобнее взять префикс Form_ для классов форм вместо постфикса Class (или оба использовать с приоритетом на первый)
    В этом есть рациональное зерно, возможно так и поступлю, только наверное сделаю TForm .$name и без "_". (ненавижу подчёркивания, надух не переношу, вот хоть пристрелите, а подчёркивания не буду юзать. Скажем так, это мой личный таракан в голове.)

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Либо пользоваться ассоциативным массивом Array('FormName'=>'className', 'Form2'=>'Form2Class') [вариант не для всех]
    Это приведёт к появлению лишнего не являющегося необходимостью кода. А также затруднит понимание кода. Потому что в данном случае, я вижу форму с FormName и я знаю что все события формы находятся в классе TFormFormName который находится в файле FormName.php
    А если позволить делать с массивом, то вышенаписанное не будет являться правдой и придётся сначала искать этот массив чтоб посмотреть у какой формы откуда ноги растут.


    Цитата Сообщение от roxblnfk Посмотреть сообщение
    PHP код:
    ForEach(Array_Keys($GLOBALS['__config']['formsInfo']) AS $name)
    {
        
    $FName 'vGAutoReg' $name 'OnCreate';
        If(
    Function_Exists($FName))
        {
            
    $FName();
        }

    [s]А функции, обрабатывающие событие OnCreate для форм, зануть в классы этих форм[/s] (опять наперёд написал, а потом только прочитал комменты в коде )
    Это устаревший код, остался только для совместимости с предыдущими проектами. Сейчас его замещает конструктор в TFormFormName
    Суть этого кода была вот в чём (как я уже писал выше, дс я уже давно использую только как компилятор и дизайнер форм)
    PHP код:
    Function vGAutoRegConfigEditorOnCreate()
    {
        GLOBAL 
    $ConfigEditor;
        
        
    $ConfigEditor->self->doubleBuffered        True;
        
    $ConfigEditor->grid1->doubleBuffered    True;
        
    $ConfigEditor->ChangeRowProcEx            False;
        
        
    //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        
    set_event($ConfigEditor->HideNoExecute->self,                'OnClick',        'OnClickCEAllCB');
        
    set_event($ConfigEditor->HideCubicFiles->self,                'OnClick',        'OnClickCEAllCB');
        
    set_event($ConfigEditor->HideSizeNoChange->self,            'OnClick',        'OnClickCEAllCB');
        
    //
        //  МНОГО МНОГО других событий.
        //
        
    $ConfigEditor->grid1->setOption('goThumbTracking'true);
        
    //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        
    $ConfigEditor->BackGrImg->LoadFromFile(ProgramRoot 'background.png');
    }
    Function 
    OnShowConfigEditor($oid$DoNotIncludeInfoReader False$GreedCurrentRow False)
    {
        GLOBAL 
    $ConfigEditor;
        
    // .........
    }
    Function 
    onCloseConfigEditor()
    {
        GLOBAL 
    $ConfigEditor;
        
    // .........

    В принципе у вас этого "старого" кода, для которого нужна эта обратная совместимость - нет, так что эту часть можн овырезать нафигГг

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Пока не совсем понимаю, как быть с динамически создаваемыми компонентами.
    А что с ними не так? Объясните где проблема, т.к. я её в упор не вижу. Сувать в конструктор и всё или там когда это потребуется выполнять создание. Посмотрите в моём примере, компонент таймер создаётся таки динамически.

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    На моём опыте присваивание созданному таким образом компоненту имени ничего не даёт, т.е. c($name) не работает (работает с идентификатором: c($obj->self) ). Можно зацепиться, конечно, за $obj->self, т.к. это int а не string
    Да и не для всех объектов целесообразно применять имена
    Вы помойму перемудрили где то. Нафига c($name) когда у вас и так есть ссылка на объект при его создании?
    Последний раз редактировалось vGhost; 11.10.2011 в 13:09.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  24. #21
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    Цитата Сообщение от vGhost Посмотреть сообщение
    Это как это она исчезнет? Студия ругается на байткод при проверке синтаксиса, она его не понимает при сборке или компиляции. По этому эти файлы можно только в ресурсы запихать, а оттудова они никак не будут подключаться сами. По этому их придётся ручками.
    Или вы нашли другой способ?
    я это к тому, что скрипты подключить в цикле, сканируя папку на наличие *.phb, а не указывать каждый файл вот так:
    PHP код:
    Include(getFileName("{res}/vGHook.php"));
    Include(
    getFileName("{res}/MainForm1.php")); 
    (В общем-то это не значительно)


    Цитата Сообщение от vGhost Посмотреть сообщение
    TForm .$name и без "_". (ненавижу подчёркивания, надух не переношу, вот хоть пристрелите, а подчёркивания не буду юзать. Скажем так, это мой личный таракан в голове.)
    Можно поизгаляться и вместо "_" вставлять жесткий пробел (chr(160)) тоже наглядно, или у вас и на это таракан есть?
    (шутка, конечно, это извращенный немного вариант, как и кириллические названия функций, классов, переменных...)
    Но можно ведь и несколько префиксов делать, опять же.

    Цитата Сообщение от vGhost Посмотреть сообщение
    А что с ними не так? Объясните где проблема, т.к. я её в упор не вижу. Сувать в конструктор и всё или там когда это потребуется выполнять создание. Посмотрите в моём примере, компонент таймер создаётся таки динамически.
    Например в функции AddTextToTextM добавим код
    PHP код:
    $this->label=new Tlabel($this->self);
    $this->label->parent=$this->self;
    $this->label->caption=$text
    как привязать функцию на любое событие лэйбла? Код типа
    PHP код:
    $this->label->onMouseEnter="pre"
    сработает?
    Судя по всему правильнее будет при помощи set_event()? (раньше не знал об этой функции, увидел только сейчас из предыдущего коммента)

    Цитата Сообщение от vGhost Посмотреть сообщение
    Вы помойму перемудрили где то. Нафига c($name) когда у вас и так есть ссылка на объект при его создании?
    Это я к тому, что если указать $this->label->name="label1"; , то c("label1") ни чего не даст, а зачем это надо — уже другой вопрос
    А речь про имена завёл потому что увидел $___Events и не посмотрел, как этот массив позже обрабатывается... а там указываются имена, события и функции... в общем ясно, что можно просто использовать
    set_event(), походу

    кстати, в vGObjectForm :: __construct идёт код
    PHP код:
    If(Count($Element) == 2)
    {
        
    set_event($this->{$Element[0]}->self$Event'$GLOBALS["' $name '"]->' $Element[1]);
        Continue;
    }
    set_event($this->{$Element[0]}->self$Event'$GLOBALS["' $Element[1] . '"]->' $Element[2]); 
    Если в $Element нету элементов с ключами 0 и 1, то будет не очень хорошо. ну или массив из 1 элемента (или просто array() )
    PHP код:
    $Element=array_values($Element);
    If(
    Count($Element) == 2)
    {
        
    set_event($this->{$Element[0]}->self$Event'$GLOBALS["' $name '"]->' $Element[1]);
        Continue;
    }
    If(
    Count($Element) > 2)
        
    set_event($this->{$Element[0]}->self$Event'$GLOBALS["' $Element[1] . '"]->' $Element[2]); 
    ps: почему у хакера в расширении "All View" функция set_event находится в списке стандартных?
    Последний раз редактировалось roxblnfk; 11.10.2011 в 14:08.

  25. #22
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от roxblnfk Посмотреть сообщение
    я это к тому, что скрипты подключить в цикле, сканируя папку на наличие *.phb, а не указывать каждый файл вот так:
    PHP код:
    Include(getFileName("{res}/vGHook.php"));
    Include(
    getFileName("{res}/MainForm1.php")); 
    (В общем-то это не значительно)
    Мм не пробовал, но мне кажется то что вы пишете не получится.
    Пока вы не соберёте программу в один exe это может и будет работать, а вот потом, как вы собираетесь сканировать "папку" '{res}' ? Или я чего то просто не знаю?
    Можно конечно создать правда массив аля Array('vGHook.php') куда вписать только те файлы, которые не имеют одноимённых форм. А файлы у которых имена совпадают с именами форм можно получить и так через Array_Keys($GLOBALS['__config']['formsInfo']).
    Так и сделаю. Как я уже сказал модель ещё в процессе усовершенствования и общими силами из неё может получиться нечто удобное


    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Но можно ведь и несколько префиксов делать, опять же.
    А ради какой цели? Вполне удобно будет TForm в качестве префикса. В итоге
    PHP код:
    <?php
    CLASS TFormMainWnd EXTENDS vGObjectForm
    ....
    CLASS 
    TFormOptions EXTENDS vGObjectForm 
    ....
    CLASS 
    TFormProgressWnd EXTENDS vGObjectForm 
    ...
    Довольно определённо и понятно выглядит.
    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Например в функции AddTextToTextM добавим код
    PHP код:
    $this->label=new Tlabel($this->self);
    $this->label->parent=$this->self;
    $this->label->caption=$text
    Если вы так сделаете, вы создадите туеву хучу лэйблов, если уж на то пошло то яб так поступил:
    PHP код:
        // В содержимое класса vGObjectForm добавить:
        
    Protected   $DinComponents = Array();
        
    // .....
        
    Protected Function Factory($ObjName$Class)
        {
            If(IsSet(
    $this->DinComponents[$Class]) && IsSet($this->DinComponents[$Class][$ObjName]))
            {
                Return 
    $this->DinComponents[$Class][$ObjName];
            }
            
            If(!IsSet(
    $this->DinComponents[$Class]))
            {
                
    $this->DinComponents[$Class] = Array();
            }
            
    $this->DinComponents[$Class][$ObjName] = NEW $Class($this->self);
            
    $this->DinComponents[$Class][$ObjName] = $this->self;
            Return 
    $this->DinComponents[$Class][$ObjName];
        }
        
    //-------------------------------------------------------------------------------------------------------------------
        // а это уже собственно пользовательский класс тформнэйм
        
    Protected Function AddTextToTextM($text
        {
            If(!IsSet(
    $this->DinLabelTextM))
            {
                
    $this->DinLabelTextM        $this->Factory('DinLabelTextM''TLabel');
            }
            
    $this->DinLabelTextM->caption   $text;
            
            
    $this->TextM->setFocus(); 
            
    $this->TextM->selStart  $this->MemoLength
            
    $this->TextM->selText   $text "\r\n"
            
    $this->MemoLength       $this->MemoLength StrLen($text); 
        } 
    Это пока только набросок, на методом Factory надо будет ещё подумать, но примерно я себе это вижу так.

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    как привязать функцию на любое событие лэйбла? Код типа
    PHP код:
    $this->label->onMouseEnter="pre"
    сработает?
    Судя по всему правильнее будет при помощи set_event()? (раньше не знал об этой функции, увидел только сейчас из предыдущего коммента)
    Вобщем то вы сами ответили на свой вопрос Я заметил у вас есть такая прикольная привычка, писать вопрос и тут же на него в этом же самом сообщении отвечать


    Цитата Сообщение от roxblnfk Посмотреть сообщение
    кстати, в vGObjectForm :: __construct идёт код
    Если в $Element нету элементов с ключами 0 и 1, то будет не очень хорошо. ну или массив из 1 элемента (или просто array() )
    Вы щас ерунду сморозили. В этом массиве не могут отсутствовать эти элементы. У модели есть определённые правила поведения и правила создания компонентов. Также как например нельзя через file_get_contents пытаться сохранить файл, а через file_put_contents нельзя читать файлы, так и тут, у массива $___Events есть определённые правила помещения в него элементов, для придания ему правильной структуры, которые надо соблюдать. Если их не соблюдать то никакой программы не получится, это можно так и через инструкцию print пытаться файлы качать и возмущаться почему не работает. Если я в него засуну скажем текстовый файл это тоже будет ошибкой. Так что тут придраться не к чему, надо просто следовать структуре при его создании. А предусмотреть все глупости которые могут придумать новички нет смысла, данный подход расчитан не на новичков.

    Если я вас не правильно понял в этом пункте, приведите мне ситуацию когда $Element окажется массивом не имеющим 2 или 3 элемента начинающихся не с 0 или имеющих не цифровые ключи.


    Цитата Сообщение от roxblnfk Посмотреть сообщение
    ps: почему у хакера в расширении "All View" функция set_event находится в списке стандартных?
    Не понял вопроса, а почему бы ей там не находиться?
    Последний раз редактировалось vGhost; 11.10.2011 в 15:17.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  26. #23
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    Цитата Сообщение от vGhost Посмотреть сообщение
    Мм не пробовал, но мне кажется то что вы пишете не получится.
    Пока вы не соберёте программу в один exe это может и будет работать, а вот потом, как вы собираетесь сканировать "папку" '{res}' ? Или я чего то просто не знаю?
    Можно конечно создать правда массив аля Array('vGHook.php') куда вписать только те файлы, которые не имеют одноимённых форм. А файлы у которых имена совпадают с именами форм можно получить и так через Array_Keys($GLOBALS['__config']['formsInfo']).
    Так и сделаю. Как я уже сказал модель ещё в процессе усовершенствования и общими силами из неё может получиться нечто удобное
    {res} не получится, но ведь вы сами писали, что предпочитаете хранить байт-скрипты не запаковывая в exe
    Но, в прочем, в случае с {res}: можно при компиляции автоматически создавать массив скомпиленных файлов в "маленьком пхп файле-заглушке" (т.е. генерировать файл автоматически, за содержание которого будет отвечать текущая версия вашей модели)

    ============================

    Цитата Сообщение от vGhost Посмотреть сообщение
    Если вы так сделаете, вы создадите туеву хучу лэйблов, если уж на то пошло то яб так поступил:
    вопрос был не в куче лэйблов (с туевой хучей и так было ясно), а в том, как прикрепить событие... в общем вопрос решён ответ - set_event()

    Щас будет ещё одна ерунда, не носящая ни какого смысла в рамках нашей дискуссии:
    Было дело с месяц назад: писал класс для кнопки с произвольными картинками в разных состояних (короче пользовательская заскинированная кнопка), т.к. стандартные кнопки фокусят на себя + альфа-скин не всегда будет доступен и в альфа-скинах не описать индивидуальные кнопки.
    Та ещё хрень, пардонте Поскольку кнопака состояла из двух слоёв [фон-картинка][текст] (а позже появился и тертий слой - картинка для progressbar'а), то в классе я делал static переменную для массива всех объектов этого класса, чтобы связывать элементы слоёв каждого объекта и обрабатывать события, происходившие на любом из этих элементов т.е. навожу курсор на кнопку - кнопка меняет состояние (текст меняет стиль, картинки меняются на другие). Я не хвастаюсь, потомучто таким кастыльным кодом можно только позориться, но я счастлив, ибо сделал сам в состоянии ещё бОльшего незнания DS, чем сейчас


    ============================

    Цитата Сообщение от vGhost Посмотреть сообщение
    Вы щас ерунду сморозили. В этом массиве не могут отсутствовать эти элементы. У модели есть определённые правила поведения и правила создания компонентов. … у массива $___Events есть определённые правила помещения в него элементов, для придания ему правильной структуры, которые надо соблюдать. Если их не соблюдать то никакой программы не получится … Если я в него засуну скажем текстовый файл это тоже будет ошибкой. Так что тут придраться не к чему, надо просто следовать структуре при его создании. А предусмотреть все глупости которые могут придумать новички нет смысла, данный подход расчитан не на новичков.
    Правила есть, но их можно по-разному трактовать. Цитирую вас же:
    Цитата Сообщение от vGhost Посмотреть сообщение
    Если надо повесить на нескольких разных событий всего один метод, то это делается так:
    Код HTML:
    'OnKeyUp'			=> Array(Array('ServerList', 'onChangeServerList')),
    'onMouseUp'			=> Array(Array('ServerList', 'onChangeServerList')),
    Где первый элемент внутреннего массива это имя компонента, а второй элемент это название метода.
    Выделил два слова:
    первый элемент - это не значит элемент с индексом 0, это значи просто первый
    В массиве arary('a123a'=>'one','zzz'=>'two',0=>'three') первым элементом будет не тот, который с индексом 0
    Ну это уже философия, в общем мы поняли друг друга. К строгой форме должна быть строгая документация

    ============================

    Цитата Сообщение от vGhost Посмотреть сообщение
    Если я вас не правильно понял в этом пункте, приведите мне ситуацию когда $Element окажется массивом не имеющим 2 или 3 элемента начинающихся не с 0 или имеющих не цифровые ключи.
    Если при написании класса указать
    PHP код:
    Protected   $___Events      = Array(
        
    'onClick'           => Array(Array('ServerList'),Array()),
        
    'onKeyUp'            => Array(Array(1=>'ServerList'/*чем не первый элемент? :Р*/'onChangeServerList'))
    ); 
    С другой стороны вы правы — этот подход не для новичков, но что мы теряем?

    ============================

    Цитата Сообщение от vGhost Посмотреть сообщение
    Не понял вопроса, а почему бы ей там не находиться?
    Ну ведь это не стандартная функция php. Она же есть только в DS

    ============================

    ps:
    Цитата Сообщение от vGhost Посмотреть сообщение
    это можно так и через инструкцию print пытаться файлы качать и возмущаться почему не работает
    ну да, только одним принтом не получится
    PHP код:
    print($txt=file_get_contents('http://.../')); 

  27. #24
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Выделил два слова:
    первый элемент - это не значит элемент с индексом 0, это значи просто первый
    Вообщето значит. В пхп элементы не ассоциативных массивов начинанаются с нуля, если вы принудительно не укажете обратное. И первый элемент массива это как раз таки элемент с индексом ноль. Вы путаете понятия порядок и индекс. Это совершенно разные вещи. В нумерованных массивах, в пхп, у пятого элемента массива будет индекс 4, а у 100 элемента массива будет индекс 99. В пхп индекс массива и порядковый номер элемента это не одно и тоже. Индекс будет на 1 меньше. Опять же прошу заметить это всё справедливо, для автоинкрементных массивов, т.е. когда вы не задаёте ключ элемента принудительно, т.е. то что является "поведением массива по умолчанию". Простое подтверждение:
    $ar = Array(1,1,1,1,1);
    Echo Count($ar); // выдаст 5 элементов! Потому что их действительно пять элементов, хотя элемента с индексом 5 не существует, потому что индексы в массивах начинаются с 0.

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    В массиве arary('a123a'=>'one','zzz'=>'two',0=>'three') первым элементом будет не тот, который с индексом 0
    Ну это уже философия, в общем мы поняли друг друга. К строгой форме должна быть строгая документация
    Вы не в те дебри полезли. Требования при создании массива евентс ясные и чёткие: никаких ассоциативных массивов и явных указаний ключей.


    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Если при написании класса указать
    PHP код:
    Protected   $___Events      = Array(
        
    'onClick'           => Array(Array('ServerList'),Array()),
        
    'onKeyUp'            => Array(Array(1=>'ServerList'/*чем не первый элемент? :Р*/'onChangeServerList'))
    ); 
    С другой стороны вы правы — этот подход не для новичков, но что мы теряем?
    Вот тперь скажите, а нафига так делать? Ну вот просто где логика данного действия? Ради чего может понадобиться явно указывать счётчик в 1? И почему тогда 1? Почему не 100? 1000? А ещё можно и так:
    PHP код:
    Protected   $___Events      = Array(
        
    'onKeyUp'            => Array(Array(Rand(199999)=>'ServerList'Rand(10000099999999)=> 'onChangeServerList'))
    ); 
    Вот если вы мне приведёте логическое обоснование необходимости вот в таком коде: Array(1=>'ServerList'
    Тогда я напишу код проверки и вычисления "первого", "второго" и "третьего" элемента. А до тех пор я буду считать это не нужным, вредным(в плане производительности и легкочитаемости) кодом.

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Ну ведь это не стандартная функция php. Она же есть только в DS
    Не совсем так, дело в том что тут не стандартный пхп, по этому вы будете удивлены сколько ещё ф-й даже сам пхп считает своими встроенными и родными. Вообще в пхп стандартными являются те ф-и которые не были определены в самом пхп коде. А тут туева хуча ф-й из PHP4Delphi и все они считаются родными для движка.
    Вот попробуйте под дс выполнить:
    http://php.net/manual/en/function.ge...-functions.php

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    ну да, только одним принтом не получится
    я имел в виду напрямую качать через инструкцию принт в оперативную память, а не выводить скаченное из памяти.
    Последний раз редактировалось vGhost; 11.10.2011 в 17:40.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  28. #25
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Кстати, по поводу моей фразы, к которой вы придрались:
    Где первый элемент внутреннего массива это имя компонента, а второй элемент это название метода.
    даже если вы сделаете вот так:
    Array(1=>'ServerList', 'onChangeServerList')
    Моя фраза останется верной. Первый элемент останется первым, и всё сказанное мной останется верным. Единственное что, вы сделаете свой код не рабочим такими манипуляциями, т.к. поменяете порядок индексов в массиве. При том, что я нигде, "в инструкции" не писал что это надо делать.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  29. #26
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    Цитата Сообщение от vGhost Посмотреть сообщение
    Вообщето значит. В пхп элементы не ассоциативных массивов начинанаются с нуля, если вы принудительно не укажете обратное. И первый элемент массива это как раз таки элемент с индексом ноль. Вы путаете понятия порядок и индекс. Это совершенно разные вещи. В нумерованных массивах, в пхп, у пятого элемента массива будет индекс 4, а у 100 элемента массива будет индекс 99. В пхп индекс массива и порядковый номер элемента это не одно и тоже. Индекс будет на 1 меньше. Опять же прошу заметить это всё справедливо, для автоинкрементных массивов, т.е. когда вы не задаёте ключ элемента принудительно, т.е. то что является "поведением массива по умолчанию". Простое подтверждение:
    $ar = Array(1,1,1,1,1);
    Echo Count($ar); // выдаст 5 элементов! Потому что их действительно пять элементов, хотя элемента с индексом 5 не существует, потому что индексы в массивах начинаются с 0.
    Это всё мне известно и должно быть известно любому начинающему... Но из той цитаты, что я привёл, нет ни слова о том, должен быть ассоциативный массив или нет, упорядоченный или нет. Лично у меня складывается впечатление о том, что речь там идёт именно о порядке элементов переданного массива.

    Цитата Сообщение от vGhost Посмотреть сообщение
    Вы не в те дебри полезли. Требования при создании массива евентс ясные и чёткие: никаких ассоциативных массивов и явных указаний ключей.
    Я исходил только из текста вашего сообщения, наверное мне не попадалась документация по эвентам.

    Цитата Сообщение от vGhost Посмотреть сообщение
    Вот тперь скажите, а нафига так делать? Ну вот просто где логика данного действия? Ради чего может понадобиться явно указывать счётчик в 1? И почему тогда 1? Почему не 100? 1000?
    А почему бы и нет? По логике можно, если не написано обратное
    Цитата Сообщение от vGhost Посмотреть сообщение
    А ещё можно и так:
    PHP код:
    Protected   $___Events      = Array(
        
    'onKeyUp'            => Array(Array(Rand(199999)=>'ServerList'Rand(10000099999999)=> 'onChangeServerList'))
    ); 
    А так нельзя не срабоатет такой код, но суть ясна.

    Цитата Сообщение от vGhost Посмотреть сообщение
    Вот если вы мне приведёте логическое обоснование необходимости вот в таком коде: Array(1=>'ServerList'
    Тогда я напишу код проверки и вычисления "первого", "второго" и "третьего" элемента. А до тех пор я буду считать это не нужным, вредным(в плане производительности и легкочитаемости) кодом.
    В общем можно считать две новых строчки того кода просто моим подходом (я бы сделал так), а ваш комментарий ("… первый … второй …") просто кратким комментарием, а не чёткой инструкцией к применению.
    А так, обычно в комментариях к своему коду я указываю, под какими ключами какие элементы что значат, а не то, что "первый" и "второй" , например:
    // $b=array(0=>имя компонента, 1=>название метода, (int)2=>id или еще чего).

    Цитата Сообщение от vGhost Посмотреть сообщение
    Не совсем так, дело в том что тут не стандартный пхп, по этому вы будете удивлены сколько ещё ф-й даже сам пхп считает своими встроенными и родными. Вообще в пхп стандартными являются те ф-и которые не были определены в самом пхп коде. А тут туева хуча ф-й из PHP4Delphi и все они считаются родными для движка.
    Вот попробуйте под дс выполнить:
    http://php.net/manual/en/function.ge...-functions.php
    если бы DS подключал своё расширение (php extension), как это делает winbinder, то у меня вопроса не возникло бы, откуда взялась там set_event(). Про PHP4Delphi не знал (пробовал только похожее по названию Delphi4PHP), теперь пополнилось чтиво на досуг

    Цитата Сообщение от vGhost Посмотреть сообщение
    я имел в виду напрямую качать через инструкцию принт в оперативную память, а не выводить скаченное из памяти.
    Это была просто плоская шутка..

    Ещё раз спасибо за результаты старания, новая модель довольно удобная. Было бы супер, если бы и инструкция потом качественная была И совместимость с ds 3, когда/если та выйдет.

  30. #27
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Это всё мне известно и должно быть известно любому начинающему... Но из той цитаты, что я привёл, нет ни слова о том, должен быть ассоциативный массив или нет, упорядоченный или нет. Лично у меня складывается впечатление о том, что речь там идёт именно о порядке элементов переданного массива.
    Там ещё вообще никакой документации нету. Это была предварительная даже не альфа, версия. Целью выкладывания оной было получить немного критики чтоб произвести улучшение тех моментов которые я мог упустить или не заметить. В принципе я получил что хотел

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    Я исходил только из текста вашего сообщения, наверное мне не попадалась документация по эвентам.
    1) я вёл речь про "свой" массив событий
    2) и да вам она не могда попасться, т.к. я её ещё не писал, я просто в общих чертах в кратце рассказал и не более.

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    А почему бы и нет? По логике можно, если не написано обратное
    Вы понимаете что это уже получается без предметный разговор, ради самого разговора, по типу "еслиб да кабы то во рту рослиб грибы"?
    Вот есть в пхп такое понятие как call back ф-и, в документации написано что надо передать либо строку - имя ф-и, либо массив состоящий их двух элементов, первый это ссылка на объект, а второй это название метода. Почему вы не пристаёте к разработчикам пхп, спрашивая у них, а что если я передам место Array($object, 'foo'), скажем Array(1=>$object, 'foo') или Array(123121=>$object, 'foo')?
    Этот стандарт не мной придуман так что я не стану за него отдуваться

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    А так нельзя не срабоатет такой код, но суть ясна.
    Честно говоря не знаю, не когда не проверял, просто даже и в мыслях не когда не было, делать элементам рэндомные ключи.

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    А так, обычно в комментариях к своему коду я указываю, под какими ключами какие элементы что значат, а не то, что "первый" и "второй" , например:
    // $b=array(0=>имя компонента, 1=>название метода, (int)2=>id или еще чего).
    Вот когда я её, документацию, буду писать, так и поступлю

    Цитата Сообщение от roxblnfk Посмотреть сообщение
    если бы DS подключал своё расширение (php extension), как это делает winbinder, то у меня вопроса не возникло бы, откуда взялась там set_event(). Про PHP4Delphi не знал (пробовал только похожее по названию Delphi4PHP), теперь пополнилось чтиво на досуг
    Вообще пхп можно собрать монолитом как бэ, т.е. все привычные расширения типа mysql, curl, mbstring и т.д. не в виде длл, а внутри ядра пхп4тс.длл В данном случае с Delphi4PHP это как раз тот самый случай. И да, я вечно путаю как правильно Delphi4PHP или PHP4Delphi. Есть и то и то, только одно это то что тут в дс, а другое это визуальная среда для разработки сайтов.

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  31. #28
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    Цитата Сообщение от vGhost Посмотреть сообщение
    Честно говоря не знаю, не когда не проверял, просто даже и в мыслях не когда не было, делать элементам рэндомные ключи.
    дело не в рандоме, а вообще в наличии там функции

    Цитата Сообщение от vGhost Посмотреть сообщение
    И да, я вечно путаю как правильно Delphi4PHP или PHP4Delphi. Есть и то и то, только одно это то что тут в дс, а другое это визуальная среда для разработки сайтов.
    теперь и я буду.. ))
    Последний раз редактировалось roxblnfk; 11.10.2011 в 19:20.

  32. #29
    Опытный Аватар для roxblnfk
    Регистрация
    17.08.2011
    Адрес
    Россия, г. Рыбинск
    Сообщений
    313
    заметил, что bcompiller в phb скриптах указывает абсолютный путь до скрипта-исходника.
    Не знаете, зачем?

  33. #30
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Не знаю, но судя по всему это максимум на вывод ошибок влияет, указывая что ошибка произошла в файле на не существующем у меня диске (это если про дс), так что меня это как то не сильно напрягает

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  34. #31
    Новичок
    Регистрация
    22.06.2011
    Сообщений
    11
    Всем привет! Работаю в последней версии (2.0b), но при установленной галке BCompiler все собирается без шифрования. Т.е. после запуска готовой программы в памяти можно увидеть весь скрипт. Что можно предпринять, чтобы всеже скрыть тело скрипта?

    заранее спасибо за ответы! )

  35. #32
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от valtv Посмотреть сообщение
    Всем привет! Работаю в последней версии (2.0b), но при установленной галке BCompiler все собирается без шифрования. Т.е. после запуска готовой программы в памяти можно увидеть весь скрипт. Что можно предпринять, чтобы всеже скрыть тело скрипта?
    Несколькими постами выше, мой ответ на этот вопрос чем не понравился?

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  36. #33
    Новичок
    Регистрация
    22.06.2011
    Сообщений
    11
    Вплотную занявшись вопросом работает ли BCompiler, установил версию 2.0.0.9 (2.0 plus)....при сборке программ открылся выбор уровня сжатия и судя по всему заработал компилятор. Но радость длилась не долго - все программы где есть функции практически не работают. Т.е. жмем на кнопку к которой по клику присоединен скрипт содержащий Function, а ничего не происходит. Если компилирование отменить (снять галку) то все нормально собирается и работает...В чем трабл и что можно сделать?

    п.с. на стадии сборки никаких ошибок не выдает....если кликать на кнопки 3 раза (столько как раз подпрограмм) то скрипт начинает что-то делать, но до конца не доходит и просто висит

    за день перепробовал разные догадки соскриптом - ни в какую не хочет работать при включенной опции bCompiler! Качал в инете 3 разных версии php_bcompiler.dll, заменял файл в папке с DS, результата -0....что за засада! А без компилирования использовать прогу бессмысленно - разложат по полкам за 3 сек. )...vGhost, нет мыслей на этот счет? )
    Последний раз редактировалось valtv; 16.12.2011 в 21:16.

  37. #34
    Новичок
    Регистрация
    22.06.2011
    Сообщений
    11
    попробовал убрать функции (т.е. тупо 5-6 раз повторил их код в осн. скрипте) - все получилось и нормально скомпилировалось. Значит BCompiler не может отработать по моим подпрограммам. почему??

  38. #35
    Админ Аватар для vGhost
    Регистрация
    27.07.2011
    Адрес
    Самара
    Сообщений
    2,033
    Цитата Сообщение от valtv Посмотреть сообщение
    попробовал убрать функции (т.е. тупо 5-6 раз повторил их код в осн. скрипте) - все получилось и нормально скомпилировалось. Значит BCompiler не может отработать по моим подпрограммам. почему??
    BCompiler всё может и мой пример выше это доказывает. А если вы что то делаете не правильно, то это уже не коем образом не проблемы BCompiler'а..

    __________________________________________________ ________
    Угу, угу... А потом достал из морозильной камеры - и степлером его, степлером!
    Для новичков
    __________________________________________________ ________
    Я практически совсем не задаю вопросов, не думали почему? Потому что я пользуюсь поиском и всегда нахожу ответы на свои вопросы!

  39. #36
    Новичок
    Регистрация
    22.06.2011
    Сообщений
    11
    решил проблему путем использования инструмента "Функции" в DS и поставил галку "обявлять как функцию php". но при таком раскладе после компилирования текст главного скрипта нельзя прочесть из памяти, а вот текст в функциях - можно. Т.е. это полу-решение.....

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения