CMAC

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

* Справочники см. в главном меню!     Windows MEM Register                           Запуск других программ   System - Windows - CPU - MEM - int___ / Register - Машинный уровень ­­­
Уйти на главный Memo


Run_Macro
Структуры и массивы.
Импортируемые ФУНКЦИИ


This file contains all of the defined help links. Please conform to the
style being used when creating additional links.
C:\Me\Src\Helplinks.sh


Файлы, и макро Ме для поддержки языка CMAC
CMAC TAGs- Часто нужные.
Начало макро
Template.Metacommand. Сокращения.Системные переменные.
Help

Условия.
Переменные - Типы Данных - Целый, Действительный, Символьный, Строковый
Выражения. Работа с числами. Арифметика. Строки.

*.DB


Текст
Слово / Знак / Символ / Перекодировка /Атрибут
Строка / деление слияние / вырезка
Сортировка / Поиск / Замена
ШРИФТ - размер знаков в окне

Блок.


Курсор - Передвинуть / установить
Табуляция Позиции

Окно


Вывод на ЭКРАН. ПОКАЗАТЬ. Цвета / Рисунки / bmp

File -      New    Load    Save

Запуск других программ
CPU - Машинный уровень
Время - Timer - Календарь

ERROR


Коды, относящиеся к дисковым операциям:

DLG -Меню - Диалоги.

Вывод на экран - Графика. Рисунки.

Command Shell - ДОС команды.


ExecProg
Компиляция программ
Клавиатура
Принтер
Сканер
Мышка
FTP / InterNet
Примеры макро для тестирования
Примеры применения из Макро.
ЗАМЕЧАНИЯ по РУКОВОДСТВО ПО МАКРО ЯЗЫКУ
*^*
INDEX

1. Используй! Быстрые клав. - (Alt+F9) и посмотреть Menu\Tools\Command Editing

Memo

- мой основной справочник.
  • Справка по JS - Script


  • CSS - СТИЛИ   и Фильтры
  • Использование Form



    Multi-Edit


    !!! При старте работают только те макро,
    что перекомпилированы в
    БИБЛИОТЕКУ Mew.mcl
    §

    Вход / Выход из редактора

    
    Run a Macro - MEW32 /R[macro name]
    Пример - MEW32 /R FastNote    
    
    Добавляю запуск МЕ для Просмотра в браузере IE5,
    вместо AkelPad.exe, что стоял у меня ранее
    .. и стоит - удалить не могу - нехватает знаний. To use the Run a Macro command line switch, type the following at the command prompt: A space between MEW32 and the / is optional, but you must separate multiple command line options with a space. Start A Session - /SN[session_name] MEW32 /R[macro name] Load a List of Files - /@[filelist] Загрузить новый список файлов. MEW32 /R[macro name] Алгоритм, запуска МЕ Описание на файлы Startup.cfg - и на Startup2.cfg §

    Компиляция макро. Сборка библ.

    Компилятор CMAC. - Командная строка. Сборка.- библиотеки макросов, описание. Файлы C:\Me\Utils\Mewmcl32.lst
    и C:\Me\Utils\Recomp32.lst
    Компиляция/Программы. Строка-команды в ярлыке на рабочем столе - C:\Me\CmacWin.exe -L Utils\Recomp32.lst -PMac -ISrc Запись и СОХРАНЕНИЕ УСТАНОВОК МЕ. Макро файл - SetUp.s ^SETSAVE DESCRIPTION: This macro creates INIT.CFG to save all setup parameters --------------------------------------------------------   При нажатии на < Ctrl + F9 > - меню компиляции, надо добавить друг. варианты - Все макро - // "<ME_PATH>CMACWIN.EXE" -L "<ME_PATH>Utils\Recomp32.lst" -P"<ME_PATH>Mac" -I"<ME_PATH>Src" Обновить библиотеку (!!! ТОЛЬКО МЕ ВЫКЛ,!!!) - // "<ME_PATH>CmacWin.exe" -L "<ME_PATH>UTILS\MEWMCL32.LST" -P"<ME_PATH>Mac" -I"<ME_PATH>Src"
     
     1. Compile CMACWIN macro   "<ME_PATH>CMACWIN.EXE" "<FILE>.<EXT>" -P"<MAC_PATH>" -I"<ME_PATH>SRC" -O"<MEERR>" -W -M   2. Find CMACWIN Run-Time error   "<ME_PATH>CMACWIN.EXE" "<FILE>.<EXT>" -P"<MAC_PATH>" -I"<ME_PATH>SRC" -O"<MEERR>" -W -Dxxxx name 3. CMACWIN -L "C:\Program Files\Multi-Edit\Utils\Recomp32.lst" -P"C:\Program Files\Multi-Edit\Mac" -I"C:\Program Files\Multi-Edit\Src" ------------------------------ Перекомпилировать по списку (-L) - C:\Me\Utils\Recomp32.lst и C:\Me\Utils\Mewmcl32.lst §

    Файлы конфигурации Ме

    ======================= • c:\Me\Config\Meconfig.db - ( Делает его макро - Exit.s ) Все меню - Дописываю нач. значения Глоб. переменных. Новые глоб - что надо дописать - для работы моих макро нужны - MyREFORMAT - /GI=gm_Right_Margin = 78 вот здесь сохраняются - переменные, для данное сесии = c:\Me\Config\Sessions\87A40000.MEW изменил этот файл и он уже был не принят. данные из той сессии пропали. если имя GI GS начинается с букы - то оно сохраняется. ! - @ - ~в начале имени - не сохраняется. c:\Me\Config\MEW32X.INI - [Filters] [Open] [cbDirHistory] ======================= [FileHistory] - др. File:"C:\Me\Config\MYKCMD2.DB"; - все МЕНЮ и команды ======================= c:\Me\Config\MEW32X.INI - настройки - [FileHistory] - др. c:\Me\Config\Meconfig.db - "Рабочая конфигурация 1" ( обновляется, как меню уст. посмотр. ) Все меню - Дописываю нач. значения Глоб. переменных. c:\Me\Config\MYKCMD2.DB - команды c:\Me\Config\Weblair.tpt - по HTML ========================================= c:\Me\Config\Html4.tdb - можно переводить c:\Me\Config\Cmac.tpt - ? надо пробовать.. c:\Me\Config\AutoIt.tpt - само сделалось. 29/08/13 19:55 c:\Me\Config\MyTxtDnk.TPT c:\Me\Config\NoteBook.txt c:\Me\Config\Global.tpt При ВЫХОДЕ из МЕ Работает макро Exit.s - записть в файлы значений и выход из Ме. Если нет ошибок, то осуществить выход из редактора Multi-Edit IF (Error_Level == 0) Quit(DOS_ErrorLevel); // код возврата. Завершение макро <CtrlBreak> нормально завершит выполнение макро, если не воткнуто в цикл в пределах внутренней операции (File_Load, и т.п.), или макро компилировано атрибутом No_Break в своем заголовке. В этом случае, Вам возможно нужно убивать задачу Multi-Edit из Task Manager int FcConfig( int Set_Defaults = Parse_Int( "/D=", MParm_Str ) ) trans2
    *^*

    Cmac \ Run_Macro


    Creating, Compiling and Running Macros

    Run/Load/UnLoad/First - Macro

    Compiling macros from a command lin

    Macro elements


     

    msglog.mac
    П\П - Для ОТЛАДКИ макро. Routines for logging of debug messages.


    Список ключевых слов языка CMAC

    First_Run=1;//макро было 1-й раз запущено, после загрузки.
      
     Каждое макро должно состоять из -
     
    [#Include file]   (optional)
     type name[( parameters )] [attributes]
     {
       .
       <macro statements>
       .
       [return ( value )]
     }
    
     

    ПРИМЕР макро:

       #Include Stddlgs.sh // file where msgdlg macro prototype is defined  void HelloWorld( ) trans2  /* type = void,   name = HelloWorld   This macro doesn't take parameters.   attribute = trans2  */  {  // macro statements   msgdlg("Hello World", "Sample Macro","", 0);   return(); // optional  }
    Заголовок макро Синтаксис: ТИП ИМЯ [( параметры )][ТО акселератор [FROM режим_редактора ]][атрибуты ] ТИП макроса - определяется тем возвращает ли макрос значение, и если да, то какого типа. Если макрос возвращает значение, то его называют функцией, иначе - процедурой. Функции (также как и любых данных в СМАС) могут быть следующих типов: Глоб. ПЕРЕМЕННЫЕ int целый, real действительный, str строковый. Эти функции имеют (как правило в конце тела) оператор return ( выражение); который возвращает значение функции. Выражение должно быть того же типа, что и функция, например5*п, где п п целая переменная. Процедура распознается по типам void (пустой) или macro. Процедура может возвращать значения только через выход- ные параметры или глобальные переменные (см. ниже). ИМЯ макроса - ограничено 16 символами. В имени допускаются те же символы, что и в именах файлов DOS, кроме тире. Вместо последнего следует применять подчеркивание, например my_file. Если отсутствует утверждение Macro_File, то имя выполнимо- го файла, будет совпадать с именем первого макроса (послед- нее усекается до 8 символов). Параметры Параметры необязательны и могут быть как опущены вместе со скобками, так и отсутствовать в скобках. Использование параметров позволяют сделать макрос более универсальным. Например вместо того, чтобы создавать две похожие функций преобразования в верхний и нижний регистры, можно создать универсальную функцию, в которой простым дополнительным параметром указать какое именно преобразование требуется. Далее, связь по параметрам более ясна и надежна по сравне- нию со связью через глобальные переменные. В СМАС допускается до 40 параметров. По смыслу параметры бывают двух типов: входные, использу- емые для передачи входных данных макросу, и выходные, представляющие результат. Каждый входной параметр получает значение путем копиро- вания значения аргумента а фактического параметра. Та- ким образом, аргументом, соответствующим входному пара- метру, может быть не только переменная, но и любое выраже- ние. Входные параметры описываются вместе с типом, например int f ( int n, int m) Задание акселератора и режима Акселератор записывается после служебного слова ТО в угло- вых скобках и вплотную к расширяющим клавишам, например <AltG>, <CtrlFl>, причем в произвольном регистре. Акселератор действует только тогда, когда макрос загружен в память. Другой, более гибкий способ б записать макрос в таблицу ко- манд и приписать акселератор (и даже два) там. Такой акселе- ратор легко поменять, не прибегая к компиляции. При этом не нужно заботиться о том загружен макрос или нет. Режимы позволяет различать макросы, которым приписаны одинаковые акселераторы, но которые предполагается исполь- зовать в различных режимах редактора. Бывают следующие режимы: EDIT режим редактирования. Действует по умолчанию; DOS_SHELL режим файловой оболочки; TERM режим коммуникационного модуля; ALL все режимы. Атрибуты макроса Атрибуты позволяют экономить память, определяя будет ли макрос оставаться в памяти. Пользователи, имеющие большую память и применяющие большие кэши, могут смело опускать эти опции. TRANS макро не будет загружаться в память пока не последует вызов. После выполнения макро будет выгру- жен. Следует применять для редко используемых макро. TRANS2 макро не будет загружаться в память пока не последует вызов, но останется в памяти после выполнения. Следует применять для редко используемых макро, кото- рые после вызова надо применять многократно. DUMP макро будет полностью выгружен после выполне- ния. rm( 'MacT /E=5/G=строка'); if(not(Return_Int)) return(); // выйти из макро досрочно if(!Return_Int) return(); ---------------------------------- //В начале текста макро для ускорения работы push_undo; //начать отмену Refresh = false; int temp_id = window_id; ....TEXT MACRO.... //В конце текста макро Refresh = true; pop_undo; //завершить отмену Redraw; switch_win_id( temp_id ); ------------------------------------- //Если параметры были введены, то считать параметры из командной строки. IF (Param_Count > 0) Test_Parameter = Param_Str(1); // А в макро поставить эти строки: int E = Parse_Int('/E=', MParm_Str); // получим цел.число str G = Parse_Str('/G=', MParm_Str); // получим строку или так: char X = Parse_Str("/X=",MParm_Str), Y = Parse_Str("/Y=",MParm_Str); Загрузить/Выгрузить макрофайл в память Load_Macro_File('Test'); //Если произошла ошибка, то проинформировать пользователя, //иначе запустить макро IF (Error_Level <> 0) { Beep; Make_Message('Не могу загрузить макро! - '+'Test'); Error_Level = 0; } ELSE rm( 'Test' ); //Выгрузить макро Test из памяти Unload_Macro( 'Test' ); //Если макро нет в памяти, то загрузить его IF (Inq_Macro( 'Test' )) Load_Macro_File( 'Test' ); IF (Error_Level <> 0) { Make_Message( 'Ошибка при загрузке макро.'); Error_Level = 0;}
    *^*

    Структуры и Массивы.


    CMACW supports structures and arrays within structures.
    Structures and Arrays

    To define a structure template (must be OUTSIDE the body of a macro):
    struct tag
        {
            type name;
            type name1, name2;
            type name;
            etc...
        }

    Tag is a unique identifier that specifies a type for the structure. Inside the curly braces {}, you declare individual elements which are the same as simple variables. The type of each variable can be any of the standard types for
    Byte 1 byte unsigned number
    Word 2 byte unsigned number
    Int16 2 byte signed number
    Asciiz Like an array of char but automatically handles zero termination, and takes direct string assignments.

    example:

    To use structure variables:

        struct ts
            {
              str s1,s2;
              int i;
            }
        
            void test_struct
            {
              struct ts m;
        
              m.s1 = "This is a test";
              m.s2 = "This is a another test";
              m.i = 10;
        
              make_message( m.s1 );
              // etc.....
            }

    Arrays in Structures
    Any data type except str may be defined as an array (within a structure).

    example:

        struct ts
            {
              int tarray[100];
            }
        
            void test_array
            {
              struct ts m;
              int jx;
        
              for(jx=0;jx<=100;jx++)
              {
                m.tarray[jx] = jx; // Attempting to write to an array
                                   // that is out of bounds will
                                   // generate a run-time error
              }
              make_message( str(m.tarray[22]) );
            }

    Structures may be passed as parameters to other macros. The following limitations exist:

    1. Currently no type checking is performed. So it is possible to pass a variable of struct type "x" to a macro expecting struct type "y".
    2. Structures are ALWAYS passed as reference parameters. In other words, only the ADDRESS of the structure is passed. So modification made to a structure passed from one function to another will be seen by BOTH functions.

    You may store and retrieve structures to and from strings with these functions:

    void Struct_To_Str(str &s, struct n)// Copies struct n to local string variable s.

    void Str_To_Struct(struct n, str &s)// Copies local string variable s to struct n

    Additional Resources:

    Macro Elements

    *^*

    Template. Сокращения.<Metacommand>

      Жми  ALT+F9 - Template 
      Список ключевых слов языка CMAC
    
     <-TEXT > - вставить код разделителя страеиц можно, см. пример для macro_file;
     и др. там
     на диалог template попадёшь - Можно редактировать.
    
     Редактирование этого см. в 
      C:\ME\SRC\LANGUAGE.S (Line=3937;)
    
        
      
      

    <Metacommand>

    What are Metacommands?
    General Command Line Metacommands
    Template Metacommands


      The <FILE>, <PATH>, etc. metacommands may now be imbedded in
            the filename extension specific default path field.
    
            The macro PATHSEARCH now expands metacommands in the passed
            path before doing the search.
    
      Also, the following metacommands have been added:
    
            <%str>   is expanded out to the value of environment variable
             "str".
    
             For example, <%PATH> would insert your current DOS PATH
             environment variable into the field.
    
            <~str>   is now expanded out to the value of Global_Str( str ).
             For example, <~!HELP_PATH> would insert the value of
             Global_Str("!HELP_PATH") into the field.
    
    
    

    Переменные

    - Типы Данных - Целый, Действительный, Символьный, Строковый


    DATA TYPES FOR VARIABLES
    АРИФМЕТИКА/ЛОГ - Integer Expressions
    Глобальные переменные
    Construct Matching
      // адрес начала строки в памяти ---
      // В памяти = Строка = 4 байта(Длина?)+строка+ "\x0";
         Make_Message(' &= '+STR(4 + &tstr));
         

    !, @ - эти глобальные, не будут сохраняться/восстановлены.
    ~ - только для конкр.сеанса определены(сеансовые ключи) но не сохр. когда Multi-Edit - выкл.
    # - сохранено в meconfig.db файле и для всех сеансов- не сеан. спец.
    ---
    Если глоб =0 или "", то в памяти её нет.

    ПРЕДЕЛЬНЫЕ ЗНАЧЕНИЯ. Conventions - Limitations
    СТРУКТУРЫ / МАССИВ. Structures and Arrays

    Системные переменные

    ....
    ....   перед макро можно объявить --
    #include HelpLinks.sh   //
    global {
      int g_TipDlg                "!TipDlg";
         ...
      str g_TipMoreHelpCtx        "!TipMoreHelpCtx";
         ....
    }
    #define TipOfTheDay_title     'Multi-Edit Tip of the Day'
    
    
     Set_Global_Int( "~obj_tree_build", 1 );
    
     Переменная ДОС
     DOStr = get_environment( 'me_path=' );
    
     Или так Установить
      set_global_int( WCMDGloN, 343);
      set_global_str(parse_str('/GLO=', mparm_str), Global_Str( WCMDGloName ));
    
     А после, Получать значения -
        nnn - global_int( 'WCMDGloN');
     или..
    ... и далее в тексте можно так просто вызывать...
      if( ( ( return_int == 0 ) &&
          ( _g_BLKDntAsk ) ) ) {
             _g_BLKDntAsk = false;
          }
    
      

    Преобразование числа в строку

    int N = 123; Nst = str ( N ); Text ( Nst ); Real n = 5.465; tstr = RStr ( R , 6, 4 ); // число в строку. Получить строку числа в HEXA-виде: tempstr = hex_str(((global_int('!HTMLRGB'+srchstr) & 0xFF0000) >> 16) | (global_int('!HTMLRGB'+srchstr) & 0x00FF00) | ((global_int('!HTMLRGB'+srchstr) & 0x0000FF) << 16));
    Преобразование строки в число int Er = Val(N,'100') ; если Er = 0 всё Ок!-число в N =100 , иначе, Er = позиция знака буквы(не цифры) а надёжнее делать так: Пример: TStr = ' 12 000 '; TStr = Remove_Space(TStr); IF (!Val(Temp_Value, TStr)) New_Value = Temp_Value; Пример: Nstr = copy ( Get_Line_From_Win ( C_Line, W2 ) , 1, 5 ); Nstr = Remove_Space(Nstr); // додумался удалить пробелы <- 07.01.04 18:25 Val ( NLine1, NNstr ); tstrS = Remove_Space ( tstrS ); // sf удалить лишние пробелы в строке // плохо что "я" последнаяя пропадает, // но "я" в начале, появяются. Целый int n = 5; // Диапазон от -2147483648 до +2147483647. (32-bit) Шеснадцатиричная запись: n = $A9F7; или 0xA9F7; int N = Int_R ( real_value ); //получить целое Действительный real n = 5.465; // Диапазон от - 1E-38 до 1E+38 (11 знаков после запятой.) real R = Real_I ( int N ); // получим реальное; tstr = RStr ( R , 6, 4 ); // число в строку. Пример для SQR(N) REALNUMOPS Символьный char c; // Один символ - байт. Строковый str LangRec[ max_Line_Length ] = FName; str tstr[10] = ''; // [nn]- чмсло символов;по умлочанию = 256 // до 2048 символов. В строку можно вставлять любой символ: '|13' означает возврат каретки. '|12|10' означает перевод страницы и затем перевод строки. '||' означает символ '|'. '' Символ единичная кавычка
    Поддерживаются и другие Си подобные:
    TStr = "\"" + DbFile + "\" Command Map List"; - так можно вводить. \x7F = 127 знак  \n - Перевод строки \t - вертикальная табуляция и т.д, \xH - any H = string of hex digits \XH - any H = string of hex digits
    Действия над числами + - * / && & || | ^ << >> % ++ -- - только эти есть % -> ss=15%7; можно и так писать ss=15mod7; ss = 1; if (aɘ) a#=-a; // получить абсолютное значение
    *^*

    Miscellaneous Functions


    Beep    Max_User_Count    Make_Key_Name    Make_Long    Make_Message Make_WordNot Subclass_With_Macro
    User_ID   Version    Working

    Subclass_With_Macro
      #include win32.sh
      #include messages.sh
      #include mew_dlgs.sh
      
      void test() trans2
       {
        int main_dlg = Create_Mew_Dlg ("Window", "", frame_handle, DLG_Nosize | DLG_Nocenter | DLG_Nopardisable | DLG_Modeless);
        int ldb = Create_MEW_Ctrl( "BUTTON", "button",bs_autoradiobutton,25, 1, 60, 20, main_dlg,101, app_handle, 0);
        
        SubClass_With_Macro( main_dlg, "NewMacroProc", "" );
      
        Auto_Size_Mew_Dlg (main_dlg, 100, 100);
        ShowWindow( main_dlg, sw_shownormal );
      }
      int NewMacroProc (int &retval, int window, message, wparam, lparam, str parms) 
      {
        int result = 0;
        
        switch ( message )
        {
          make_message( "enter new commands here");
        }
        return(result);
      }    
    
    
    
    
    *^*

    Работа с числами.

    Арифметика. Строки. Выражения.
    
      Типы данных.
      
      Целые числа.
    
          int n = 5; // Диапазон от -2147483648 до +2147483647. (32-bit)
          Шеснадцатиричная запись: n = $A9F7; или 0xA9F7;
    
         int N = Int_R ( real_value ); //получить целое
    
     Пример: Прочитать цифры, после слова...
            If ( Search_FWD ('{Line:}', 1 ) ) { 
                   Right;Right;Right;Right;Right; // 5 знаков, Длина "Line:"
                   Val( Nlin, Get_Word(" ./,;"));
                   }  // 
     
     ===  пример на передачу параметров...
         void add_5_to_int( int &t ) { t += 5; }
         void test()
         {
            int t = 10;
            add_5_to_int( t );      // Add 5 to t
            make_message( str(t) ); // Show result
         }
     ======
      Логические операции.
    
      Над строками...
      
    
    
      Есть макро:
      ===========
      Строка в число -  int N = Convert_HexStr ( str Hex = Parse_str( "/H=", MParm_Str ) );
      Число в строку -  str L = _GetVal ( int line );
      
      MyProto.s
         Bin_Str(Str_Bin);  - Преобразовать целое число в строку ДВОИЧНУЮ
         SHexa_Int(Int_HStr); - Преобразует слово-число в hexa виде в Int число.
    
    
     Целое_выражение может быть целой функцией, переменной или арифметическим выражением.
    
     Для целых чисел возможны следующие арифметические операторы:
    
      +        Addition
      -        Subtraction
      *        Multiplication
      /        Division
      &&       Logical AND
      &        Bitwise AND     Проверить последний бит в числе X  ( X & 1 )
      ||       Logical OR
      |        Bitwise OR
      ^        Bitwise XOR
      <<       Bitwise shift left.               /* jx = jx << 4 */
      >>        Bitwise shift right.
      % или mod  Modulus operator. (c=2%3;c=2)(c=5%12;c=5)(c=12%5;c=2)
      ++                Increments an integer by one.     /* ++pass_nmbr; */
      --                Decrements an integer by one.
    
     а также следующие операторы отношения:
    
     можно и так писать - A=B=C=0;
    
       ==   !=    <    >    <=   >=   &&   &    ||   |   
     A |= B = 1, при A=1 или B=1 или A=B=1;
    
     Выражения отношения выдают значение 1, если они истины, и 0, если они ложны.
    
     Пример 1:
    
       INT_VAR = 1 > 2; // Переменной INT_VAR будет присвоено значение 0 (ЛОЖНО)
                           // См и далее в Глоб. ПЕРЕМЕННЫЕ
     Для того, чтобы определить порядок вычислений могут быть использованы
     скобки.
    
     Пример 2:
    
        INT_VAR = ((A + B) * C) / D;
    
     СТРОКОВЫЕ ВЫРАЖЕНИЯ
    
     == Равно
     != Неравно
    
      SQR(N) Пример работы с real - числами.
    Real Number Function List-Реальные числа.
    //Nstr = Int_R(( 1.0/(1.0+Real_I(ISysT))*Real_I(Nstr))); /* Программа - вычисление корня квадратного. Делаю ограничения по точности. (кн. "Моск.олим.по прог."стр.206) Там же есть и - вычисление корня k-той степени. (см.стр.206) ------------------------------------------------------ 11/03/05 09:03 -- */ { str tstr; real N, X, Y; return_str = '0'; Vvod: // Ввод для real-чисел. rm ('USERIN^QUERYBOX /T= Вводи число /P= Число = /N=0 /W=8'); if ( !Return_Int ) goto Fin; //Нажат <Esc> if ( RVal ( N, Return_Str )) { beep; goto Vvod; }// Повторить ввод //Теперь вычисляем X = SQR(N); Можно и как функцию написать , если надо. if ( N <= 0.0 ) { X = 0.0; goto Fin1; } X = ( N + 1.0 ) /2.0; do { Y = X; X = ( N/X + X ) /2.0; } while ( ( Y - X ) > 0.00001 ); Fin1: make_message (' N= ' + Rstr ( N, 6, 4 ) + ' N ='+ Rstr ( X, 6, 4 ) ); Fin: }
    *^*

    Системные переменные.    


    Посмотреть список:
    System View

    System variables
    Системные переменные используются подобно локальным переменным.
    Но они доступны всем макро!
    См и в Глобальные ПЕРЕМЕННЫЕ.

    
     Переменная ДОС
     DOStr = get_environment( 'me_path=' );
    
     Или так Установить
      set_global_int( WCMDGloN, 343);
      set_global_str(parse_str('/GLO=', mparm_str), Global_Str( WCMDGloName ));
    
     А после, Получать значения -
        nnn - global_int( 'WCMDGloN');
     или..
    ... и далее в тексте можно так просто вызывать...
      if( ( ( return_int == 0 ) &&
          ( _g_BLKDntAsk ) ) ) {
             _g_BLKDntAsk = false;
          }
    
     
    Список сист переменных из памяти - Some examples of system variables are: //sv - string variables Return_Int // Return_Str // Word_Delimits MpaRm_Str // Found_Str // PaGe_BreaK Print_MaRgin // и др. //Iv -Integer VaRiaBles Block_Col1 /* The First Block-MaRked Column Number */ BaCkup_PaTh /* The Directory Where BaCkup Files aRe Stored */ DisplaY_TaBs /* 1 = DIsplaY TaB ChaRaCters, 0 = DOn't DisplaY Them */ File_NaMe /* NaMe Of File In Current Window */



    *^*

    Файлы, и макро Ме для поддержки языка CMAC

    
    
    
      int FcConfig( int Set_Defaults = Parse_Int( "/D=", MParm_Str ) ) trans2
    
    
    
     Default Help file:  <~!CMac_Hlp>
     Default directory:  <ME_PATH>SRC
     Tag file:  CMac.Tag
    
    Macros -------------------
       Config: C^CSetProperties /L=CMAC
         
         Init: CMAC.s ^CmacInit  - програмирование клавиш для этого языка.
       
       Indent: C^CIndent /LP=CMAC 
        Match: C^CMatch /LP=CMAC
      FindTag: CMAC^CmacFindTag
         Menu: нет 
    Formatter: нет
    
     Начало макро - 
    
     #include DB.sh
     #include Dialog.sh
     #include Help.sh
     #include Mew.SH       // окна и клавиши.
     #include MewLib32.sh  // import void
     #include Win32.sh     // для MessageBox   Win32.s - нет исходного!
     #include Messages.sh  // Windows Messages
     #include MyProto.sh   // Мои короткие подпрограммы
     #ifdef _Debug_
      #include MsgLog.sh
     #endif
    
     global {
      int g_int        "!gggint";
      str g_str        "!gggstr";
     }
     
     #define DDstr         '/HELP='
     #define DDlog         ( DLG_Modeless | DLG_NoParDisable )
     #define DDint         1000
    
      int NMAcro(
         int B = Parse_Int( "/B=", MParm_Str ),
         int M = Parse_Int( "/M=", MParm_Str ),
         str L = Parse_Str( "/L=", MParm_Str )
      ) trans2
      
       Жми mm или mb Stop. Выдать в строку сообщения.
    
      Make_Message('Return_Int= '+STR(Return_Int)+' Return_Str = '+ Return_Str);
             
      Make_Message ('AX =  '+ Str(R_AX) + ' или   $'+Hex_Str(R_AX));
    
      Make_Message( ' Real = '+ RStr( RX,3,1));
                                         ­­ после точки
                                        ­­­­­­­­ всего цифр
                                       ­­­­­ RX=2345.7687
      Read_Key;   //vf   Подождать нажатия клавиши;
    
      //Запомнить идентификатор текущего окна id
      int owin = Window_Id,
          tInsert_Mode = Insert_Mode,  // и другие установки тоже
          tRefresh = Refresh,
           ;
    

    Если бы смерть была благом - боги не были бы бессмертны.
    Сафо, древнегреческая поэтесса
    *^*
    Готовые \ Примеры макро для тестирования. Наведи на макро и жми <ALT+F>

    Вставлять для тестирования - из MyUtils.s MyMacroTest

    Вставлять для тестирования - из MyUtils.s  MyMacroTest
    
    Начало макро
    
    Папка (SRC) с исходными текстами макро. Сортируй по ДАТЕ !
    
    Компиляция макро из Me.chm.
    
     Пример - Начало макро;
    
     Папка с исходными текстами макро. Сортируй по ДАТЕ !
    
    
      Примеры из файлов -
    
      MyUtils.s  - здесь моё основное.
      COLLAPSE.s =
      PPcat.s-  Пример выбора папки
    
    
      .  = макро для ...
    
    
    Пример 1:
    Macro KT {
    int N = 0;
    str Dtmp;
    Dtmp = СтрокаДата (195,06,01);
    R:
    text ( НаписатьДату ( Dtmp )); cr; cr;
    N++;
    Dtmp = БудущееОт ('19530601', N );
    if ( Dtmp < '19530619' ) goto R;
    }
    
    *^*

    TAGs

    Передача параметров.

    Wildcard Tag Scan
     
     Отнова, для всех языков, файл - MeTags.s
     Macro:"MeTags^TagOp /T=1" - искать в тенущем файле. 
                1 - Scan Tags For Current File
                2 - Update Tags For Current File
                3 - Wildcard Tag Scan
                4 - Project Tag Scan
     Macro:"MeTags^Tag_Locate" - Find tag under cursor
    
     // Не работали ТАГи - причину не нашел, но что то связано с поисков.
      Например, для Ме СМАС -  См. в CMAC.s макро - CmacFindTag (лин.
     
    
     
    Передача параметров =================== 1/ Для макро данные - //Получить параметры из строки y = parse_int('/Y=',mparm_str); m = parse_str ('/M=', mparm_str ); Get_Environment(entry_name);//sf дать переменную окружения ДОС С помощю определения глобальных переменных. global { int @IdWinSave; // Передача id окна для записи. str @TstrPeekData; // Параметры по которым производиться выбор в окно. } //в конце востановить запомненое Insert_Mode = tInsert_Mode; Refresh = tRefresh; Get_Mark_Record (mark_num, group_num, var line, var col, var row, Get_Record_Buffer; //sf Left_Offset; //iv Lines_In_MEM; //if Link_Stat;//if MemStr(address, count);//sf взять строку из памяти Ms_Left;//vf Name_Line;//iv Next_Page_Break;//vf следующий разделитель страниц Override_Screen_Seg;//vf Ovr_Cursor;//iv Pad_STR(str_var, amount, pad_char);//vf Param_Count;//if Param_Str(param_number);//sf Pg_Line;//if Reset_Screen_Seg;//vf Reset_Virtual_Display;//vf Restore_Box;//vf Set_Indent_Level;//vf устанавливает уровень отступа для этого файла Set_Mark_Record(mark_num, group_num, line, col, row, offset);//vf
    *^*

    Help

     Как сделать Help к своему макро? - вопрос и до 23/07/13 18:05 нерешён.
     04/05/11 17:32 - исправил в макро HELP.s - см. там.
     Есть макро - DoHelp.s - читай, там написано.
    
          
          
    
    
    
    *^*

    *.DB

    DB.s
    #include Db.sh
      
     
    Много спец. макро есть - См.примеры: macro:"RegExp^ReEditAlias" macro:"Lcm^LcmAdminPrj" 1) Пример .DB-Формата файла : ** @DISPLAY_STRING=N=80 = /T=Имя:/L=2/C=2/W=80/ML=120/DBF=N /T=Путь:/L=4/C=2/W=140/ML=280/DBF=P ****START**** N=Тестовый редактор AkelPud P=;l 2) Пример .DB-Формата: Пример файла.DB: ******************* 18/08/14 13:48 @DISPLAY_STRING=T=65F=27 /T=Описание: /L=1/C=1/W=60/ML=80/DBF=T /T=Нач. строка: /L=1/C=75/W=8/ML=10/DBF=L /T=File : /L=2/C=1/W=40/ML=240/DBF=F /T=PC : /L=3/C=1/W=40/ML=240/DBF=P /T=WWW : /L=4/C=1/W=68/ML=240/DBF=I ****START**** T=0 MEMOL=12F=Memo.htmP=C:\Me\Help\Memo.htmI=aa T=00 - HELP При нажатии на форме, панелеF=Hlp_Me.htmP=C:\Me\Help\Hlp_Me.htm T=01 - Быстрая справкаL=12F=MyComp.dnkP=C:\Me\Doc\MyComp.dnkI=aa
    str FBD = "C:\\Me\\Config\\zHTML.DB"; RM( "DB /F="+FBD+" /DPT= Шаблон - заготовка - выбирай..."+ "/BMP=BT_VCS_101/MOVE=1/NOALPHA=1/LO=1/ABT=Выбор/CBT=Отказ"+ "/NDF=1/H=zHTML/GLO=TempDBFile"); If ( !Return_Int ) return (''); // Ничего не выбрано return ( Parse_Str('F=',Global_Str('TempDBFile'))); // Получить страницу из БД DbGetPage ( _ConfigFile, _reAliasPg + ".DB", FirstRec, NumRec );
    int tRefresh = Refresh; Refresh = False; RM( "DB /F=C:\\Me\\Config\\MyDBfile.DB /DPT="+ "/H=/LO=1/NE=1/NI=1/NC=1/NDF=1"+ "/ABT=Выбор/CBT=Отказ/GLO=GloPas"); If ( !Return_Int ) Goto Fin; // Выделение из выбраной строки нужных знаков данных. str tstr = Parse_Str('M=',Global_Str('GloPas'));
    DB ( 1,2,3,4,5,6,7,8,9) 1 - str data_file[128] = parse_str("/F=", mparm_str), 2 - str data_page_title[80] = parse_str("/DPT=", mparm_str), 3 - str header_file[128] = parse_str("/HF=", mparm_str), 4 - str header_page_title[80] = parse_str("/HPT=", mparm_str), 5 - str List_Title[78] = parse_str("/LT=", mparm_str), 6 - str Data_Title[78] = parse_str("/DT=", mparm_str), 7 - str Glo_Str[32] = parse_str("/GLO=", mparm_str), 8 - int List_Mode = Parse_Int('/LO=',mparm_str), 9 - str misc_parms = mparm_str misc_parms: ------------ Полное описание см в DB.s ------------------------------------ /DPT= - Заголовок - /H= - файл помощи - путь... /LO=1 - работают обе кн. /ABT=Выбор и в /GLO= выбранная глоб. строка При /LO=0 только одна кн. /CBT=Отказ /CP=New: - Создание новой записи в файле БД Заголовок /DIRB=1 /NE=1 - нет\запрет на редактирования . /NI=1 - не раб. кн. вставки. /NC=1 - не раб. кн. копирования. /ND=1 - не раб. кн. удаления. /SRP=1 - не раб. поиск, по файлу. /NDF=1 - Do NOT delete file window when done. Остается в памяти. /NDH=1 - Do NOT delete header window when done. /ENC=1 - Exit if no records are found. /MOVE=1 - вкл. кнопки передвижения. /BMP=BT_VCS_102 - рисунок, вверху, справа. /MACRO= - Запускается макро после нажатия ки. «Edit» или «Isert». Перед окном ввода, и после него. Name of macro to be run both BEFORE and AFTER a record is modified. The record will be in the global variable specified by /GLO=. Не работает? /P= - 0 Macro was run before modification. - 1 Macro was run AFTER modification.
    Примеры: ======= DB (_ConfigFile, "KEYMAC.DB", _Headers, "KEYMAC.HDR", "Recorded Macro Manager", "Editing Recorded Macro", "@KMG#", 3, "/BMP=BT_GN_122/ADH=" + str (dlg) + "/ADF=1" + "/ABT=&Playback/CBT=D&one" + "/H=" + hc_RecordedMacroMgr + "/NDF=1/NOALPHA=1/PRE=KM" + dbc_str + "/CANMAC=1/MACRO=_Keymac_Check" ); ================ Db( _ConfigFile, "LANGUAGE.DB", _Headers, "LANGUAGE.HDR", "Languages", "Language Setup", "@LANG", List_Mode, ExtraParms + "/NDH=1/PRE=LANG/H=" + hc_LangSetupDlg + "/BMP=BT_SETUP_108/FV=" + Parse_Str( "/STR=", MParm_Str ) + "/MACRO=Lang_Warning" );
    RM("DB /F=" + _ConfigFile + "/LT=Helper Applications/HF=" + _Headers + '/HPT=HELPER.HDR/DPT=HELPER.DB/H=' + H_WL_CSTMZWEBLAIRAPPS); Run_Macro ("DB /F=D:\\Bibl_04\\Bibls.db /GLO=БиблСтрока/DPT=Библиотека. " +"/H=HBibl/LO=1/NE=0/NI=0/NC=0/NDF=0/ABT=/CBT="); +"/H=ПримПомощи/LO=1/NE=1/NI=1/NC=1/NDF=1 /ABT=Выбор/CBT=Отказ"); // Как поле получить? // 03/12/08 18:08 - дошло как - // Если /LO=0 Обязательно нажать !!! ENTER надо нажимать. // А при /LO=1 - работает кн. /ABT=Выбор // а после в '/GLO=', Глоб. ПЕРЕМЕННЫЕ - будет выбраная строка. // И можно будет сделать с ней всё что угодно - записать в другую базу данных // выделить из них значение полей и т.д. и т.п. // /* set_global_str(parse_str('/GLO=', mparm_str), Global_Str( WCMDGloName )); set_global_str(WCMDGloName, ''); set_global_str('GloPas', ''); Глоб. ПЕРЕМЕННЫЕ
    *^*

    Курсор

    - Передвинуть / установить

    Cursor Position Function List
     
     CuL =  C_Line; CuC = C_Col;     //узнать, где находишся в тексте
        Абсолютная Позиция курсора на экране - Pnt.X   Pnt.Y 
         struct TPoint Pnt;    //  X;Y - тут числа
         GetCaretPos( &Pnt );  //  где каретка X Y
         ClientToScreen( Window_Handle, &Pnt );  // курсор запоминаю
                //  см.File:"C:\Me\Src\Text.s"; Line:3517;
         Str( Pnt.X ) + "/YPOS=" + Str( Pnt.Y )
     
     Установить в текстовом(DOS\unix) файле:
     Goto_Line( C_Line + 1);     
     Goto_Col( C_Col + 12 );
     
     Установить в бинарном(Binary) файле:
     отображается в окне кусками по (Record lenth=)   байт
       На нужный байт - 
     
          
          while ( Cur_Char == " " )Right;// до первой буквы
          if ( Cur_Char == "=" ) Right;
    
     Home;  Eof;   Встать выше/ниже последней строки и колонки в файле.
     Left;  Right; Eol;  Up;  Down;  Tof;  Eof;   перемещения по тексту
     
     Word_Left; First_Word; //  установить курсор на первое слово 
                           на этой линии
     Right; 
     
     Forward_Till (TStr);  продвинуть курсор до одного из знаков ( TStr )
                 Forward_Till (';.,'); или на конец строки
    
     Forward_Till_Not( Char_String );
     Forward_Till_Not( TStr ); Forward_Till_Not( ' |9|255'); 
                       вперёд пока не встретиться.
    
     Mark_Pos; // запомнить, где стоял и  Mark_Stack_Count   - +1 число меток.
     Goto_Mark;  //  обратно вернуться.
     If ( Mark_Stack_Count ) { Goto_Mark;}
      "gotoLine" см.File:"C:\Me\Src\Mesys.s"; Line:1063;
     
     Set_Mark_Record( mark_num, group_num, line, col, row, offset ); 
     Get_Mark_Record( mark_num, group_num, line, col, row, offset );
    
     
     Set_Mark( mark_num );  // - 1-10 меток. Установить. SetRandomMark(int, int);
     Get_Mark( mark_num );  // Text.s      Перейти:  GetRandomMark(int, int); 
                                Убрать произвольную метку
                                        rm('Text^ClearRandomMark /B=1 /M=0');  //  
                                        или
                                            ClearRandomMark(1,0); // 
    
    
    
     rm("Next_paragraph");  // курс. на нач. след параграфа.
     
     
     xCurW = WhereX; yCurW = WhereY; //узнать,  где находишся на экране, в пикселях.
        Нужно для МЕНЮ правильно отображать - подсказку на слово.
    
     Collapse_mode - When true, cursor is within collapsed text.
    
     tstr=tstr+Cur_Char; 
    
     
    
    Ins_Cursor = // перем. вид курсора 4 значения - 
              = $7F; плоский
              = $8F; вертикальный, 
              // «Thin» ;  «1/2» ;  «1/3» ;  «Full»  
              // ins_cursor & 0x7f) + 1 = 
        Вставить в макро "SPACE" см.File:"C:\Me\Src\Mesys.s"; Line:1465;
        менялся вид курсора - от РУС\ЛАТ. Подробно:               
              http://www.cyberguru.ru/win32/win32-cursors.html?showall=1
     
                        
    Column_Move_Style = 
    
    
    
      ===========
      Узнать, в каком месте текста находишься?
      В начале коментария или в середине? 
      на первом слове и не в конце линии и т.п.  
      int StCur = GetStatusAtCursor; // В каком месте текста курсор.
      int StCurSyn = GetSyntaxBits; // В каком месте текста курсор.
      
     // Часто нужно проверить, где курсор, для ТИПА файла ещё уставки -
        int Cur = GetStatusAtCursor( );
        Make_Message('курсор находиться в => '+ str(Cur) );
        //  = 0 - 0x0 - За пределами файла.     
        //  = 1 - 0x1   бл. коментарий CMAC 
        //  = 3 - 0x3    таг  в  хтмл   
        //  = 4 - 0x4    стр. коментарий CMAC
        //  = 5 - 0x5    стр. коментарий в  хтмл     
        //  = 16 - 0x10   в 'стр' - коментарий CMAC   
        //  = 17 - 0x11    в 'стр' в  хтмл
        //  = 256 - 0x100  на таге CMAC     
        //  = 768 - 0x300  на функции CMAC     
        //  = 1024 - 0x400  операторе CMAC 
        //  = 16384 - 0x4000 - txt - в http://w  exec:ff  ftp:y
        //  = 16388 - 0x4004 - в в http://w  СМАС и exec:ff ftp:y
        //  = 32772 - 0x8004 - стр. коментарий в в скрипте хтмл
        //  = 36864 - 0x9000 - скрипте хтмл
     
     GetCursorRestrict();
        Получит состояние внутренней переменной 
        CursorRestrict. 
        Эта переменная регулирует поведение курсора. Когда истина, курсор 
        ограничивается текстом, то есть не может перемещаться за концом линии или 
        конца файла.
    
     Пример:
     str GWord = Get_Word ( Word_Delimits );
     // установить курсор на конец предложения.(одна строка!)
              while ( Cur_Char != '.' ) Right;
     //  -  на начало фразы - слова.
              while ( Cur_Char != '.' ) Left; Right;
    
     В режиме документ Установить на разделитель страниц.
     Next_Page_Break;
     Last_Page_Break;
    
     Пример:
     calc_xy: // подпрограмма - вычисления координат
      x = (wherex + (svl(tstr) /2)) - (need_w / 2);
      if((x + need_w + 2) > screen_width  ) { x = screen_width - ( need_w + 2 );}
      if(  x < 1  ) {  x = 1;  }
      y = wherey - need_l;
      if(  y < 3  ) y = wherey + 2;
     ret;
    
    
    Назад, передв курсора

    Табуляция

    Позиции
    
        Первоисточник 
    
       Def_Str( TStr );
       TStr = Get_Line;
       Crunch_Tabs( TStr );
    
       Def_Str( tstr );
       tstr = '|9|9Test paragraph';
       Tab_Expand( TStr );
    
       Def_Str( tstr );
       tstr = Get_Line;
       Tabs_To_Spaces( tstr );
    
    *^*

    Текст

  • Text Manipulation Functions
  • Tabstop and Indenting Function List
    Строка / деление слияние / вырезка

    Особые случаи. Полные имена файла, передача в формы




    ВВод \ вывод -
    slash - проблемма + DLG
    macro double_slashes



    Получить параметры из строки:
    str y = parse_int('/Y=',mparm_str);
    int m = parse_str ('/M=', mparm_str );

    Get_Environment(entry_name);//sf дать переменную окружения ДОС

    С помощю определения глобальных переменных.

    global {
    int @IdWinSave; // Передача id окна для записи.
    str @TstrPeekData; // Параметры по которым производиться выбор в окно.
    }
    Невидимый конец линии, для отображения файла ( как 255 - я).
    Line_Terminator ='|13|10' // DOS text;
    ='|10' // Unix text;
    ='' // Binary ;

    ПЕРЕМЕННЫЕ


    Документ / Текст / Страница / Абзац / Параграф / Предложение

    
       str tFormatLine = format_line;              //Retain the current format line
       int tUseFormatLine = use_format_line;       //Retain the use format line value
     
     
     
    TStr = "\"" + DbFile + "\" Command Map List"; - так можно вводить. Pad_Str( TStr, Offset + _col_Name, " " ); Закоментировать строку (строки) для txt01 Cmac.s , и её изменение. Уже имеется макро - Language^Comment - но я не понимаю как оно работает. If ( !Search_FWD ( '{<HTML}||{<html}', 10 ) ) { // в первых десяти строках от верха Beep; str Mes1 =' Ошибка! Нет тега <html>'; Run_Macro('MEERROR^MessageBox /B=1/T= Ошибка. /M='+Mes1); Goto Fin; } //Подключить текущую строку к предыдущей Insert_Mode = TRUE; tstr = tstr + Vstr; //Вставить некий текст там, где курсор Insert_Mode = TRUE; Text('Дата составления этого документа:' + Date); // вставить int Pos = XPos( 'WHAT', tstr, 12 ); // Получить номер позиции подстроки // Взять первые 3 символы из Temp_Str tstr = Copy( tstr, 1, 3 ); // Удалить первую букву "я" и ТАБ в начале строки. tstr = Get_Line; While ( (Ascii (tstr)== 255)|(Ascii (tstr)== 9)) { PStr = copy ( tstr , 2, svl(tstr)); } // Удалить четыре буквы с девятой позиции tstr = Str_Del( tstr, 9, 4); //Удалить следующие от курсора 10 символов Del_Chars(10); //Удалить все строки от курсора до конца файла WHILE (!( At_Eof )) Del_Line; // Вставить 'HELP' в tstr от 9 позиции tstr = Str_Ins('HELP', tstr, 9); Put_Line( 'Это новая строка, на месте старой.'); // Большими буквами tstr = CAPS(tstr); //Преобразование строки в число IF (!Val(Temp_Value, '1000')) New_Value = Temp_Value; //Проверка строки Home; While (C_COL <= Len_St) { Cod_Zn = ASCII ( CUR_CHAR ); if ((Cod_Zn < 32)||((Cod_Zn == 127)||(Cod_Zn > 252))) { Make_Message(' В строке есть СИМВОЛ ! '); GoTo Fin_E; } Right; } //Вставить новую строку Insert_Mode = TRUE; //Установка режима вставки (insert) eol; // перейти на конец строки cr; // выполнить возврат каретки Back_Space;//Выполнить возврат // Показать Hexa-коды строки str buf,strhex,h;int l,i; l=svl(buf); for(i=1;i<=l;++i) { h = hex_str(ascii(copy(buf,i,1))); if (svl(h)==0) h='00'; if (svl(h)ɚ) h='0'+h; strhex = strhex + h+' '; } write(strhex+' : '+buf,3,4,3,0); // Получим из строки три подстроки: str tstr ='первая стр ангвторая строкатретья разг стр'; str T1_Str ='', T2_Str ='', T3_Str =''; int p = XPos('', tstr, 1);//if = номер поз в строке T1_Str = copy ( tstr, 1, ( p - 1 ) ); tstr = str_del ( tstr, 1, ( p ) ); p = XPos('', tstr, 1); T2_Str = copy ( tstr, 1, ( p - 1 ) ); T3_Str = str_del ( tstr, 1, ( p ) ); // Перевернуть биты в байте( Написать слово наоборот) str B = '1010', RB = ''; int LB = svl ( B ); for ( int k = LB; k > 0; k-- ) { RB = RB + copy(B,k,1);} // Дополнить строку знаками while ( svl ( tstr ) < 80 ) tstr = tstr + ' '; Eof_CR; // Бежать вниз до нужной первой буквы while (( Cur_Char != Fz )&&(!AT_Eof)) Down; if ((Search_Fwd ( Tword, 0 ))&& (C_Col != 1 )) { Right; Goto L01;} if ( Search_Fwd ( Tword, 0 )) { tstr = Get_Line; N = XPos ('', tstr, 1 ); tstr = str_del ( tstr, 1, N ); Rstr =''; N = svl(tstr); // Терерь из слова надо удалить буквы индекса ( они будут нужны дальше) // и заменяю их пробелами for ( k = 1; k <= N; ++k) { Fz = copy(tstr,k,1); if ( Ascii ( Fz ) < 128 ) Fz = ' '; Rstr = Rstr + Fz; } Примеры на слова Буква - Знак ======================= Пример 1: char A ='A', B; B = char(ascii(A) + 1); // получить следующую букву // Проверка первой буквы слова if ( ascii ( Tw ) < 65) word_right; // числа словами не считать // Проверка знака над курсором if ( ascii( cur_char ) == 32 ) right;
    *^*

    Знак / Символ / Слово /Перекодировка /Атрибут


    Шрифт / Перекодировка

    Знак / Символ

      
      text( char(37)); 
      
      del_chars( 10 ); //удалить 10 символов
      get_word_in( 'ABC'); // Вставить символы ABC в позиции курсора.
    
      str tstr[ max_Line_Length ] = от 225 знаков и более до 15 873 ;
     
      tstr = Get_Word("|13"); //  от позиции курсора, ло конца стороки.
     
      int p = XPos(';', tstr, 1); // позиция знака < ; >
                                 // Получим из строки, подстроки:
      
       t2-5 = copy ( tstr, 2, 5  ); // получить 5 знаков, со 2-го.
       
         t5 = str_char(tstr,5); // получить, один, 5-й знак.
      
      t6-12 = str_del( tstr, 6, 6); // = tstr, без знаков с 6-го по 12-й.
      Пример: Замена знака в строковой переменной A на B -
      int  k=1; 
      while (k = xpos("A", tstr, k)) {
        tstr = str_del( tstr, k, 1);
        tstr = str_ins("B", tstr, k);
        ++k;
      }
    
    
      If ( Cur_Char == '[' ) {  // Читать слово между [..]
          Right; tstr = Get_Word ( ']' );
      }
           
      while ( C_Col < Col ) {  // чтение слова по буквам(BYTE).
       tstr += Cur_Char;      //:-) обрати внимание !!!!!
       Right;}
      
      
      tstr = ReadTextBl(0\1); //  Выдать строку\блок для поиска в словаре или др.
      
      tstr = Get_Context( "[\\x2DA-Za-z0-9._\\\\/:~]" ); // и то же будет в Return_Str
                                                              
      tstr = Convert_String ( tstr );  //  '\T', '\L', '\C', '\\' or '\N',
    
      tstr = Reconvert_String (tstr ); // в нормальный вид.
    
     
    
     Выделение из выбраной строки нужных знаков данных.
     str S = Parse_Str('P=', Get_Line); // выбор
     int I = Parse_Inr('I=', Get_Line); // выбор
    
    
    
     Change Case - Преобразование СТРОЧНЫЕ прописные:
     rm ('Text^ChngCase /U=0/T=2');
    
                                
     

    Считать слово. Взять слово

    First_Word; // Установить курсор на первое слово на этой линии для HTML = Word_Delimits = "<> =\".\t\xFF"; str W = Get_Word ( ' ' ); // от позиции курсора, ло первого пробела. str W = Get_Word(''); // читаем "слово" - Tw = всё что между знаками str W = get_word(' .,()"''#$@!%^&*{}[]?/||;: |10|9');// |255- я - это уж точно? слово будет; // Читает "Фразу" - от позиции курсора до знака-разделителя. // Если не встретился то останавливается на конце строки if ( !At_Eol ){ tstr = Get_Word ('.'); right; } else { down; First_Word; } ; if ( !At_Eol ){ Zag = Get_Word (''); right; }; // Взять строку в перемен. put_line (''); // стереть строку.(заменить пустой.) text(' - ' + Zag ); // Заменить её, на другую. Set_Highlight( C_Line, Tc, C_Line, Col ); // пометить слово цветом.
    Пример: Прочитать цифры, после слова... If ( Search_FWD ('{Line:}', 1 ) ) { Right;Right;Right;Right;Right; // 5 знаков, Длина "Line:" Val( Nlin, Get_Word(" ./,;")); } //
    Про букву я. Она записывается, и в начале и в конце строки. Так, что длина файла не меняется. Вот только в начале строки её не видно, если она стоит первой. Можно ᡈ - любой знак. ˈ ʃ æ bɪ Кодовая таблица.- Alt+A - // Коды десят.знаков - 48-57; 65-90; 97-122; // Используйте латинские буквы, цифры и символы // в любом их сочетании ! # $ % & ( ) * + - ^ _ str tstr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-^_'; For ( kz = 48; kz <= 57; ++kz)text( char(kz)); // 0123456789 For ( kz = 65; kz <= 90; ++kz)text( char(kz)); // ABCDEFGHIJKLMNOPQRSTUVWXYZ For ( kz = 97; kz <= 122; ++kz)text( char(kz)); // abcdefghijklmnopqrstuvwxyz text( char(33));text( char(35));text( char(36));text( char(37)); text( char(38));text( char(40));text( char(41));text( char(42)); text( char(43));text( char(45));text( char(94));text( char(95));
    *^*

    ШРИФТ \ Кодировка


    ME-Windows. Основное.
    mewlib32.sh

    Get_Window_Font
    Set_Window_Font
    GetDialogFont
    SetDialogFont

    
       // см в Fonts.sh - там новый дописал.
       rm ('SetupFont /ID=DLG/PN=&TesttFont');
       str tstr = Parse_Str("/NAMEDLG=", TesttFont);
       text ('"'+tstr+'"'); 
     
    The Fonts - Шрифты - дополнительный файл. Можно посмотреть.
    Надо делать...кириллица и другое Пример: ᡈ(&#6216) -Два байта.
    ПЕРЕКОДИРОВКА Мои функции см.File:"C:\Me\Src\MyProto.s"; Line:805; и макро ReCode /C= в MyUtils.s Switch (Code){ case 1: {Put_Line( Str_W2A ( Get_Line )); Break;} case 2: {Put_Line( Str_A2W ( Get_Line )); Break;} case 3: {Put_Line( Str_W2U ( Get_Line )); Break;} case 4: {Put_Line( Str_U2W ( Get_Line )); Break;} Default: {Put_Line( Get_Line ); Break;} Подробно про UTF8 но там сложно, делал проще. Пример: показать табло крупным шрифтом - SetDialogFont ("Courier New",-19,400,0); msgdlg ( "Biggest font " ,"","",0); SetDialogFont ("MS Sans Serif",-12,400,0); Но Как востановить прежнее? Где запомнить. Изменения сохраняються
    str Tstr = Global_Str( '&DEFAULTFONT' ); Text ( Tstr ); // есть в файле C:\Me\Config\Meconfig.db // #TABFONT=/NAMETAB=Arial/SIZETAB=-11/WTTAB=700/SETTAB=204 // и // &Defaultfont = str DefaultFont1 = "/NAMEANSI=Courier New/SIZEANSI=-12/WTANSI=400/ SETANSI=204/NAMEDLG=MS Sans Serif/SIZEDLG=-12/WTDLG=400/SETDLG=204"; str DefaultFont2 = "/NAMEANSI=Courier New/SIZEANSI=-12/WTANSI=400/ SETANSI=204/NAMEDLG=MS Sans Serif/SIZEDLG=-19/WTDLG=400/SETDLG=204"; // NAMEDLG=MS Sans Serif/SIZEDLG=-19/WTDLG=400/SETDLG=204 // Set the Dialog Font //SetDialogFont ("MS Sans Serif",-19,400,0); // Установка см в Mew.s /*/ Set the Dialog Font if ( parse_str( "/NAMEDLG=", DefaultFont1) != "" ) { SetDialogFont ( parse_str ("/NAMEDLG=", DefaultFont1), parse_int ("/SIZEDLG=", DefaultFont1), parse_int ("/WTDLG=", DefaultFont1), 0); } */ Получить / установить - #include dialog.sh #include mewlib32.sh
    - Просмотр из C:\Me\Src\Ascii.s if (global_str("ASC_CHRT_FONTS") == "") { OEM_fontname = "Terminal" ANSI_fontname = "Fixedsys" } else { ANSI_fontname = parse_str("/ANAME=",global_str("ASC_CHRT_FONTS")); OEM_fontname = parse_str("/ONAME=",global_str("ASC_CHRT_FONTS")); } g_ansi_fontname = ansi_fontname; g_oem_fontname = oem_fontname; create_window; file_name = me_path + "ASCIITBL.TMP" g_Ascii_Window = window_id; ascii_window_num = cur_window; Window_Attr = _wa_System;
    *^*

    Строка / деление слияние / вырезка

     str tstr[ max_Line_Length ] = str(max_Line_Length);
     text(tstr); // напечатать макс.дл. строки.
    
     str tstr, Tip[ 1024 ];  // Ограничение на длину вывода показа.
             // см. File:"C:\Me\Src\Dialog.s"; Line:164; про "str ctrltext[ 1024 ],".
    
     Wrap_Stat = true; // iv = 1, разрешен перенос слов.
    
     Делает из любого Блока одну, длинную строку ( \n = вк)
      tstr = BlockToStr; ( \n заменяется на знак |10 ) #include Block.s
     
       Есть макро - ConvertBlock  в файле Block.s - преобразование блока в одну строку.
     
     tstr = Convert_String ( tstr );  была  6w
    566  стала  6w\L566
        Преоб.строку с люб. случ. символов ASCII 9 (Tab), 
        10 (Linefeed), 13 (возврат Carriage), 92 (\), или 255 преобразованное 
        в '\t', '\L', '\C', '\\' или '\N', соответственно. 
     
     обратрое удалить из строки лишнее ( прбелы, таб и др.),
     и заменяет знаки \L на |10 и т.д.
     tstr = shorten_str( get_line ); была  6w\L566  стала 6w
    566
     
    
     tstr = Reconvert_String (tstr );
        чтобы преобразовывать '\' последовательности в оригинальную форму.
    
    
     DelAlikeStr - Удаление из файла одинаковых строк.
     
    
     
     Положить переменную, как строку в окно.
     Ложить строку (много строк) на линию в окне буфера.
     В памяти = Строка = 4 байта(Длина?)+ строка+ "\x0";
     StrPutLine ( &tstr+4, LineNum, Window_Id );   
    
     Shorten_Str( tstr ); // The passed string, with any trailing space or 
                             tab characters removed.
    
     
    
     Goto_Col ( 1 ); 
       // - взять части строки от поз курсора, до спец. знака.
       if ( Cur_Char == '†' ) {   // если первый знак в этой строке, то далее 
       Right; Idic = Get_Word("‡");
       Right; Adic = Get_Word("€");
       Right; Rdic = Get_Word("‰"); 
       }
     
    Пример: Прочитать из строки параметры в память
     void Sm ( str &SName ) 
     {
       SName = Parse_Str( "\x7F" + "NAME=", Get_Line( ));
     }                                              
     
    Подробнее
    см. File:"C:\Me\Src\SessMgr.s"; Line:306; про "Sm_Get_List_Data".



    Команды со словом.
      
     if ( C_Col != 1 ) {  // т.е. строка не пустая.
        Down;
     }
     
    
    
     Пример: Удалить пустые строки в конце файла.
     eof;
     While ( Get_Line == '' ){
         del_line;
         up;
     };
    
     Пример: Выделение из строки нужных знаков данных.
     int N = Parse_Int('#','#78/N=326jh'); // N=78
     str Sp = Parse_Str('', 'str1str21str3'); // Sp='str2'
    
    
     Пример: Получить из одной строки две: до знака ^ и после него.
     str CmdLine = 'FailMacro^TextMacro';
     int Pos1 = XPos( '^', CmdLine, 1 );
     str MFile = 'C:\\Me\\Src\\' + Copy( CmdLine, 1, Pos1-1 ) + '.s';
     str Msrc = Parse_Str('^', CmdLine );
    
     Пример: Положить строки кусочками ( поделить длинную строку)       ...
      while ( svl(tstr)) { //  пока строка не кончилась,
        text (copy(tstr,1,16)); cr; // печатать строки по 16 знаков.
        tstr = Str_Del(tstr,1,16);
      };
        text ( tstr );cr;
    
     Пример: Проверка строк файла.
      tof;
      WHILE ( !At_EOF ) {
          First_Word; // Проверка по первой букве
          if ( Cur_Char == '|12') {
              Message = 'Первый знак строки - разделитель страницы!';
              call Stop;
          }
      }
    
    
    
    
     Пример:
     while(  not(at_eof) & (get_line < tstr)  ) { // бежим к концу списка
              down;
     }
    
    
    
    
    
     Пример:
     goto_col(1);
     if(  get_line != tstr  ) { // такой строки ещё нет, не было.
              if(not(at_eof)) { // если не в конце файла, то вставим пустую строку
                      cr;
                      up;
              }
              put_line (tstr); // и просто положим
     }
    
    
     Пример: Замена слова в строке. Пренос на другую строку.
    
     replace_word2:
       push_undo;
       del_chars( svl(tstr) );
       Insert_Mode = True;
       text(return_str);
       if(  wrap_stat  ) { word_wrap_line( FALSE, TRUE ); }
       pop_undo;
       tstr = return_str;
      ret;
    
    

    *^*

    ПОИСК / Замена / Сортировка /



    Me Dialog
    SEARCH AND REPLACE
    Regular Expressions

    • ПОИСК

     
     reg_exp_stat = true;
     if (search_fwd('%' + copy(tstr,1,1), 0)) { // ищем начало слов на эту букву
     }
     reg_exp_stat=treg_exp_stat;
    
    
     Пример строк для поиска см. в - CMAC.s - CmacFindTag
    Определиться - разрешить / запретить "регулярные" выражения - команды условий поиска int tReg_Exp_Stat = Reg_Exp_Stat; Reg_Exp_Stat = True; // разрешить рег. выраж в поиске. int tIgnore_Case = Ignore_Case; Ignore_Case = True; // Игнорировать ТОЛЬКО ЛАТЫНЬ! ^$^$^$^$<br /> - искать 4-ре пустых строки. ?;* - любой знак на этом месте. и их количествво между, знаками примеры: еф*к*ш - будут найдены слова - еш, екш, ефш, еффффш, префкшпрн, и т.д. е?*ш - будут най. слова - еш, екророш, лолеждлдфшдл, и т.д. Часто : <h?*> - искать скобки с любым содержимым. + Как и * , но хотя бы один раз - пример: еф+к+ш - будут найдены слова - еффффффффккккшш, префкшпрн, и т.д. [x] - x -любой знак в этих скобках, можно задать [ЫВч]или [а-з] или [А-Кпро] Поиск буквы [м-п] - нрпне, рронпавв, уцвыклшо, [~x] - любой, кроме x, этого [~нрпм] - нрпмне, рронпавв, уцвыклшо, {abc} - включить гр. символов. Искать от начала строки до знака-разделителя, так: %[a-z]* - только слова из букв, исключая все знаки. %[~ ]+ - слова без пробелов. %[~a]+ - все слова без буквы а. %[~a,d,l]+ - все, но без a,d,l - этих букв %?*[ ]+?* - выделяет несколько слов, с пробелом до знака-разделителя. %?*[ ]+?*?* - всю строку выделяет, где есть хоть один пробел, в её части до знака-разделителя. % - начало линии, $ - конец линии. | match previous OR next character or expression @ match (or replace) next character literally @a 0x07 BEL @rb 0x0D CR @b 0x08 BS @t 0x09 HT @f 0x0C FF @v 0x0B VT @n 0x0A LF @xHHHH = string of 2 hex digits Replace String Expressions - Заменить на: $ - Перевод строки, Insert a carriage return % - Удалить Delete a character & - Insert the original found text ^ - Place cursor at this position in the replaced text #n - Insert text matched by group number 'n' ========= Пример: while( Search_Fwd('[''"]',0) ) { if( (key1 == 27) | (return_int < 1) ) { goto done; Применять макро- FIND_TEXT( tstr , 0 , int flags); // =1 - найдено int flags: 0x00 - простой поиск знаков. _RegExp 0x01 - поиск с условиями _OldExp 0x02 - стиль UNIX _CaseSensitive 0x04 - только ЛАТЫНЬ! _Backward 0x08 - обратный поиск. Это можно писать и так: _RegExp | _Backward | _CaseSensitive Курсор будет на найденой позиции а Результат см. в - tstr = FOUND_STR; // найденая строка? =``у меня, пустая. Пример: if ( find_text(' '+srchstr, 5, 0) ) { goto_line ( search_end_line ); // номер goto_col ( search_end_col ); str_block_begin; forward_till_not('0123456789ABCDEF"#'); block_end; delete_block; tempstr = hex_str(45555); while ( length(tempstr) < 6 ) { tempstr = '0'+tempstr; } text('"#'+tempstr+'"'); Пример: Поиск строки в блоке. if ( find_text( 'PRE>', Block_Line2 - Block_Line1 + 1, 0) ) { beep; rm('MEERROR^MessageBox /B=1/T= Stop! Ошибка. /M= В БЛОКе есть <PRE>.'); Goto Fin; } Пример: // Поиск строки в файле можно так... Create_Window; Load_File('ИмяФайла'); // rm('MESYS^LDFILES /CW=2'); refresh = False; tof; Search_FWD ('|12'+ Chapt, 0 ); goto_line ( C_Line + Offst ); refresh = true; Пример: int SRegExp = g_RegExStyle; // значение глоб. поиска g_RegExStyle = true; // получить tstr = Get_Context( "[\\x2DA-Za-z0-9._\\\\/:~]" );


    • ЗАМЕНА



    
    Заменяю в файле знаки перевода строки:
         tof; 
         while (FIND_TEXT( '\n',0,0)) Replace('|13'); 
         tof;
    Заменить все непечатные знаки пробелами.
        /* Filter out all control characters */          
        Reg_Exp_Stat = True;
        tof; while (Search_Fwd('[@x00-@x1F]',0)) {Replace(' ');} 
         
    
    
    Меняю весь текст на маленькие буквы
      rm ('MyUtils^MarkALL');             //  Block^SelectAll
      rm ('Text^ChngCase /U=0/T=2/R=0');  //  text.s - только для лат.букв.
                                 /R=1     // только РУССКИе буквы
    
    Если стоишь курсором на строке, то заменить её часть можно так=
    Search_Fwd('было',1); Replace( 'стало' );
     и ещё так -
       int tReg_Exp_Stat = Reg_Exp_Stat; Reg_Exp_Stat = True;
       Ignore_Case = True;//игНОрируя раЗЛИЧие между стрОЧНЫМИ И ПРОписными буквами.
       Search_Fwd('{было1}||{было2}',1); Replace( 'стало' );
       
    
    
     замена ункальных меток во всем файле 
                // это для шаблонов применяется.
                // Написать имя этого файла
                   tof; while (Search_Fwd('FIM',0)) Replace(File_Name);
                // Заменить в файле - NIM на имя вставки
                   tof; while (Search_Fwd('NIM',0)) Replace(FSplice);
                //  - на текущее время.
                   tof; while (Search_Fwd('NDT',0)) Replace(Str_DT(0));
                // - на текущее время, сжатом виде.
                   tof; while (Search_Fwd('NDDT',0)) Replace(Str_DT(2));
    

    • СОРТИРОВКА

    строк в файле - QSort_Lines ( лин-нач,лин-кон, sortOrder , c зн, до кол-во , Загл );
      Примеры из файлов -
    
      tof;
      eof;   int el = c_line; // Конец сортировки.
      tof;   int bl = c_line; // линия начала сортировки.
      if ( global_int('MacListSort') )  // порядок сорт.
        qsort_lines( bl, el, global_int('MacListSort') == 1, 0, 0, 0 );
    
     =========
           eof; Nstr = C_Line;
           QSort_Lines ( 2, Nstr, 1, 1, 10, 0 );
           QSort_Lines( 1, C_Line - 1, 1, 1, 255, 0 ); // Последняя запись будет на верху.
           QSort_Lines( 1, C_Line - 1, 1, 3, 12, 0 );  //
           qsort_lines( 1, c_line - 1, TRUE, 0, 0, TRUE );
     =========
     
     
     

    Прересортировать строки в файле.

    eof; Qsort_Lines ( 9, C_Line, 1, 1, 40, 0 ); // 23/06/13 14:31 // Сорт- Почему то работает, но не пойму как. // После EDIT - есть сорт, а пи вводе нет, Дошло! Это ж в памяти, а не диске = // есть ДВА файла с одним именем. В памяти, и на диске. Файл в памяти обновляетс // после EDIT. Сортировать по первой букве! А не по 10-й!!! Это ошибка была. // Постепенно дошло - все работало правильно-СТРОКИ то НЕ РАВНОЙ ДЛИНЫ! save_file; // пишу файл на диск!



    *^*

    Блок. Буфер (№).

    Команды БЛОКА
    Есть очень сильное макро для работы с БЛОКОМ.
    см. примеры в Block.s
    и в Paste.s
    Ещё макро - int ConvertBlock в файле Block.s
    - преобразование блока в одну строку.
      int tInsert_Mode = Insert_Mode; Insert_Mode= True;
      int tPersistent_Blocks = Persistent_Blocks; Persistent_Blocks = True;
      
      str tWord_Delimits = Word_Delimits; Word_Delimits = ' ';
    
      if ( Marking ) {  Block_End; } // Закончить отметку блока.
    
     Отметить весь файл:
     SelectAll; из Block.s  не использовать старое rm ('MyUtils^MarkALL');
    
     
    
     myProto.s -
     tstr = ReadTextBl (0);  // =0; =1 = Выдать строку\блок для поиска в словаре или др.
    
    
    RM( 'WINDOW^COPYBL' ); // Появляется ВЫБОР окно откуда? RM( 'WINDOW^MOVEBL' ); // Появляется окно куда? BlockOp /BT=0

    === ОБМЕН ТЕКСТОМ МЕЖДУ МЕ и Виндоусом =====

    Win3Copy - что в Return_Str помещаю в Win-Clipboard Готов для выдачи при нажатии [ Ctr + V ] или Получить из Вин-буфера - switch_window ( window_count ); create_window; Win3_Paste; // или так ? Rm( "Paste" ); tstr = Get_Line; delete_window; Получить данные из Буфера обмена Виндоус NewClipBoardData // >0 Если больше 0, есть новые данные в Буфере обмена Виндоус if ( Win3_Clipboard ) { SwitchToBuffer( Buf_Num ); // или просто - text(Win3_Paste) // ? недо уточнить. Win3_Paste; // Принять из Виндоуса. } StrToBuffer2(1); // Me SwitchToBuffer(1); Win3_Copy; // Win Switch_Win_Id( Wrab ); Return_Int = VerifyDlg( "Copy text to the Windows clipboard?", "Confirm Large Block", "", id_std_Yes, 0 ) == id_std_Yes; } if ( Return_Int ) { Win3_Copy; // Перенести в Виндоус. if ( !Switch_File_Ex( _buffer_Name, 1 ) ) { if ( Win3_Clipboard ) { SwitchToBuffer( Buf_Num ); Win3_Paste; // Принять из Виндоуса. } } Отметить весь файл, как строку для копирования. tof; Str_block_begin; While ( !At_eof ){ right; }; Block_End; rm ('CutPlus'); Для переноса частей текста по странице, можно использовать -

    Копирование в этом же окне блока в другое место

    Запомнить и установить - Persistent_Blocks = True; Copy_Block; //Copies the currently marked block of text //to the current cursor position.

    Сохранение , запись текста, из одного окна в другое

    Switch_Win_Id ( Wtxt ); // На окно - с текстом. rm ('SelectALL'); - все отметить. rm ('CutPlus'); /M=1 - копировать и удалить. /A=1 - добавить к буферу. switch_win_id( Wdic ); rm('PastePlus'); Save_File; If ( Block_Stat ) { // из любого блока делаю одну линию. Block_Stat =1;} // преобразовывать только для блока, и одной строки ! if((!Block_Stat)||( Block_Line1 != Block_Line2 )){ beep; return ();} Удаляю слово, за этим знаком. - Str_block_begin; While ( Cur_Char != ' ' ) Right; Block_End; Delete_Block; Отмечаю линию, как блок Goto_Col ( 1 ); Search_FWD ( '%', 1 ); Str_block_begin; eol; Block_End; Блок.Запомнить, какой он был. int tl1, tc1, tl2, tc2; // текст линия,колонка начало и конец. GoTo_Line( Block_Line1); tl1 = C_Line; Goto_Col ( Block_Col1 ); tc1 = C_Col; GoTo_Line( Block_Line2); tl2 = C_Line; Goto_Col ( Block_Col2 ); tc2 = C_Col; Работать в блоке. Goto_Line ( Block_Line1 ); Goto_Col ( 1 ); WHILE ((C_Line != ( Block_Line2 + 1 )) && (NOT (At_EOF ))) { // Что то делать в этом блоке, над стороками... while (Search_Fwd('[|0-|31]',1)) { Replace(' ');} down; Goto_Col ( 1 ); } //- Делает из Блока одну, дл.строку ( \n = вк) tstr=BlockToStr(); Смотри File:"C:\Me\Src\Block.s" Line:3165 str_block_begin; дддддд if Block_End; // Вырезать блок. в 5-й буфер. rm ('Cut /B=5'); Delete_Block; // вставить блок строку. ; Поместить в ME буфер № 0 - #0 по умолч. Всего буферов #1 -MAX_BUFFERS
    Вот пример - #include Block.sh // Смотри File:"C:\Me\Src\Block.s" ^StrToBuffer2 Line:3270 StrToBuffer(0); // Что в Return_Str поместить в буф № 0 // "C:\\Me\\Config\\Buffer.0" - Как строка! // Написал свою---для части из строки. StrToBuffer2( 5 ); - часть строки только в 5-й буфер. Взять от туда - rm ('Paste /B=5') см. пример применения в File:"C:\Me\Src\MyUtils.s"; Line:190; про "Дописать в конец файла". #include Paste.sh там есть макро - Macro:"ShowClipboard /B=5" ;- Показать содержимое 5-го буфера. !!! Прим-Если второй раз запустить это макро, то окно закроется. Macro:"ViewOp /T=8" подробрее = Paste.s BldBufferDlg Смотри File:"C:\Me\Src\Paste.s" Line:418 Перейти в окно буфера SwitchToBuffer(#) Смотри File:"C:\Me\Src\Paste.s" Line:1000 // Toggle Paste Buffers Pane - Список - Просмотреть все буфера
    А это из одного окна, в Буфер0 - занесение строки. int WRab = Window_Id; Str tstrP = Parse_Str('P=',Global_Str('GloPas')); // После включения Ме, этого файла, буфера нет, надо открыть - пишу туда не важно,что... if(!Switch_File ( "C:\\Me\\Config\\Buffer.0")){ rm ('CutPlus'); MessageBeep(0x00F4240); } Str_block_begin; text ( tstrP ); Block_End; // Готов для выдачи при нажатии [ Ctr + V ] rm ('CutPlus'); switch_win_id( Wrab );
    Нужно использовать - macro:"BlockOp /BT=0"; 0 = Block copy 1 = Block Move 2 = Block Delete 3 = Inter-Window Copy 4 = Inter-Window Move 5 = Toggle persistent blocks

    Cut( int Buf_Num = Parse_Int( "/B=", MParm_Str ), str Flags = MParm_Str ) trans2 -- Copies, Moves and/or Appends text to a hidden buffer. Entry : int Buf_Num The buffer # (0 is the default) ( /B=# ) str Flags The operation flags /M - Move text (else copy text). /A - Append text (else erase old buffer). /E - Erase buffer, perform no move or copy. /O=1 - The marked block will be turned turned off after the operation. /I=1 - Cut block only if cursor in block (else cut line). /NM=1 - Show no messages /NEM=1 - Will not end block marking /NW=1 - Windows version only. Do NOT copy block of text to Windows clipboard. /NW=2 - Copy text FROM the Windows clipboard rm( "Cut /B=0/NM=1/O=" + str( !block_stat ) ); // Rm( "Cut /B=52/M=1" ); // Rm( "Cut /B=53/O=1" ); // rm( "Cut /B=0/NM=1/O=" + str( !block_stat ) ); Paste - Copies block from buffer into current file. /B=n Buffer number /O=n If non-zero then the marked block will be turned turned off after the operation /A=n In non-zero then the cursor will be placed at the end of the pasted block /I=1 - Overwrite block only if cursor in block. /NM=1 - Show no messages /WC=1 - Use Window Clipboard rm( "Paste B=0/A=0/NM=1/O=" + str( !block_stat ) ); Rm( "Paste /B=52" + Param2 + "/A=1" ); Rm( "Paste /B=53/O=1" ); Rm( "Paste /B=1/O=1" ); // сделать любой блок гориз. - rm( "DoAnyBlockLine"); PushBlock(1); Поставить отмеченый блок в стек, на сохранение. Пример. if ( Cbs && Persistent_Blocks ) { SavBlk = PushBlock( true ); } пример. if ( !InBlk ) { // Save block info when cursor is not in block, then turn it off SavBlk = PushBlock( true ); Block_Off; } PopBlock( ) - вытянуть бл. из стека. на поз. курсора. // Pop block off stack and show if one pushed if ( SavBlk ) { PopBlock( true ); } BlockToStr( ) - Return marked block as a string StrToBuffer( int BufferNum ) см. текст макро. Places contents of return string into passed BufferNum paste buffer. Entry : int BufferNum - The number of a cut/paste buffer. Return_Str - The text to place in cut/paste buffer. выделить блок - весь текст -Run_Macro ('MyUtils^MarkAll '); rm('Block^SelectAll'); // SaveBlck // /BC= Amount of boxes currently on screen // /FN= Default file name to save rm ('SaveBlck /FN=C:\Temp\tmp.tmp'); IF (Block_Stat) GoTo L01; // Проверка "Есть блок? if ( Marking ) Block_End; // Выключить блок Пример: // Отметить слово над курсором. mark_pos; right; // Как красиво! word_left; str_block_begin; get_word (word_delimits); block_end; goto_mark; Пример: // Взять в строку отмеченный блок текста. If (Block_Stat) { GoTo_Line( Block_Line1); S= Get_Line; PS = copy (S,Block_Col1,Block_Col2-Block_Col1); Set_Global_STR ( 'SEARCH_STR',PS ); } Пример: // Записать омеченный блок в строку StrBL = copy ( Get_Line, Block_COL1, (Block_COL2 + 1 - Block_COL1 )); Пример: // Переделать любой блок в линейный int ox,oy; if ( Block_Stat != 1 ) { GoTo_Line ( Block_Line1 ); ox = C_Line; GoTo_Line ( Block_Line2 ); oy = C_Line; goto_line( ox ); Block_Begin; goto_line( oy ); Block_End; }; Пример: // Отметить и удалить блок - колонок. 05/05/05 18:38 tof; Col_Block_Begin; // от начала файла, кол=1 eof; Goto_Col ( 10 ); // до конца, кол=10 Block_End; Delete_Block; Пример: // Отметить и удалить все, что ниже этой строки. 01/09/13 19:28 int tl = c_line; goto_col(1); down; block_begin; while(!at_eof && (cur_char != "\f")) { down; } up; block_end; if(c_line > tl) delete_block; goto_line(tl); eol; cr;
    *^*
    Условия.
     ПЕРЕХОДЫ: CALL / GOTO / IF
    
     break; Перерывание циклов ( while, do, and for loops) по условию.
     call <label> выполнение подпрограммы.}
     goto <label> Переход по обозначенной метке.}
     ret; - Выход из подпрограммы.Заметим, что при каждом вызове CALL
                   должен выполняться свой RET
    
     можно смоделировать "бесконечный" цикл и использовать
     IF (условие) BREAK;
     IF (условие) THEN CONTINUE;
     Этот оператор позволяет пропустить оставшуюся часть петли.
     CONTINUE; Досрочное завершение петли по условию;
    
     УСЛОВНЫЕ ПЕРЕХОДЫ / while / if / else / switch
    
     do{               /* DO/WHILE loop */
         statement;           сначала выполнит а затем проверит  условие
     } while ( expression )  и если не истена повторит опять
     
    for ( init-expression; test-expression; increment-expression ) statement; int i; for (i=0;i᝺++i) { Write( '',22,4,7,0); Write( '',22+i,4,7,0); Read_Key; }
    switch ( Cod_Zn ) { case 176 : Cod_Zn = 208; break; case 177 : Cod_Zn = 209; break; Default: Break; }
    *^*

    Window - Окно,выполнения задачи.


    Window Function List



    Как делать окна- c:\Me\Src\QTest18.s

    /* процедура обработки сообщений для главного окна */

    Много примеров.-

    MyNE.s



    Window.s -этом пример изменения окон - Select_Window
    Использовать макро WinOP /T=1
      
      Каждое окно определяются индивидуальными параметрами
      
      Основа -
      int  WRab = Window_Id, // = 1 запомним, где сейчас, что б вернуться. 
                             //  индивидуальный  Идентификатор окна. работает в DLG
           Wdir;             //  новое будет окно
                             //  Ме - родительский процесс.
      int Wapi = Window_Count  -  Количество окон в системе;
      
      Switch_Window ( Wapi );// переключается на последне-созданное системой Windows`-ом окно. 
      Switch_Window( Cur_Window + 1 );//Переключиться на следующее окно
      
      Увидить разницу -
                      Запусти 
                      rm('MEERROR^MessageBox /B=1/T= Stop! /M= Cur_Window=' + str( Cur_Window )+'  |13'+
                           '  Window_Id=' + str( Window_Id ));
                      или
                           text ( ' Cur_Window=' + str( Cur_Window ) ); cr;
                           text ( '  Window_Id=' + str( Window_Id ) ); cr;
                 
      create_window;  // создаем Новое, системное-задача, окно, со свойствами по умолчанию...
         
              IF (Error_Level){rm('MEERROR^MEERROR'); Goto Fin;}
      
      int Wapi = Cur_Window; //  Номер текущего  (данного от N+1, +2, +3,...n -) окна в сист. ;
                    FirstRec = 0; CfgWin = Cur_Window;
                    str Line = Get_Line_From_Win( FirstRec++, CfgWin ); 
      
      window_handle = номер окна, сист. 
    
      str Wname = Window_Name; // = Имя окна; A,B,C... BUFFER, TMP, ERROR ...   
                                      //  Оно отображается в списке активных окон
               RM('MESYS^SetWindowNames'); // поставить очередную букву для окна.
        RM('MESYS^EXTSETUP /EXT=S/FTO=1');  // применять раскраску для этого типа файла(.S).
          или RM ('MESYS^EXTSETUP /FTO=1'); // определять тип файла из предустановок.
      
      Make_Window_Visible(1); // - видимое, для возможности принятия с него действий.
    
      Window_Attr =    //  Window_Attr = _wa_System;
     
      Switch_Win_Id (Wdlg);    возвращающую 1, если окно с таким
                               идентификатором, существует. Уже в этом окне!
    
           
    
      Есть моё макро, в котором это уже есть...
      //  #include myProto.sh
      int Wdlg = SWFILE ( str FName );  // Fname - Полное имя файла. 
      
    Сохранять в Глоб. ПЕРЕМЕННЫЕ
    НЕ ПУТАЙ С номером WId !!!

    
    
         
    IMPORTANT:window_attris a WORD size var, not BYTE. When anding out bits, you need to take this into account. For example, "window_attr &= 0xFE" should be "window_attr &= 0xFFFE".

           ==7===\==6==\==5==\====4====\ \====3====\===2===\===1===\===0==¬
          ¦буфер ¦Окно ¦Text ¦нет гориз¦ ¦нет верт.¦нет р. ¦нет лин¦скрыто¦
          ¦      ¦Mini ¦Hexa ¦полосы   ¦ ¦полосы   ¦бордюра¦статуса¦от списка
          L======¦=====¦=====¦=========¦ ¦=========¦=======¦=======¦======-
      Window_Attr  Атрибуты окна - определяют его внешний вид на экране, устанавливаются
    0x0080 - Скрытое окно, буфер, но можно становиться и смотреть 0x0012 - Одна рамка с вертик. полосой прокрутки 0x001A - Просто окно в рамке. 0x0026 - Текст в окно будет писаться в Hexa-виде! Слово. 0x003A - Hexa-виде! Двойное слово. 0x0040 - Свернутое ( mInimize ) окно! 0x4000 - Номера строк, Десятичные. ( вспомнил 17/02/11 23:57) 0x6000 - Номера строк, hexa-Шестнадцатеричные. Есть макро- Вкл/Откл Нумерацию строк в окне - macro:ToggleLineNumbers Checked identifier: =IsLineNumbersOn Вкл/Откл «Hex mode toggle» - macro:Hex Checked identifier: =HexEnabled Если в текущем окне не обнаружено никаких изменений, то уничтожить окно IF (File_Changed == 0) Delete_Window; очистить окно IF (File_Changed == 0) Erase_Window;
    См. Внимательно, изучая - Window.s например, площадь окна на экране - "cur_window_area" см.File:"C:\Me\Src\Window.s"; Line:1501; и другие... ШРИФТы в окне... Цвета окна если переменная Window_Color_Stat == 0, то цвета беруться по умолчанию в зависимости от расширения файла загруженного в окно. В противном случае см. Пример. // Делаю окно для показа найденных строк switch_window ( window_count ); create_window; W1 = cur_window; Window_Attr = $12; Size_Window ( wx, wy, wx + 76, wy + 8 ); // Установлю свои цвета, для окна показа. <- 27.06.00 16:36 Window_Color_Stat = TRUE; // свои цвета T_Color = $70; B_Color = $70; S_Color = $70; C_Color = $70; H_Color = $30; EOF_COLOR = $75; L_Color = $70; LB_Color =$31; // Size_Window(3,1,23,80);// Изменить размеры текущего окна Link_Window( Cur_Window + 1 ); //Связать текущее окно со следующим Оформление окна - линия статуса Ma-mm - длина сообщения Позиции показа линий колонок вставлять в текст макро - Put_Line_Num( c_line );
    Создать новое окно и уже в нём! int Wrab = Window_Id; // запоминаю, в каком я сейчас есть, чтоб знать куда вернуться. Switch_Window ( Window_Count ); // Становлюсь на существующее уже последнее. Create_Window; Window_Attr = $81; // буфер, невидимый. -- File_Name = 'NewFILE.EXT'; // даю ОКНУ имя, как файл. -- RETURN_STR = HLPFile; rm('MESYS^LDFILES /PRE=1/CW=2/DE=1'); RM('MESYS^SetWindowNames'); // поставить очередную букву для окна. RM('MESYS^EXTSETUP /EXT=S/FTO=1');// применять раскраску для этого типа файла(.S). или RM ('MESYS^EXTSETUP /FTO=1'); -- Make_Window_Visible(1); // Load_File(FName); // с номером = Cur_Window; --- MeUtil1.s // Подробнее см. Файловые Операции Пример://Новое окно Switch_Window( Window_Count ); Create_Window; SetWTabMode( true ); Format_Line = tag_Format_Line; Work_Win = Window_Id; Пример://Новое окно и файл в него- int WRab = Window_Id, // запомним, где сейчас, что б вернуться. Wcod; // новое будет окно str FName = "C:\\Me\\Confic\\ReCode.txt"; if(!Switch_File ( FName )){//Если окна с таким файлом нет. switch_window ( window_count ); create_window; // делаю окно и загружаю в него файл Load_File(FName);// с номером = Cur_Window; } Wcod = Window_Id; // уже в новом окне нахожусь, пока запомню! Пример://Новое окно и файл в него- Rm( "CreateWindow" ); // см. в CmdTools.s File_Name = Truncate_Extension( DbFile ) + ".txt"; UpdWin = Cur_Window; OrgWin = Window_Id; Пример://Новое окно int Wrab = Window_Id; call MakeWin; Wnew1 = Window_Id;// номер нового окна, по которому к нему обращатся - // так - Switch_Win_Id( Wnew ); Wnew2 = и т.д. ... Switch_Win_Id ( Wrab ); // не забывай вернуться. MakeWin: // подпрограмма установки параметров окна. Switch_Window( Window_Count ); Create_Window; // уже ТАМ !!! Window_Attr = 0; Window_Name = 'L'; ret; Заполнение нового окна записями Put_Line(" строка первая "); Down; Загрузка файла в окно определяется предварительно установленной системной переменной Line_Terminator =''; бинарный двоичный; при записи установить EOF_CR = 0, чтобы к концу файла не добавлялись CR/LF. Установить Right_Margin; ='|10'; Unix ='|13|10'; текстовый ДОС или Windows; = или любые другие, для непонятливости. Пример://Делаю новое окно и загружаю в него файл. Switch_Window ( Window_Count ); Create_Window; Wtxt = Window_Id; // запоминаю, что б знать к кому обращаться.. Window_Attr = 0; // Window_Attr = _wa_System; Load_File( FName ); // если такой файл не найден, то делаю новый. if ( Error_Level ) { File_Name = FName; File_Changed = false; } tof; Switch_Win_Id ( Wtxt ); Make_Window_Visible(1); Сохранение, запись текста, из одного окна в другое
    Удалить окно if( Switch_Win_Id ( Wnew )) Delete_Window; // запиши, перед этим! или Erase_Window; // ОЧИСТИТЬ. пустое окно будет
    Записать окно на диск. if( Switch_Win_Id ( Wnew )){ Return_Str = "C:\\Me\\Temp_Me\\BLtmp.tmp"; rm('USERIN^QUERYBOX /T= Записать ОКНО, как файл => /P=/W=80/ML=240'); if (!Return_Int) Goto Fin1; // // Содержимое окна - это не файл ещё !!!. // На окне с выбраными строками - из окна сделать файл. rm('Block^SelectAll'); rm ('SaveBlck /FN=' + Return_Str); // если ошибка --- IF (Error_Level) { rm("MEERROR^MEERROR"); Goto Fin1; } } Пример:// Дописать строку к концу произвольного файла int Wrab = Window_Id; // запоминаю, в каком есть Switch_Window ( Window_Count ); Create_Window; Window_Attr = $81; // буфер, невидимый. Load_File( Fname ); // в ***.DB файл храниться в буфере, помни об этом. eof; Put_Line ( tstr ); Save_File; // Можно и так, // rm ('Meutil1^SaveFile /NP=1'); но будет вопрос о перезаписи. Delete_window; Switch_Win_Id ( Wrab ); // возвращаюсь обратно. Пример:// Делаю окно; int Wrab = Window_Id, // Запомним, В этом окне работаем сейчас. W1, // В этом окне буду найденые строки собирать. W2; // А этом - их номера. create_window; W2 = cur_window; Window_Attr = $80; Switch_Win_Id ( Wrab ); // Вернулся в рабочее окно. Пример:// Делаю 3 новых окна; switch_window ( window_count ); create_window; W1 = cur_window; create_window; W2 = cur_window; create_window; W3 = cur_window; ..... здесь другое ... ..например switch_window ( Wn1); // Через 5 часов экспериментов дошло это... ... и затем ... удаляю 3 ранее сделаных окна; в обратном порядке, что был при их создании; Switch_window ( W3 ); delete_window; Switch_window ( W2 ); delete_window; Switch_Window ( W1 ); delete_window; Пример:// но можно и так делать окно rm ('WINDOW^WINOP /T=0'); что равносильно rm ('WINDOW^MAKEWIN /NL=1'); IF (Error_Level != 0) { rm('MEERROR'); };// не забывай Refresh = 1; New_Screen; // обновить содержимое окна (то что на экране) Пример:// Просмотр файла return_str = Fname; //-файл_что_надо_смотреть rm('DIRSHELL^DIRFILEVIEW'); // раньше было Имеется макро с готовым окном, Пример её применени int omode, o_win; // в них запомним старое return_str = 'C:\ME\BUF.TXT'; str vfl = return_str; // имя файла, что смотреть собираемся. refresh = false; omode = mode; mode = edit; o_win = window_id; rm ('LDFILES /LC=1/NC=1'); read_only = TRUE; // только просмотр RM('USERIN^EDITWINDOW /X=5/Y=5/W=70/L=18/H=ME^*/SE=1/T=' + vfl); refresh = false; mode = omode; read_only = false; delete_window; switch_win_id( o_win ); Пример: // Проверим есть ли уже нужное нам окно с именем 'LST' ? For(N=1; N <= Window_Count; ++N) { Switch_Window( N ); if ( Window_Name == 'LST') goto L01; } Пример://Перейти в окно Window_Id = 1, если оно существует IF (Switch_Win_Id( 1 )) Goto L1; ELSE Goto Fin; Пример:// Переключиться на окно с файлом FName int WRab = Window_Id, // запомним, где сейчас, чтоб вернутьс Wtxt; // новое будет окно if(!Switch_File (FName)){//Если окна с таким файлом нет. switch_window ( window_count ); create_window; // делаю окно и загружаю в него файл
  • Load_File(FName);// с номером = Cur_Window; } Wtxt = Window_Id; // уже в новом окне нахожусь! Пример: // убираю вспомог. окно - Wtxt switch_window(Wtxt); If ( File_Changed ) { save_file; } Delete_Window; Switch_Win_Id ( Wrab ); // Вернулся в рабочее окно.
  • *^*

    Вывод на ЭКРАН. ПОКАЗАТЬ. Цвета / Рисунки / bmp


    Рисунки-Иконки кнопок.

    COLOR - Для каждого окна.

    MessageBox - коробка с сообщением.

    MEERROR - выдать код ошибки.

    DLG - очень подробно.



     
     
     
     
     #include StdDlgs.sh
     Показ со знаком вопроса и бип. Нельзя скопировать текст.
     msgdlg("Пишу-Привет", "Заголовок","", 0); // Если "" втавить "пп" - то буде доп.кн.<Help>
        
     На экран ( поверх окон ):  Make_Message / Put_Box
    
     используя макро -
     #include Stddlgs.sh
     msgdlg ("Сообщение//n что в окне ?", "Заголовок","", 0);
    
     make_message("M1 " + str(12+34) + " = " + file_name);
     read_key;
    
      if ( g_TagDlg ) {
        SendMessage( g_TagDlg, wm_Command, WCmd_TagViewOptions, 0 );
      }
    
     

    Индикатор процесса

    #include StdDlgs.sh int dlg = OutputDlgCreate(" Please wait... ", "","", 40, 1, 0); =============== OutputDlgMessage( dlg, "List..." ); // идет процесс ============== OutputDlgKill(dlg); == // поставить окно - int Dlg = OutputDlgCreate( "Выполняю:", "", "", 80, 2, 0 ); // задержк по времени. Таймер - int T0 = System_Timer, Ts=0, WTime = (System_Timer + (18*15)); // 5 sec. 1 тик = (1/18) секунды do { // 1 сек = 1000*18 тиков // здесь что-то делать в течении // OutputDlgMessage( Dlg, "Процесс идет ..."+str(Ts)+"sec.\n"+ " T0="+str(T0)+"\n"+ " ==================== "+"\n" ); Ts =(System_Timer - T0) mod 18; // это число = 0 каждую секунду. } while( System_Timer < WTime ); OutputDlgKill( Dlg ); // Kill output message dialog В другое окно ( скрытое окно): В файл на диске: - На принтер - можно использовать [имеющиеся макро] - или непосредсвенно [через BIOS (int17h)] - управляющие [коды принтера] Write( Return_Str + ':'+STR(Return_Int),12,4,7,0); Write_SOD (Return_Str); //Сообщение + ВК/ПС на стандартном устройстве вывода Write_SOD( 'Прекрасно!|13|10' );
    Modifying colors in Multi-Edit WINDOW_COLOR_STAT = 1; // то - Для каждого окна можно установить: T_Color Text color B_Color Border color S_Color Status (or bold) color C_Color Changed text color H_Color Highlight (as in block) color EOF_COLOR Individual window End-Of-File marker color LINE_ATTR = 1 // то для линии свои цвета устанавливаются = 0 - use the default colors. L_Color Current line color of current window = 0 Выкл LB_Color Current line color IN A MARKED BLOCK of current window W_L_Color Default value for L_Color W_LB_Color Default value for LB_Color $HL - ( H-фон; L-знак ) 0 0 BLACK 8 8 DARKGRAY 1 1 BLUE 9 9 LIGHTBLUE 2 2 GREEN 10 A LIGHTGREEN 3 3 CYAN 11 B LIGHTCYAN 4 4 RED 12 C LIGHTRED 5 5 MAGENTA 13 D LIGHTMAGENTA 6 6 BROWN 14 E YELLOW 7 7 LIGHTGRAY 15 F WHITE

    Рисунки - Иконки для кнопок.

    Рисунки в МЕ можно дополнять и исправлять.
    Просмотр/Ред. файлов ресурсов
    C:\Program Files\Total Commander\Soft\ResHacker\ResHacker.exe
    Написал макро-
    macro:BitMapE - EditBitmap - для просмотра и редактирования


    macro:"Mew^CommandMapEdIT" (- посмотреть там как выбираются рисунки.)
    Buttons в форме - Command Mapping
    начальное макро - Edit Toolbox
    Файлы Рисунков - заготовки в папках:
    ......... . . . . . c:\Me\Bitmap_MewBmp32\
    ..... и др...
    Макеты иконок, форм и др. в файле - c:\Me\MewLib32.dll
    ....... их тоже можно менять...


    Файлы с ресунками, собраны -
    c:\Me\MewBmp32.dll - тут много, все , можно менять
    c:\Me\UsrBmp32.dll


    Рисовать проще всего -
    C:\WINDOWS\system32\mspaint.exe <FILE>.<EXT>


    Рисунки BMP - (25х25) и (15х15) - там понятно все.
    Меняется просто - но Ме не должен быть запущен.
    Потом можно посмотреть...



     
     =========================================================================
     #include StdDlgs.sh  
       
       VOID DrawMEWButton(   // Displays a Multi-Edit button.
       DWORD lparam,  DWORD handle,  DWORD bw, DWORD bh,  ASCIIZ p, DWORD flags );
       
       Parameters
       lparam -Pointer to a drawItem struct.
       handle - Handle to the bitmap. 
       bw - button width.
       bh - button height.
       p -Text to be displayed on button.
       flags
       
       BM_VERTICALCENTER   (0x01) Center vertically 
       BM_HORIZONATLCENTER (0x02) Center horizontally 
       
     =========================
    
        str Set_Bitmap( str bitmap_str, int parent ) {
          int handle;
          DlgSaveRetStr( False );
          GenerateResList (
                Me_Path + "MewBmp32.dll",
                GetUserPath () + "BmBtn.db",
                "BM=",
            0);
        
          GenerateResList (
            Me_Path + "UsrBmp32.dll",
            GetUserPath () + "BmBtn.db",
            "BM=",
            1);
    
    
    *^*

    DLG - Меню - Диалоги.


    Menus and Dialog Boxes

    Вывод на экран - Графика. Рисунки.

    МЕНЮ - организация выбора.( очень удобные боковые и плавающие.)

    Выдать ПРОСТО сообщение на экран

    Индикатор процесса.
  • USERIN- Прочитать там про MessageBox
  • DATA_IN
  • VERIFY
  • QUERYBOX
  • XMENU

    
    
    if ( VerifyDlg( "Create " + RemoveTrailingSlash( g_WLCCPath ) + "?", "Common Code Directory Does Not Exist", "", 0, 0 ) == id_std_Yes )
    "Template"; <F9> - там есть.. Пример - Tips.s в одном --- int Dlg; DlgCreate( Dlg ); g_TipDlg = Dlg; кнопка - DlgAddCtrl( dlg, DLG_PushButton, "Далее...", 100, DLG_PosOffset | dlg_units | 15, 17, 1, NextTip_ctrl, dlgf_disable, "/M=_GetTip" ); ............ кнопка выход - DlgAddCtrl( dlg, DLG_PushButton, "Close", 100, dlg_units | 168, // 90 - 168 17, 1, Close_ctrl, dlgf_DefButton, "/R=0" ); для срабатывания /EXITMAC=_TipExit а там.. ( см.ниже) вместо DlgKill( dlg DlgExecute( dlg, Close_ctrl, Title, "", "/EXITMAC=_TipExit /PRELOOPMAC=_GetTip", Tips_Modeless ); без DlgKill( dlg ) и два макро - 1) _TipExit тут выход из окна int TWinId = Window_Id; int SavRefresh = Refresh; // так удаляется, вместо DlgKill( dlg - такой код... g_TipDlg = 0; // тут был id Dlg if ( Switch_File( FExpand( g_TipsDbFile ) ) ) { if ( Window_Attr & _wa_SystemHidden ) { Delete_Window; } } g_TipMoreHelpCtx = ''; // g_TipsDbFile = ''; Refresh = SavRefresh; 2) _GetTip тут обновление полей int T_Refresh = Refresh; int Active_Window = Window_Id; Switch_Win_Id( Active_Window ); Refresh = T_Refresh; DlgSetStr( Dlg, Tip_Text_ctrl, Tip ); DlgUpdateCtrl( Dlg, Tip_Text_ctrl, 0 ); DlgEnableCtrl( Dlg, MoreHelp_ctrl, g_TipMoreHelpCtx != '' ); DlgUpdateCtrl( Dlg, MoreHelp_ctrl, 0 );
    int Dlg, DlgExe; // Описания см. в Dialog.s Dialog.sh ПРИМЕРы - DlgExa.s DlgCreate( Dlg ); DlgSetPos( dlg, 10, 10); // координаты показа окна, левый,верх. на экране.( x,y - pixel.) // запомнить координаты - что б там же откуда ушёл... Рамка DlgAddCtrl( Dlg, DLG_BlackFrame, "Заголовок Рамки", 1, 1, // пиксель, строка В Меню 100, 10, // квадрат шириной 100 на 10 строк. 1000, 0, "" ); DlgAddCtrl( dlg, DLG_BlackRect, "", 10, 2, 68, 5, -1, 0, ""); Картинка DlgAddCtrl( Dlg, DLG_BitmapStatic, "BT_HL_100", 1, 1, 0, 0, 1000, 0, "" ); Текст, статический, нельзя копировать DlgAddCtrl( Dlg, DLG_Static,"Простой \n Показ\n текста...", 2, 2, // кол. - линия 100, 5, // длина - ширина ( Для олной строки -0,0 не важно.) 1020, 0, "" ); Писать в Ме "Простой \n Показ\n текста..." Для строки, то str tstr = sss +'|13'; - Выдать надпись - DlgSetStr( Dlg,1020, Shorten_Str( tstr )); DlgUpdateCtrl( Dlg,1020, 0 ); // обновить - "освежить" поле Ввод текста в одну строку Можно копировать и редактировать. tstr1 = "hjhjhjhjhj" //- начальный показ. DlgAddCtrl( Dlg, dlg_Text, tstr1, // 1, 2, // Лев.верх угол поля ввода 120, 1, // Длина поля ввода в пикселях - ширина ( для линии =1 всегда?) 1021, 0, "/ML=250" ); WWWFile = DlgGetStr( Dlg, 100 ); Slash -проблема. уже без слашей - menu_item_str ( dlg, jx, 2 ) Удвоить надо - while (k = xpos("/", WWWFile, k)) { WWWFile = str_ins("/", WWWFile, ++k++); } tstr2 = DlgGetStr( Dlg, 1102 );//- Принять вводимое из одной строки. if (tstr1 != tstr2) // строка была изменена и можно перепивать. Выбор папки, см.File:"C:\Me\Src\MyUtils.s"; Line:3789; и запмсь в линию. Там же история. или см.File:"C:\Me\Src\Metags.s"; Line:4515; DlgAddCtrl( dlg, DLG_Static, "&File(s):", 8, 2, 0, 2,-1,0, "" ); DlgAddCtrl( dlg, DLG_Text, return_str, DLG_PosOffset + 10, DLG_PosOffset, 50, 0, 1000, 0, "/ML=" + str(max_line_length) + "/HISTORY=TAGHISTORY" ); DlgAddCtrl( dlg, DLG_PushButton, "...", 69, DLG_PosOffset, 0, 0, 120, 0, "/R=120/M=TagFilePrompt /FIELD=1000" ); А что бы много строк показыватьто нужно сначала сделать для них окно - Wtxt -, куда их записать, а потом вот так- DlgAddCtrl( dlg, dlg_Text, "Текст в Окно", 1, 2, 170, 20, // Ширина и высота окна. 1102, dlgf_GetTextFromWin | dlgf_es_MultiLine | dlgf_es_WantReturn, "/ML=32000/WID=" + Str( Wtxt )); // Окна, где строки. Показ окна, с раскраской текста. DlgAddCtrl( Dlg, dlg_ViewTextBox, "", 1, 1, 150, 16, // было - 180, 16 ширина и высота окна показа. 1006, 0, "/WIN=" + Str( Wstr ) ); Число DlgAddCtrl( Dlg, DLG_Integer, "", 1, 2, 6, 1, 1000, 0, "/MIN=1/MAX=40" ); DlgAddCtrl( Dlg, DLG_Integer, "", // Ввод целого числа. 1, 2, // x=1, y=2 второй ряд. 10, 1, // ширина и высота -field_width, поля ввода. 1000, // integer_ctrl, - можно любой? По нему получать значение. 0, "/MIN=0/MAX=99999999999999" ); // =0;=1только показ; =8 друг.. DlgSetInt( dlg, 1000, 56 ); // установка начального значения.=56. DlgSetInt( dlg, 1000, Lstr ); int NN = DlgGetInt( Dlg, 1106 ); // получить значение. DlgAddCtrl( dlg, DLG_RealNumber, "", // Ввод реального числа. 45, 3, 5, 0, // 5 знаков ввода. 1107, // realnum_ctrl, 0, "" ); Птица DlgAddCtrl( Dlg, dlg_CheckBox,"&Есть - что значит эта птица", 2,2, // 0, 0, 1001, 0, "" ); Если вместо 0, Dlgf_Disable, то пишется смутно, вводить нельзя. DlgSetInt ( Dlg, 1001, 1 ); // Начальная установка значения, ГАЛОЧКА=1. DlgSetInt ( Dlg, 1001, Block_Stat ); // =1Установить, если блок есть. в начале. ---- после выполнения ! - int G1 = DlgGetInt( Dlg, 1001 ); // получить значение. DlgEnableCtrl( Dlg, 1001, true ); // разрешить DlgUpdateCtrl( Dlg, 1001, 0 ); // «освежить» поле Список - Окошко, для выбора одного из трёх и более..., Set_Choice_Str = "Стихи()Роман()Сказка()"; DlgAddCtrl( Dlg, dlg_Choice, Set_Choice_Str, // 1, 1, 20, 1, 1023, 0, "/CHANGEMAC=_TmpSetChange2" ); int V2 = DlgGetInt( Dlg, 1023 ); // получить значение от 1 до №. DlgEnableCtrl( Dlg, 1001, true ); // разрешить Радио-кнопки см. макро - CmacUtil^MacListSort Кнопка запуск макро... DlgAddCtrl( dlg, Dlg_PushButton, "&Sort...", bpos, Dlg_PosOffset | Dlg_Units | 16, Dlg_StanBtnWidth, 0, 101, 0, "/M=MACLISTSORT"); // или так... DlgAddCtrl( Dlg, dlg_PushButton, "Next", 1, 4, 20, 0, 501, 0, "/R=12"); DlgAddCtrl( dlg, DLG_PushButton, "Помощь", 50, DLG_PosOffset, DLG_StanBtnWidth,0,103,0,"/R=2" ); DlgAddCtrl( dlg, DLG_PushButton, "Кнопка", 53, dlg_units | 9, 17, 1, WhatsNew_ctrl, DBFile != '', "/M=MeHelp /H=" + hc_WhatsNew); DlgAddCtrl( Dlg, dlg_PushButton, "&Save", 43, 7, // лев.верх угол. 20, 1, // Длина и "рельеф" кнопки. 503, // это номер, по которому выдается R= 0,"/R=14" // Зарезервированы =1(ok),2(help),,, ); Дополнительно-обязательные кнопки ( колонка, строка, ширина, ) DlgAddCtrl( Dlg, dlg_PushButton, "Go", 3, 7, 10, 0, 101, 0, "/R=1"); // DlgExe будет = 1 DlgAddCtrl( Dlg, dlg_PushButton, "Exit", 20, 7, 10, 0, 102, 0, "/R=0"); // DlgExe будет = 0 DlgAddCtrl( dlg, DLG_PushButton, "Help", 37, 7, 10, 0, 103,0,"/R=2" ); // HELP // указать переход - Help1 - см.ниже - // На индекс в файле C:/Me/Help/Me_Hlp.hlp OutputDlgMessage( Dlg, "List..." ); // Write message to output dialog
    Выполнение - очень разное, не понял, но это работает- DlgExe=DlgExecute( Dlg, 102, "Заголовок", "","",0); Надо пробовать и по другому.... DlgExe = DlgExecute( Dlg, 501, " Заголовок ", "Help1", "", 0 ); Lstr = DlgGetInt( Dlg, 1000 ); Parol = DlgGetStr( Dlg, 1001 ); DlgKill(dlg); If ( ExDlg == 12 ) Goto Next; DlgExe = DlgExecute( Dlg, 1002, "Объявление", "", "/EXITMAC=tab10s /INITMAC=tab10t", DLG_Modeless | DLG_NoParDisable); ==== обновление данных в форме открытой в другом макро === g_TipDlg = Dlg; ранее запомнить... -------- if ( g_TipDlg != 0 ) { // перейти, с новыми данными. DlgSetActiveWindow( g_Tipdlg ); return ( ); } Можно выполнять так, =1 - if ( DlgExecute( dlg, LowerCase_ctrl, "Settings", '', "/RPOS=" + _g_FLSRDlgPos, 0 ) ) { _g_SFUHex = DlgGetInt( dlg, LowerCase_ctrl ); } // Показать На Экране В Том МЕСТЕ МЕНЮ Result = DlgExecute( Dlg, idd_Lower, "Change Case", hc_ChangeCase, // "", 0 ); "/XPOS=" + Str( Pnt.X ) + "/YPOS=" + Str( Pnt.Y ), 0 ); Позицию Курсора На Экране - Pnt.X Pnt.Y Возвращает -- ---- Уже можно int G1 = DlgGetInt( Dlg, 1001 ); // получить значение. Не забывать выкл. DlgKill( dlg ); // Убрать !, но надо правильно вызывать // см. в Dialog.s -- линия 4886 // INITMAC= перед показом окна. // DEACTIVEMAC= не понял. Не применяй. // ACTIVEMAC= - постоянно раб. на обратный запуск. // EXITMAC = при выходе из макро.. R=0 //
    Простое сообщение. Return_Int = VerifyDlg( "Copy text to the Windows clipboard?", "Confirm Large Block", "", id_std_Yes, 0 ) == id_std_Yes; } if ( Return_Int ) { } Простое ТАБЛО сообщение.Постоянно. Можно выходить из него. str tstr = "Очень длиная строка.Надо написать макро, преобразованиея\n выделеного блокая в строку для отображения.\n\r\n\rЭто будет просто совсем. "; int Dlg; DlgCreate(Dlg); DlgAddCtrl( Dlg, DLG_BlackFrame, "",1, 1,82,10,1000, 0, "" ); DlgAddCtrl(Dlg, DLG_Static, tstr, 2, 2, 80, 4, 1002, 0, "" ); int RezultatDlg = DlgExecute( Dlg, 1002, "Объявление.", "HHHH","", DLG_Modeless | DLG_NoParDisable); DlgKill( dlg );
    Собрал примеры на DLG в MyNE.s - Редактирование заметки, запись в любой файл. и другие -
    DlgAddCtrl( Dlg, dlg_DirButton, "...", dlg_Units | 289, SPathBtnY, 4, 0, id_sr_DirBtn, 0, "/SID=" + Str( id_sr_PathStr ) ); Пример для выбора по нажатию кнопки -см. в void SetZnakOnStr() Использование «Радио-кнопок» см. macro: wlHiCode.s См. и др. примеры в Template.s
    *^*

    Меню



    XMENU - вертикальное и горизонтальное меню (выбор)

    QUERYBOX - панель с полем ввода

    DATA_IN - форма общего вида ( ввод данных )

    VERIFY - панель подтверждения ( текст и выбрать Y / N )

    MEERROR - выдать код ошибки


    #Include Stddlgs.sh // см. macro:"stddlgs^STest" Как применить? void TT( ) trans2 { Показ со знаком вопроса и бип. Нельзя скопировать текст.   msgdlg("Пишу-Привет", "Заголовок","", 0); // Если "" втавить "пп" - то буде доп.кн.<Help> return(); // optional } MsgDlg( "No Vion \"" + Caps(Get_Extension (Help_File)) + "\"", "Help System Problem Found","", 1 ); MsgDlg( "No Viewer Setup for the filename extension \"" + Caps(Get_Extension (Help_File)) + "\"", "Help System Problem Found", "", 1 ); // Смотри описание в #Include Stddlgs.sh - Stddlgs.s Return_Int = VerifyDlg( "Текст\nс переносом", "Заголов", "КнХелпа", 0, 0 ) == id_std_Yes; или так - Return_Int = VerifyDlg( meststr, "Нужно выбрать", "hf", 2, 1 ); if ( Return_Int == 0 ) { Goto Fin;} if ( Return_Int == 2005 ) {
    Описание на работу смотри в Win32.sh str MB1str = ' Нажмешь(Yes), будет это, нажмеж (No)будет то'; int MM = MessageBox( 0,MB1str, "Заголовак", mb_YesNoCancel); если MM = 6 - нажата кнопка (Yes) / можно и mb_YesNo - две кнопкиэ =7(No) =2(Cancel)- Можно , для выбора использовать. if ( MM == 6 ) { делать .... } ------ // Картинка КРЕСТ и Текст =Но нельзя скопировать. int MM = MessageBox( 0,"нельзя скопировать", "Заголовок ",mb_IconHand);
    Return_Int = VerifyDlg( "Copy text to the Windows clipboard?", "Confirm Large Block", "", id_std_Yes, 0 ) == id_std_Yes; } if ( Return_Int ) {
    Примеры. *** Старый, без DLG =Мой, для ввода чисел -Пример Cald.s - Число дат ny1 = menu_item_int( mnd,1,2); MessageBox - коробка с сообщением DlgExa.s См. примеры в - ДИАЛОГИ. Лучше использовать... StdDlgs.sh - меню, диалоги. C:\Me\Src\tab01.s - подробнее см. описания. int dlg,result; st1 = "Просто Надпись \n вторая строка уже... ит. д. \n третья строка"; DlgAddCtrl( Dlg, dlg_Static, st1, // Просто Надпись 1, 1, // начало левый,верх. 50, 0, // Ширина и число строк. 2003, 0, "" ); //
    *^*
    USERIN.s- Прочитать там про MessageBox
    USERIN.s #include Win32.Sh //- там все менюшки и она.
     str txtstr = "текст окна, столбиком можно " + "\n";
     MessageBox( 0,txtstr, " Заголовок окна. Можно по длиннее написать ", 0);
     
    
    // Показать окно со значениями = kvm =
    
      str MB1str = " Tstr = " + tstr +"\n" +
                 "nstrmax  =" + str(nstrmax) +"\n"+
                 "nstr  =" + str(nstr) +"\n"+
                 " codstr  =" +str(codstr)  +"\n"+
                 "Rerurn_Str =" + Return_Str +
                 "\n";
      MessageBox( 0,MB1str, " Это Macro:  ", 0);  -- Удобное, табло, красиввое.
          Описание на работу смотри в Win32.sh
      int MM = MessageBox( 0,MB1str, "Заголовак", mb_YesNoCancel);
      если MM = 6 - нажата кнопка (Yes)
               =7(No)
               =2(Cancel)- Можно , для выбора использовать.
    
    
    //Если надо показать красную коробку с нехорошим сообщением, то
    str Message = ' Ошибка ! Жми <F1> ';
    rm ('MEERROR^MessageBox /B=1/MK=/M= '+ Message +' /T=Error');
    где  /B=1
         /M= '+ Message +'
         /MK= - надпись для кнопок
         /T= Error
    if ( Key2 == 59 ) rm('MEHELP^MEHELP /F=ME /LK=*');
    
    //можно ещё и по би-би-кать, для важности rm('MEERROR^BEEPS /C=6'); // 6 сигналов пропикает(переделанных) // или или вообще поиграть, что "приплыли" rm('MEERROR^BEEPS /C=40/F=7000/D=3/S=-150'); /C=n сколько раз бибикнуть /D=n длительность (default = 60); /F=n частота (default = 520) /P=n пауза между( default = 40) /S=n шаг изменения частоты + вверх; -вниз
    *^*
    *DATA_IN*
    Примеры макро (для тестирования).
    
    1. Сначала нужно подготовить глобальные переменные:
    
    Поле ввода для (1-й) строки:
      SET_GLOBAL_STR('префиксISTR_1','нач_знач');
    Поле ввода для целого числа:
      SET_GLOBAL_INT('префиксIINT_1','нач_знач');
    
    2. Теперь готовим параметы для поля ввода:
    Set_Global_Str('префиксIPARM_1','/T=text'+ 'др.(см.ниже)' )
    
      /T= подсказка поля, рамки, приглашение, и др...
                                                               
  • /C= /L= относительная колонка начала( по умолчанию 1,1) /W= ширина поля/окна ввода (кол.знаков) ( вся, для первого ) /ML= ограничение поля ввода ( можно не вводить ) /QK= позиция символа "Быстрой Кнопки" /HT= высота окна для TP=15 и TP=16; /HISTORY=MACRO_HISTORY - список предыдущих данных (показывать [ ]) /WIN= инд.номер предварительно открытого окна(для TP=15 и TP=16); /TP= тип поля, 0 - STRING INPUT - ввод строки, возвращает в GLOBAL_STR; 1 - NUMERIC INPUT: - ввод целых чисел, возвращает в GLOBAL_INT; 2 - FLOATING POINT: - ввод действительных чисел, возвращает в GLOBAL_STR; 3 - MULTIPLE CHOICE - (не знаю как работать); 4 - HEX INPUT - Возвращает целое число в GLOBAL_INT; 5 - TOGGLE: true or false. ISTR_x = '/T=YES/F=NO' IINT_x = boolean value. 7 - Run macro, return integer. IPARM=x /M=macro (must be last parameter) The following parameters get passed to the macro: /X=nn /Y=nn /STR=str (the string in ISTR_x) 8 - SELECT с "историей", можно запускать макро (см.ниже прим.); Run macro, return string(or return global, see below). IPARM=x /M=macro (must be last parameter) /X=nn /Y=nn /INT=nn (the integer in IINT_x) 9 - KEY ASSIGNMENT: Возвращает в Return_Str клавишу; 10 - просто текст написать (и можно так не активные кнопки изображать); 11 - BUTON кнопка ввода(см.ниже прим.); 12 - () RADIO BUTON - возвращает в GLOBAL_INT (0/1); 13 - [X] CHECK BOX: выбор 0/1 - возвращает в GLOBAL_INT; 15 - LIST BOX: окно с прокруткой справа; 16 - EDIT BOX: окно для ввода/изменения текста; 20 - DIR LIST: окно директории и выбор файла; если /SDD=0 - то пропал показ директории...; Return_Str и GLOBAL_STR = /DR=0/LE=C:\ME\SRC\TESTMAC.S/DA=1 если /TP=11, то имеют смысл: /T= Кнопка - надпись на кнопке /KC=<F2> - символ клавиши /K1=0 - Key1 /K2=60 - Key2 /R=10 - число возвращаемое в Return_Int если /TP=12 или 13, то /QK=n ,где n позиция символа "Быстрой Кнопки" если /TP=20, то после <Esc> выходят Return_Str и GLOBAL_STR = /DR=0/LE=C:\ME\SRC\TESTMAC.S/DA=1 и другие, которые я пока не знаю. 3. А вот теперь уже можно вызывать макро: rm('USERIN^DATA_IN /параметры панели'); или так: к RM('DATA_IN '); ­­­­­­­<­­­­­­­­­ Параметры панели ввода: /X= /Y= координаты панели на экране (можно не указывать - тоже красиво) /T= заголовок панели; /W= размер панели по горизонтали (можно не указывать ) /#= число вводимых параметров; /S= изначально-выбраный пункт ( от 1 до # + число кнопок); /PRE= префикс глобальных строк, используемых макро; /A= число кнопок выбора 0 = Accept or Cancel. 1 = Accept no matter what 2 = Force use of enter key for accept 3 = Enter key is Go, F10 key is Done 4 = Esc key is DONE; /ABT= /CBT= надписи на кнопках выбора; /F= им_файла.DB ( при TP=15 ) Returns: RETURN_INT = 0 if the <ESC> key was pressed. Else RETURN_INT = Then item that <ENTER> was pressed on. Для TP=11: Set_Global_Str('TT_IPARM_1','/T= Кнопка ' +'/C=1/L=1/TP=11/KC=<F2>/K1=0/K2=60/R=10'); Для TP=8 : Set_Global_Str('TT_IPARM_1','/T= Device OutPut ' +'/C=1/L=1/TP=8/W=12/M=PRN_SET_DEVICE'); Пример 1: macro TDATAIN dump { Set_Global_Int('TT_IINT_1',1); Set_Global_Str('TT_ISTR_1','пример'); Set_Global_Str('TT_IPARM_1','/T= Текст ' + '/C=1/L=1/TP=7/QK=1/M=PRINTER_DEVICE/H=1'); rm('USERIN^DATA_IN /T=PRINT/X=5/Y=4/W=70/#=1/PRE=TT_/A=3'+'/ABT=/CBT='); Make_Message('Return_Int= '+STR(Return_Int)+' Return_Str = '+ Return_Str); Write('GLOBAL_INT = '+STR(GLOBAL_INT('TT_IINT_1')),3,10,7,0 ); Write('GLOBAL_STR = '+GLOBAL_STR('TT_ISTR_1'),3,11,7,0 ); Read_Key; } Пример 2: Выбор файла из открытого каталога. int menu = menu_create; menu_set_item( menu, 1, '', '', '/C=1/L=1/SDD=0',20,0, 0); Return_Int = menu; RM ('UserIn^Data_In /HN=1/W=51/HT=24/T= Files /S=0/#=1'); return_str = menu_item_str ( menu, 1, 2 );; make_message (' File = ' + return_str ); menu_delete ( menu ); Пример 3: 1. Создать новое окно. 2. Загрузить туда строки ( можно из файла и т.д.) 3. Приготовить строку параметров для макро Data_IN 4. Запустить на выполнение TP=15 5. Параметры возврата int menu = menu_create, tint, old_window = window_id, tRefresh = refresh, Wlist; // окно со списком строк. str tstr; refresh = false; // Сначала нужно открыть окно Wlist и записать туда строки из файла // WIN = nn Window number // пусть файл строк такой - C:\ME\test.dat switch_window ( window_count ); // встанем на последнее create_window; Wlist = cur_window; switch_window( Wlist ); put_line ( 'Буквы' ); down; put_line ( 'ФеБуквы' ); down; // и т.д. непосредственно или Load_File('Имя_файла'); // Можно предусмотреть выборку из файла menu_set_item ( menu, 1, 'Выбор:','', '/DC=1/QK=1/L=1/C=1/W=32/HT=4/WIN=' + str ( Wlist ) , 15, 0, 0 ); Return_Int = menu; rm("USERIN^DATA_IN /X=21/Y=6/HN=1/PRE=V/#=1/S=1/T= TEST /H=ME^FDB"); // теперь надо узнать - Что же было выбрано! Как это сделать? tint = C_Line; // Посмотрел в примерах - оказывается очень просто - tstr = Get_Line; // т.к. из этого окна мы ещё не уходили Return_Str = tstr; menu_delete ( menu ); switch_window( Wlist ); delete_window; switch_win_id ( old_window ); Refresh = tRefresh; // показать что выбрано Make_Message (Return_Str + ' ' + str(tint)); Пример 4: // Ввод строки и целого числа и запуск макро, кнопка int menu = menu_create; PROMPT_AGAIN: str tstr ='строка'; menu_set_item(menu,1,"Ввод:",tstr,"/QK=1/L=1/C=1/W=1/ML=1/HISTORY=",0,0,0); int b2 =123; // Ввод чисел menu_set_item(menu,2,"Число","","/QK=1/L=2/C=1/W=3/MIN=1/MAX=999",1,b2,0); // Запуск макро menu_set_item(menu,3, 'Sort', 'DIRSHELL^DIRSORT /UPDATE=5', '/C=51/L=11/M=1/QK=1',11,0, 0); // Надпись menu_set_item ( mh, 4,"Просто показать","","/L=2/C=36/W=20",10,0,0); // Кнопка menu_set_item ( menu, 5, "Дело","","/KC=<F4>/C=34 ' + '/L=12/K1=0/K2=62/R=10",11,0,0); // [X] "Check boxes:" menu_set_item(menu,6," box 1 ","","/L=5/C=21",13, 1 ,0); Return_Int = menu; RM("USERIN^DATA_IN /X=21/Y=6/HN=1/PRE=EX/#=3/S=1/T=Заголовок/H=ME^*"); // принять и присвоить из меню: ====== tstr = menu_item_str(menu,1,2); /* String type 0 */ <Help F1> tint = menu_item_int(menu,2,2); /* Integer type 1 */ Всегда! tint = menu_item_int(menu,6,2); // [X] выбрано // Дальнейшие действия будут зависеть от того, что выбрано switch ( Return_Int ) { case 0 : { goto FinM; или Goto PROMPT_AGAIN; } // Нажат был <Esc> case 1 : { // <Enter> } case 10 : { // Кнопка "Дело" } default : { // другое } };// end Switch FinM: menu_delete(menu);
  • *^*
    *VERIFY * Запрос на подтверждение
    
     int R =VerifyDlg( str Msg, str Title, str HelpCtx, int DefBtnNo, int ShowBtns );
     R = The button pushed.
     См. в StdDlgs.sh - меню, диалоги.
    
    =========
    Пример 1:
    //Make_Message ( 'Нет отмеченного <F6> блока строк ');
      rm ("USERIN^VERIFY /BL=/T= Нет блока.Выделить всё и повторить? /S=1");
      if ( Return_Int ) { rm ( 'MEUTIL2^MARKALL' ); goto Rab01; }
    
    Пример 2:
      rm('USERIN^VERIFY /BL=/T=The File is not .SRC; Continue?/S=1');
      if(!Return_Int) Goto Fin;
    
    Пример 3:
      tstr = 'Это будет не очень длинная строка,';
      rm('USERIN^VERIFY /S=5/T=' + tstr);
      rm('USERIN^VERIFY /BL=заголовок рамки /T=текст в рамке /S=0');
      /S=n - Starting item (0=Yes, 1=No);
      Если BL='', то--  /H=ME^* - help string.
      ­­­­­Please Confirm­­­­­­
      text
      Если нажат
      Yes No Help<F1> "Yes" Return_Int = 0
      "No" Return_Int = 1
      "Help<F1>"
    
    *^*
    *QUERYBOX *Ввод строк и чисел
    
    rm('USERIN^QUERYBOX /T= заголовок /P=подсказка /другое');
    другое:
          /W=40 - количество знаков в поле ввода(видимых);
          /ML=127 - общее количество знаков для ввода;
          /C=2/L=6 - колонка и линия верхнего угла рамки;
          /N=1 - ввод int или $hexa чисел;
          /MIN=4/MAX=23 - мин. и макс. значения для чисел.
          /H=ME^* - страница из файла помощи.
          Return_Str = 'начальное значение строки'; // установить, если надо
          или Return_Int = 1; // если ввод целого числа
    
    
     ---------------
    
          Return_Str = 'рас';
          rm('USERIN^QUERYBOX /T= Вводи слово /P=40 букв /W=40/ML=40');
          if ( !Return_Int) goto Fin;
          tstr = Return_Str;
    
    
     ---------------
          Return_Int = N;
          rm('USERIN^QUERYBOX /T= Вводи число /P= число/N=1 /W=4');
          if ( Return_Str != 'TRUE') goto Fin; // Перед hexa ставь $ 
          N = Return_Int;
    
    --------------- Ввод для real-чисел.
          str Nreal;
          real N;
          return_str = '0';
    
    Vvod: // Ввод для real-чисел.
          rm ('USERIN^QUERYBOX /T= Вводи число /P= Число = /N=0 /W=8');
          if ( !Return_Int ) goto Fin; //Нажат <Esc>
          if ( RVal ( N, Return_Str )) { beep; goto Vvod; }
          Nreal = RStr ( N, 6, 4);
    
    
    
    *^*
    *XMENU
    
    rm('USERIN^XMENU /L=ВЫБОР/#=3/B=1/T=1/M=h()j()y()');
       /X, /Y - координаты меню на экране
       /B=  =1-создавать меню в рамке, =0 - без рамки.
       /L - этикетка к меню;
       /#=n ;
       /T= 1 - Вертикальное меню (0-гориз.)
       /S=nn - номер выбраного пункта меню
       /M=ТЕКСТвыбора1()ТЕКСТвыбора2()...
              /* ­­­­ВЫБОР­­­­­
              h Возвращает Return_Int = 0, если <Esc>
              j иначе номер выбраного пункта.
              y
              ­­­­­­­­­­­­­­ */
    Но можно и сложнее, с запоминанием выбранной позиции,
    и возвращением к ней.
    
    if (Return_Int ) {
    if (Return_Int == 1 ) { rm('1'); Goto fin; }
    if (Return_Int == 2 ) { rm('2'); Goto fin; }
    if (Return_Int == 3 ) { rm('3'); Goto fin; }
    }
    
    *^*

    Command Shell (ДОС команды).


    Me: Operating System Function List

    Справочник - параметров командной строки.

      str CmdLine = "cmd /c DIR "+PathDir+" > C:\\Me\\Temp\\dirtxt.dos";
      int ErPg = ExecProg ( CmdLine, "", "", "",_EP_Flags_ExeWin | _EP_FLAGS_MINIMIZED );
     Получить окно, Как?
    
    
     
     
     
     
     Так я дописал к началу каждого файла заголовок, и можно стало их слушать.
     copy /b HeadWAV.wav+FILM070.DAT FILM070.wav
    
    
    Пример 1:
      Чтобы вывести список всех файлов с расширением .txt во всех каталогах диска C  -
    dir c:\*.txt /w/o/s/p  > c:\Me\Temp\C_dir.txt
    str Fltmp = "C:\\Me\\Temp\\CDkat.tmp", CmdLine = "cmd /c DIR E:\\ /S/B/A-D > " + Fltmp; int ErPg = ExecProg ( CmdLine, "", "", "",_EP_Flags_ExeWin | _EP_FLAGS_MINIMIZED ); Пример 2: DIR E:\.. - получим метку и номер - Надо макро написать.
    DIR E: /O/A DIR E: /S/B/A-D - Вывод полного содержания CD пути и имена файлов. содержание папок, длинно. DIR C:\WINDOWS\*.COM /S/B/A-D - Вывод полного содержания пути и, имена файлов.

    Пример 3: chkdsk d: /f - Если требуется проверить и исправить диск D // Показать список (дерево) файлов для этой директории; rm('DIRSHELL^TREE /X=11/Y=4/CP=/CD=C'); if ( !Return_Int ) { goto fin; } Enter_DOS_Shell; // Выйти в dos shell Dir( c:\test\*.* ); //Считать директорию If (dir_path = 'a:\test\*.*') dir('a:\test\text\*.txt'); //Dos file manager operations Size_dir ( 5, 10, 60, 20, 1 ); Dir ('c:\me\doc\*.*'); Dir_mode = 0; Open_dir(return_int); Redraw_dir; Update_dir; Close_dir(return_int); Write( dir_entry_str,5,4,white, red ); Make_message('mode= '+str(mode)+' r_int= '+ str(return_int)+' r_str = '+ return_str); Пример 1: //сменить директорию Change_Dir( '\DOCUMENT' ); IF Error_Level <> 0 THEN Make_Message( 'Ошибка при смене директории' ); Error_Level := 0; END;


    *^*

    FILE - Файловые операции:

    New File


    Load


    Save


    Delete



    File Access Function List

    Как найти на диске нужный файл?
    Выбор папки: см.File:"C:\Me\Src\FastNote.s"; Line:35;
    или про так:
     #include Fprompt.sh
      str tstr = 'C:\\';
      SelectDirectory( 0, tstr, "Выбрать папку", "dHelp", 0 );
      make_message('Выбрана папка => '+ tstr);
      


    Макро добавленые в Mesys.s

    Делать новый файл, из указанной заготовки.
    MakeNewFile( str ZFile, NFile );

    Переименование\новый файл, со следущем номером000
    NextFileName( FName );

    условный тип файла получить.
    GetExtension();

    Проверить расширение файла, если не такое
    if ( CheckExtension ( 'htm;html;' ) ) { goto Fin; }



    PFname = File_Name; - полное имя файла. // Имя файла в окне, без пути и расширения: Fname = Truncate_Path ( Truncate_Extension ( File_Name )); Показать имя файла str MB1str = " File = " + File +"\n" + " AddTrailingSlash( File ) = " + AddTrailingSlash( File ) +"\n" + " GetLongName( File ) = " + GetLongName( File ) +"\n" + " GetShortName( File ) = " + GetShortName( File ) +"\n" + " Rerurn_Str =" + Return_Str + " \n "; MessageBox( 0,MB1str, "Stop! Macro: ", 0); // Переименовать в этом окне файл: if ( File_Exists (Fname)) { // менять имя для ДОС Fname = fexpand(Fname); LdFile.... } MkDir (Pname); // Новая папка, директория. например, надо сделать папку 'C:\w\t\d' сначала mkdir('C:\w'); затем mkdir('C:\w\t'); а уж затем mkdir('C:\w\t\d'); File_Name = "C:\\Me\\Text\\" + Truncate_Path ( Truncate_Extension ( File_Name )) + '.htm'; Pname = Get_Path ( PFname ); Замена / на \ int k=1; while (k = xpos("/", tstr, k)) { tstr = str_del( tstr, k, 1); tstr = str_ins("\\", tstr, k); ++k; } Переименовать файлу расширение NFile = Truncate_Extension(File_Name) + '.TXT'; NFile = 'B:\NEW\' + Truncate_Path(File_Name); str ExFile = caps ( Get_Extension ( File_name )); // или похожее имя сделать... str sCurFile = FName, sCurFPath = Get_Path ( FName ), sCurFExt = Get_Extension ( FName ), sCurFName = Truncate_Path ( Truncate_Extension ( FName )), sNewFName = '', tstr; // обрезать до 7 знаков и добавить. ( буду использовать короткие имена) if ( Length (sCurFName) > 7) sCurFName = copy (sCurFName,1,7); sNewFName = sCurFName + '_'; // добавить к концу имени Return_Str = sCurFPath + sNewFName + '.'+ sCurFExt; .... Время создания\посл.модификации файла #include Metools.Sh str TFile = GetFileTime(FileName); // Число-Код = Return the time of FileName лучше, это str FileDT = FileDateTime( FileName ); // ггггммддччmm = дата и время файла. Получить новое имя файла, что ещё не было на диске-очередной номер TStr = FName; do { CntStr = "00" + Hex_Str( ++FileCnt ); CntStr = Copy( CntStr, Svl( CntStr ) - 2, 3 ); FName = TStr + CntStr + ".TMP"; } while ( File_Exists( FName ) != 0 ); g_TmpFileCnt = FileCnt; Копировать файл: copy_file ("d:\\temp\\temp.txt", "c:\\temp\\temp1.txt",0); Первый во второй. if если Flag=1, то 1-й дописать к концу 2-го RETURNS: 0 if operation was successful, else it returns a Dos error code. Есть Макро, дляпотом обработка Rm( "SetFileName" ); Rm( "History_List /M=1/HISTORY=FILE_HISTORY" ); Файл такой существует на диске.? if ( File_Exists( Fname ) ) { Return_Int = VerifyDlg( "File exists. Overwrite?", "", hc_BlockSave, id_std_Yes, 0 ) == id_std_Yes; if ( !Return_Int ) { goto Try_Again; } } Окно с таким Файлом есть.? int WRab = Window_Id, // запомним, где сейчас, чтоб вернуться Wtxt; // новое будет окно if(!Switch_File (FName)){//Если окна с таким файлом нет. switch_window ( window_count ); create_window; // делаю окно и загружаю в него файл } // и уже в нем. назад... Есть мои макро,в myProto.s int Wid = SWFILE ( FName ); // Полное имя файла. Загр.файл и выдать его номер. или так, с выбором - Load_File( NewHTMLpage ); // Макро выдает имя ф.заготовки-шаблона. Me_Path + "MewBmp32.dll", GetUserPath () + "BmBtn.db", If (Get_Path(File_Name) != 'C:\TEST\') Enter_Dos_Shell; If ( File_Changed ) { Save_File; } // Тип файла в текущем окне.(должна быть. надо найти.) Запуск макро GetTipFileWin - тип файла. Нужно проверить! return_str = TranslateCmdLine ( Parse_Str ('DIR=', Global_Str ( gstr)), tstr); return_str = AddTrailingSlash ( Copy ( return_str, 1, jx - 1));

    • New File - Сделать НОВЫЙ ФАЙЛ

    rm('MakeWin /NL=1 /F=*.*'); // Будет сделан File_Name = '?No-File?'; === Или так: Create_Window; /* Создать окно */ int Wnew = Window_Id; /* Запомнить Номер нового окна */ File_Name = 'C:\Me\Temp\CONTEXT.html'; // Даю ИМЯ новому файлу. RM('MESYS^SetWindowNames'); // поставить очередную букву для ОКНА. RM('MESYS^EXTSETUP /FTO=1'); // применять раскраску, для этого типа файла. Make_Window_Visible ( 1 ); // Отображать окно. Put_Line ("Содержание файла:"); down; // Поместить первую строку...и т.д назад...

    • Load the file

    Load_File(Fname); // Загрузить файл в это же окно, со старыми атрибутами. // Если окна с файлом не было, делаю, иначе - переключаюсь. RETURN_STR ='C:\Me\Text\text.txt'; rm ('MESYS^LDFILES /NRL=1/CW=2/PRE=1/DE=1'); RM ('MESYS^EXTSETUP /FTO=1'); Установить атрибуты для этого типа файла. Return_Str = tReturn_Str; SET_FILE_ATTR (FName, Attr); // Sets the DOS file attribute byte. // Переключиться на окно с файлом FName int WRab = Window_Id, // запомним, где сейчас, что б вернуться. Wtxt; // новое будет окно if(!Switch_File (FName)){//Если окна с таким файлом нет. switch_window ( window_count ); create_window; // делаю окно и загружаю в него файл Window_Attr = _wa_System; // (не будет в списке) можно не ставить... Load_File(FName);// с номером = Cur_Window; } Wtxt = Window_Id; // уже в новом окне нахожусь! Error_Level= 0; switch_window ( window_count ); create_window; Load_File(FnameTxt); if ( Error_Level != 0 ) { RM('MEERROR'); goto Fin; } str FnameDic=''; file_name = Truncate_Extension ( FnameTxt )+'.dic'; RM('MESYS^SetWindowNames'); RM ('MESYS^EXTSETUP /FTO=1'); Make_Window_Visible ( 1 ); // табл. Жми <I> - Работает табло. Надо делать, так см. - Mesys.s Return_Str = Fname; rm( 'MeSys^LdFiles /PRE=1/CW=2/DE=1'); // Не переспрашивать. И не загр.повторнр. /CW=2 -=0 - В это окно. =1 - сделать новое. ( Если не пустое то стереть.) =2-Create new window ONLY if the current window is NOT empty /PRE=1 - Передать пар. to EXTSETUP /NRL=1 - не переЗагр.уже имеющ. файл /LC=1 - В Return_Int + 1 - число загруженных файлов. /DE=1 - Use default extension if applicable. /RO=1 - Open files read-only (no modifications allowed) /FTO=x - Filetype override 0 = Use defaults for extension 1 = DOS 2 = UNIX 3 = Binary /BRL=x record length 255 = Leave line_terminator values alone /OEM=x 0 = Use Default 1 = Ansi 2 = Oem Return_Int + 1 - число всех загруженных файлов. и далее - rm('MeSys^ExtSetup / FTO=1'); // Установить, "расцветку" и др. используються те же пар-ры , см. подробнее в Mesys.s /PRE= If 1, then post-load macro will not be run,... и др. // Загрузка без меню. Return_Str = 'C:\Me\Src\'+SFile; rm('MeSys^LdFiles /PRE=1/CW=2/DE=1'); rm('MeSys^ExtSetup / FTO=1'); // Выбор из МЕНЮ файла в окно, ... str PFile = Get_Path(File_Name); rm ('LoadFile /E=1 /FN='+ PFile +"*.*"); Правильно, так: Return_Str = FExpand( Parse_Str( "/FN=", MParm_Str ) ); можно и RETURN_STR = "C:\\Me\\Text\\*.txt"; rm('MEUTIL1^File_Prompt /FTO=1 /FTC=1 /T= Выбирай файл'); if ( !Return_Int ) Goto Fin; // Отказ нажат был. Make_Message('RETURN_STR = ' + RETURN_STR); // Полное имя выбранного файла. Загрузка файла с диска или из интернета... Error_Level = 0; // iv - обнулить код ошибки см. Load_File ('C:\Me\Text\Text.txt'); // загрузить if (Error_Level) rm('MEERROR'); // и проверить на ошибку. Добавить в окно файл с диска Добавить в окно текст из файла - SPLICE - Merge(поглощать соединять) - Вставить текст из файла. см.File:"C:\Me\Src\MeUtil1.s"; Line:704; FramingInText - Вставка,добавление, в файл кусков из другого, см.File:"C:\Me\Src\MyUtils.s"; Line:424; Надо такое макро - MergeFile (Fname) и оказывается уже есть такое!!!! вот оно - см.File:"C:\Me\Src\Metools.s"; Line:26; Выбор пути файла Return_Str = Fname; rm('USERIN^QUERYBOX /T= Открыть? /P=Fname = /W=80/ML=240'); if ( !Return_Int) goto Fin; Fname = Return_Str; int FE = File_Exists( Fname ); // Могут быть варианты =0 нет: =1 файл; =2 папка. rm('MEERROR^MessageBox /B=1/T= Stop! /M= FE = '+str(FE));   --- DlgAddCtrl( Dlg, dlg_DirButton, "...", dlg_Units | 289, SPathBtnY, 4, 0, id_sr_DirBtn, 0, "/SID=" + Str( id_sr_PathStr ) ); назад...

    1.Выбор файла и загрузка его в новое окно, просмотр, редактирование. RETURN_STR = "C:\\Me\\Biblio\\*.TXT"; - откуда начинать rm('MEUTIL1^File_Prompt /FTO=1 /FTC=1 /T=Преобразовать файл');// в RETURN_STR = выбр.файл rm('MESYS^LDFILES /PRE=1/CW=2'); - делать файл в окне rm ("USERIN^VERIFY /BL=Преобразовать в HTML/T= Выполнить? /S=1"); - вопрос, выбора. if ( Return_Int ) { goto Rab01; } Goto FinM; Пример: Return_Str ='Fname'; // Загрузить файл в новое окно и переключиться на него. rm('MESYS^LDFILES /PRE=1/CW=2'); Проверка - там ли мы? Контроль загруженного файла по его расшитению. if ('TXT' != Caps( Get_Extension( File_Name))) { RM('MessageBox /B=1/M= Работать не буду... Это не текстовый файл ! '); goto Fin; }
    Проверка первых знаков файла.... Кодировка Mark_Pos; TOF; HOME; /* курсор в начало файла */ if ( '|12*' != copy( Get_Line, 1, 2 )) { // Читать два первых знака в линии. Run_Macro('MEERROR^MessageBox /B=1/T= Macro HYPNOM /M=' + ' Ошибка! Проверь этот файл ... Неверная первая линия.'); Goto_Mark; goto Fin; } // end if Goto_Mark;

    • Save the file

    Сохранение файла на диске или в интернете.

    
     Save_File; // Записать!, без всяких проверок!
     If ( File_Changed  ) {  Save_File; }
     
     rm("MEUTIL1^SAVEFILE /NP=1/NM=1/NCO=1");   // Тоже, самоее, всега запись.
     rm('MEUTIL1^SAVEFILE /NP=1');// Записать, но предупредить, что с перезаписи. Уже такой есть.
        См. Return_Int -// If 1, save was unsuccessful. Уточни, что не так.
     rm('MEUTIL1^SAVEFILE');// Запись как надо! по файловомогу менеджеру.
    
     Return_Str = FN;
     rm( "MEUTIL1^File_Prompt /H="+ 
                 "/FTO=2/NHA=1/T=Save File As.../WM=1/FTC=1"+ 
                 "/FLAGS=" ); 
     if ( !Return_Int) ret; // =1 - o'key
     FN = Return_Str;
    
    
    
     После сохранения файла, можно -
     Delete_Window; // Удалить окно,  -
     Switch_Window ( Window_Count );  // И Встать на последнее, что было перед ним.
    
    
    
          

    • Delete the file

    Del_File ('c:\Tmp\text.txt'); или по маске , надо так - Получить доступ к файлу ( для его удаления ), или это, изменить атрибуты файлов - str CmdLine = "cmd /c ATTRIB -r -a C:\\Tmp\\*.txt"; ExecProg ( CmdLine, "", "", "", _EP_Flags_ExeWin | _EP_FLAGS_MINIMIZED ); Теперь и удалить можно... str CmdLine = "cmd /c DEL c:\\Tmp\\*.txt /q"; ExecProg ( CmdLine, "", "", "", _EP_Flags_ExeWin | _EP_FLAGS_MINIMIZED ); if (error_Level) rm ('MEERROR');
    // А так можно за/пере-писать блок RM('MEUTIL1^SAVEBLCK /FN='+Flname);
    Число строк в файле eof; int NFstr = C_Line;
    
     
     
     
     Как найти на диске нужный файл?
     
    
     Пример: Если файл существует на диске, 
            то загрузить его в окно
       str Fname = 'C:\ME\INIT.SRC';
       int FE = File_Exists( Fname );
       If ( FE == 1 ) Load_File( Fname );
       If ( FE == 2 ) // это каталог;
    
    
     Записать окно в файл, см. пример в COLLAPSE.s
    
    
     Пример: Если файл в окне не LRC, то переименовать и записать.
            If ( 'LRC' != caps ( Get_Extension ( File_name )))
            {
             rm('USERIN^VERIFY /BL=/T=Это не Файл LRC, переименовать?/S=1');
             if(!Return_Int) Return();//Закончить, выйти из макро.
             File_name = Truncate_Extension(File_Name) + '.lrc';
             Save_File;
            };
    
     Пример:    Переключиться на файл:
             Switch ( caps ( Get_Extension ( File_name )))
             {
               case 'S' : Text ( 'macro' ); break;
               case 'HTML' : Text ( 'html' ); break;
             }
    
    
     Проверить файл - CHECKFILE
     READ_ONLY -TRUE (1) = Allow the file to be viewed but not modified.
     FALSE (0) = Allow normal editing.
    
    
     Проверка - файл пустой -
       Eof;
      if ( ( C_Line == 1 ) && ( C_Col == 1 ) ) {
      Return_Int = true;
      Return_Str = "Empty file";
      }
      Tof;
    Выбрать папку можно так от 20/06/14 23:33 #include Fprompt.sh str tstr = 'C:\\'; SelectDirectory( 0, tstr, "Выбрать папку", "dHelp", 0 ); make_message('Выбрана папка => '+ tstr); Список файлов из папки, сделать. #include MeTools.sh struct WIN32_FIND_DATA New_Fd; struct DOS_FIND_DATA Old_Fd; Find_Handle = FindFirstFile( "C:\\Me\\Text\\*.txt", &New_Fd, &Old_Fd ); Смотри подробнее в ListDirFiles.s и в окошке - DisplayFolder.s // Выполнить обработку списка. Если он ранее уже составлялся, // то отметить новые файлы, или изменения в старых. Вывод полного содержания CD: пути и имена файлов: str tstr ='F: /S/B/A-D'; // Return_Str = 'DIR '+ tstr +' > C:\ME\TEMP\DISK.DBF'; rm ('MEUTIL1^EXEC /CMD=1 /SCREEN=3'); Контроль загруженного в окно файла: if ('DIC' != Get_Extension( File_Name)) { RM('MessageBox /B=1/M= Это не словарь! Не Файл !!!.DIC '); Return(); // закончить } После того, как файл был загружен в окно Проверить он ли? tof; if (( Get_Extension ( File_name ) != 'HLP')|| ( Copy ( Get_Line, 1, 2 ) != '|12*')) { rm('MEERROR^MessageBox /B=1/M= Файл не HELP! /T= Ошибка!'); return(); } Выбор действий в зависимости от расширения. File_Ext = Get_Extension ( File_name ); if (( File_Ext == 'S')||( File_Ext == 'SRC')) {RM('MEHELP^MEHELP /F=MYMACRO'); GOTO Fin_E; } Открыть файл и прочитать из него N-байт int N=2, Han, Err; Str Buf; Err = S_OPEN_FILE(FlName,0,Han); If (Err) { Error_Level = 3000 + Err; GoTo Fin_E;} // показать код ошибки. // здесь надо п/п обработки ошибки --- S_READ_BYTES(Buf,Han,N); // читать в буфер 2 байта Первых? Make_Message ('Han = ' + Str(Han) +' Buf= ' + Buf); S_CLOSE_FILE(Han); Пример 8: Current_Parm = ''; forward_till_not( ' |9|255'); while (at_eol) { down; put_line_num( c_line ); goto_col(1); forward_till_not( ' |9|255'); if( at_eof ) ret; current_mac_char = cur_char; parm_pos = c_col; right; parm_line = c_line; if( xpos(current_mac_char, '{}()[];,',1)) { current_parm = current_mac_char; ret; Пример 9: // записать из памяти в файл цепочку байт...12/04/99 10:49 int N=0, fh, ErrDOS, k, AdMEM = $C0000000; // Для примера video BIOS Str tstr,// Длина по умолчанию = 254 байта TFile = Temp_Path +'memdamp.bin'; ErrDOS = S_Create_File(TFile,fh); If ( ErrDOS ) Error_Level = 3000 + ErrDOS; IF (Error_Level) goto FinEr; ErrDOS = S_Open_File(TFile,2,fh); for ( k = 0; k < 1000; ++ k ) { // AdMEM = AdMEM + (k * 16); tstr = MemStr ( AdMEM, 16 ); // tstr - длина по умолчанию = 254 байта S_Write_Bytes(tstr,fh,N); if ( N < svl (tstr)){Error_Level = 3241; goto FinEr;} //Диск полный } S_Close_File ( fh ); If ( ErrDOS ) Error_Level = 3000 + ErrDOS; FinEr: rm ('MEERROR^MEERROR'); Fin: Пример 10: Прочитать длинное имя файла ------------------------------------------- 09/03/05 14:18--*/ { str S, tstr = 'C:\ME\TXT\ГАЗЕТН~8.JPG'; S = 'DIR '+ tstr +' > C:\ME\TEMP\2DIR.TXT'; Shell_to_dos ( S, 1 ); // Выполнить // Загрузить файл в окно, прочитать строку; refresh = False; int Wid = Window_Id; Create_Window; Load_File('C:\ME\TEMP\2DIR.TXT'); Goto_Line(6); return_str = Str_Del(Get_Line,1,44); tstr = Str_Del ( Get_Line, 1, 44 ); if (tstr=='.' ) { tstr = '! <ПАПКА> Нельзя переименовать! '; } make_message ( return_str ); Delete_Window; Switch_Win_Id(WId); refresh = true; Redraw; }
    *^*

    Импортируемые ФУНКЦИИ из DLL

    regsvr32.exe - Данная команда регистрирует в реестре файлы .dll как компоненты команды.

    rundll32.exe - Запуск библиотеки DLL как приложения - Run a DLL as an App

    см. как используются
    c:\Me\MewLib32.dll доступ к нему описан в mewlib32.sh

    Вот описание на них - Imported Functions

    А Виндоуские user32.dll и kernel32.dll = « Win32 APIs » описаны в Win32.sh Ещё на shell32.dll см. в Shellapi.sh

    Описания - WinAPI.au3



    На Библиотеку PlayMp3 bass.dll описания в Bass.sh

    Например, что бы получить список всех функций, содержащихся в user32.dll.
    надо использовать depends.exe -
    ( Dependency Walker 2.2 на http://dependencywalker.com/ - скачал и установил.)
    MSDN - описание почти всех функций винды.( А мне они зачем?)

    Вот, скопировал некоторые примерчики.


    Можно почитать разное на этом сайте http://www.hackzona.ru/index.php


    *^*

    ExecProg - Запуск других программ.

    Вход / Выход из редактора Multi-Edit/ Компиляция программ.
    DOS - Управление файлами

    Всё устарело.!!!!
    На WinXP (32) см. в #include Shellapi.sh
    Делай так:
    
     str CmdLine = 'c:\ADB\test2pg.cmd';
     ShellExecute( 0, "open", CmdLine, "", "", 0 );
    
     или так:
       switch_window ( window_count ); create_window; 
       Load_File('c:\Me\CONFIG\ZPlayMp3.cmd');
       Find_Text( 'FFFMMM' , 0 , 0); 
       Replace (ShFileMp3); file_name = 'c:\Me\CONFIG\PlayMp3.cmd';
       save_file; delete_window;
       // запустить BAT-приложение
       str CmdFile = 'c:\Me\CONFIG\PlayMp3.cmd';
       ShellExecute( 0, "", CmdFile, "", "", sw_Hide );  
           //  см.File:"C:\Me\Src\Shellapi.sh"; Line:105;
           //  sw_Hide - Win32.sh
    
    
    другое, вниматольно -
    Описание см. в #include Winexec.sh

    // rm ('MeUtil1^RunBAT'); см.File:"C:\Me\Src\MeUtil1.s"; Line:2114;
    // .bat

     macro RunBAT -  см.File:"C:\Me\Src\MeUtil1.s"; Line:2083;
     ErPg = WinExecAndWait( pifn + ' ' + ini_file + ' ' + out_file + StartFile,
            working_dir, flags, path, semiphore_file);
     Пример запуска Архивирования-
     -----------------------------
          Path[ 1024 ]= C:\Me\UTILS\W32EXEC.EXE 
                        C:\Me\Temp\W32EXEC.INI 
                        C:\Me\Temp\W32EXEC.OUT 
                        C:\Me\Temp\W32EXEC.GO
     
     Working_Dir[260] = C:\ME\Utils
                 Flags= 1020
                 Title= C:\Me\Utils\Rar.exe u -pk5 c:\inet\APXIB_Me.
     
     ----------------------------       
      Flags=        
              //    $2000 - запустить  смотри там Winexec.sh
              //    $2800 - запустить компилятор
              //    $2404 - запустить и выйти.
     
      // так выдавать результат в файл.
     //      вот он -  c:\Me\Temp\StdOut.dos   см, как архивирование работает.
     
     
     // ErPg = WinExecAndWait( CmdLine+' > '+OutBAT, WPath,$12000, '','');
     
     ErPg = WinExecAndWait( CmdLine, WPath,$2000, '','');
    
     
     Пример 1. Запуск программы-"AkelPad".
    
       str File = GetShortName ('C:\Me\Text\ВсемИнфПоле.txt');
       str AkelPad = GetShortName ('C:\Program Files\totalcmd\AkelPad\AkelPad.exe');
       str CmdLine = AkelPad + ' ' + File;
       int ErPg = ExecProg ( CmdLine, "", "", "", _ep_flags_DontWait | _ep_flags_SkipExec );
     Подробнее об - "AkelPad" см.File:"C:\Me\Src\DoHelp.S"; Line:208;
     Справочник по "AkelPad"
     
    
    
     
    Пример 2. Запуск программы-"Chrome". Str CmdLine = GetShortName( 'c:\Program Files\Google\Chrome\Application\chrome.exe '), URL = Parse_Str('A=',Global_Str('GloPas')); // адрес нач.страницы. Return_Str = URL; rm('USERIN^QUERYBOX /T= Запустить ? /S=0/P= URL= /W=80/ML=240'); if ( !Return_Int) goto Fin; URL=Return_Str; CmdLine = CmdLine + URL; ExecProg( CmdLine, '', '', '', _EP_FLAGS_DONTWAIT | _EP_FLAGS_NORMAL | _EP_FLAGS_EXEAUTO | _EP_FLAGS_EXEMASK); // см. File:"C:\Me\Src\Compile.s"; Line:572; ^ExecProg

    Пример 3. Управление окнами из консоли.



    В системе по-умолчанию всегда открыты три "файла" -- stdin (клавиатура), stdout (экран) и stderr (вывод сообщений об ошибках на экран). Эти, и любые другие открытые файлы, могут быть перенапрвлены. В данном случае, термин "перенаправление" означает получить вывод из файла, команды, программы, сценария или даже отдельного блока в сценарии и передать его на вход в другой файл, команду, программу или сценарий.
    И здесь см. ещё, подробнее -
    "Set_Startup_Info" см.File:"C:\Me\Src\Winexec.s"; Line:354;


    Сделать так, надо пробовать....
    Exec(rundll32.exe shell32,ShellExec_RunDLL "%%f"`, "%%d")
    // передает активный файл для открытия по ассоциации Windows.
    читай в file:"C:/Program Files/Total Commander/Soft/AkelHelp-Rus.htm#ch3"


    С каждым открытым файлом связан дескриптор файла.
    Дескрипторы файлов stdin, stdout и stderr -- 0, 1 и 2,
    соответственно. При открытии дополнительных файлов, дескрипторы с 3 по 9 остаются незанятыми. Иногда дополнительные дескрипторы могут сослужить неплохую службу, временно сохраняя в себе ссылку на stdin, stdout или stderr. Это упрощает возврат дескрипторов в нормальное состояние после сложных манипуляций с перенаправлением и перестановками.
        Подробности: http://www.opennet.ru/docs/RUS/bash_scripting_guide/c11620.html

     
      
       str ProgRun ="""C:\\Program Files\\Total Commander\\Soft\\AkelPad.exe"""; // "-удваивать...  
       str CmdRun = ProgRun + " <FILE>.<EXT>";
       str ExWorkDir = "";
       str StdOut = "C:\\Me\\Temp\\StdOut.tmp";
       str StdErr = "C:\\Me\\Temp\\StdErr.tmp";
       int Flags =_EP_FLAGS_DONTWAIT | _EP_FLAGS_NORMAL | _EP_FLAGS_EXEAUTO | _EP_FLAGS_EXEMASK;    
       int ExProg = ExecProg( CmdRun, Working_Dir , StdOut, StdErr, Flags );
           
           или так, но будет табло ожидани 
       int ExProg = ExecProg( CmdRun,"","","",0);
       
       //   Установки для ExecProg пишутся в файле - c:\Me\Temp\W32EXEC.INI
            Можно читать выходной файл - StdOut ;
      //  Так работает нормально, и в ме. Просто запускаеться программа и все.
    
    
      macro:ExecTaskDlg
       HelpView Background Task List
     index: Background Tasks
         Проверяются:
              Di id =ExecQueryNoTasks
              Ch id =ExecTaskIsActive
    
    
      
    
      Запуск программы по расширению файла, для рисунков и прочего
      Ename = caps(Get_Extension ( PFname ));   // Help.s
      If ( Ename =='HTM' ) { 
           // Просто Запуск без табло об ожидании окончания.
           ExecProg( "hh.exe "+Return_Str, '', '', '', _EP_FLAGS_DONTWAIT | _EP_FLAGS_NORMAL | _EP_FLAGS_EXEAUTO | _EP_FLAGS_EXEMASK);
         }
       
       
       if ( not (1==File_Exists( FileMD ))) {
          // копирование и переименование файла.
          return_int = 0;  // Не понял как, но работает.
          Return_Str = 'copy c:\Me\DIC\zMemDic.htm '+FileMD;
          rm ('EXEC /CMD=1'); // см. файл  Winexec.s
          if ( return_int ){ beep; // тут уточнить
             rm ('MEERROR^MessageBox /B=1/M= Ошибка ДОС /T= '+str(return_int));}
          Set_Global_StrSet_Global_Str( '#FileMemoryDic', FileMD );
       }              
    
     Использовать - WinExecAndWait
      
      // Запустить RAR и далее по усмотрению, просмотр и т.п.И вообще, пользоваться.
            str  CmdLine = """c:\\Program Files\\WinRAR\\WinRAR.exe"" " + VFPatch;
            int ResExec = WinExecAndWait( CmdLine, "", _EP_Flags_DontWait, "", "" );
     
     tstr = GetShortName(FName);
     AddTrailingSlash( str filename ); 
     RemoveTrailingSlash( str filename );
     
     Значение переменной ДОС:
     DOStr = get_environment( 'me_path=' );
    
     Пример:
      из макро MeUtil1.s - Launch_HelperApp - Для редактирования РИСУНКОВ-
     
     appToRun = parse_str('APP=', fnddata);
     fn = GetShortName (fn);
     ExecProg(appToRun + ' ' + fn, '', '', '', _EP_FLAGS_DONTWAIT | _EP_FLAGS_NORMAL | _EP_FLAGS_EXEAUTO | _EP_FLAGS_EXEMASK);
    
    
     Пример:
         CmdLine = "C:\\Me\\Utils\\Rar.exe"
               + " u -pk5 "       // u - Обновить файлы в архиве.Установить пароль.
               + Arch + GetShortName( File );
    
       // Берётся кор.имя, а в архиве пишется длинное имя. !!! НОРМАЛЬНО.
       // А путь так - d:\Trans.rar\PROGRA~1\REFERE~1\MICROS~1\FRAMEW~1\v3.0\REDIST~1\
       ErPg = ExecProg ( CmdLine, "", "", "",_ep_flags_DontWait | _ep_flags_SkipExec );
       //  Это смотри в --  C:\Me\Src\Winexec.sh      ( окно свернуто )
       //  ErPg = ExecProg ( CmdLine, "", "", "", 0 );
      
     
      Можно проверить, и использовать -
      ErPg == 0 - ? o'key;
      ErPg == 1 - ошибка;
      ErPg == -1 - нормально все?;
     
     

    Пример: str AkelPad = GetShortName ('C:\Program Files\totalcmd\AkelPad\AkelPad.exe'); str CmdLine = AkelPad + ' ' + GetShortName ( RETURN_STR ); int ErPg = ExecProg ( CmdLine, "", "", "", 0 ); IF (ErPg>0) rm('MEERROR^MEERROR'); IF (Error_Level) rm('MEERROR^MEERROR'); Перекодировку можно из ком.строки запускать.
    Пример 1.1: Получить описание DOS-команд в файл ( как пример COPY ) str FNameTMP = "C:\\Me\\Temp_Me\\info.txt"; // в этом файле будет описание. str TTcmd = "copy /?"; str CmdLine = "cmd /c " + TTcmd + " > " + FNameTMP; int ErPg = ExecProg ( CmdLine, "", "", "",_EP_Flags_ExeWin | _EP_FLAGS_MINIMIZED ); Пример 1.2: Показать HELP-справку. str HtmlHlp = "C:\\Me\\Help\\HlpHtml.htm"; // имя хелп файла - 24/03/13 16:42 str CmdLine = "hh.exe "+ HtmlHlp; int ErPg = ExecProg ( CmdLine, "", "", "", 0 ); //ErPg = ExecProg ( CmdLine, "", "", "", _ep_flags_DontWait | _ep_flags_SkipExec ); Пример 3:- Получить в окне содержание папки. str FNameTMP = "C:\\Me\\Temp\\dirtxt.hlm"; str RRDir = "dir H:\\Film_KINO\\"; str CmdLine = "cmd /c " + RRDir + " > " + FNameTMP; int ErPg = ExecProg ( CmdLine, "", "", "",_EP_Flags_ExeWin | _EP_FLAGS_MINIMIZED ); Пример 4: // Чтение информации с дискеты в BUFER0.TXT S = ' Прочитать каталог дискеты ( A:\ > ) '; rm('USERIN^VERIFY /BL=/S=/T='+S+'/H=ME^*'); if(not(Return_Int)) Goto Fin_E; rm('MEERROR^MessageBox /B=1/M= Вставь дискету /T='); S = 'DIR A: > C:\ME\BUFER0.TXT'; Shell_to_dos( S, 1); // Выполнить API - // int HWnd = FindWindow ( Asciiz ClassName, Asciiz WindowName ); int HWnd = FindWindow ( 'Winamp v1.x','K-MultimediaPlayer'); // Handle: 0x0012034A = 1180490 rm('MEERROR^MessageBox /B=1/T= Stop! /M= HWnd='+str(HWnd)); str Tstr[260]; // номер окна, где запустилась программа ? // Wplay = GetActiveWindow( ); GetWindowText( HWnd, Tstr, 260 ); // заголовок // rm('MEERROR^MessageBox /B=1/T= Stop! /M= Wplay =' + str( Wplay )+' |13'+ ' Tstr = ' + tstr); rm('MEERROR^MessageBox /B=1/T= Stop! /M= tstr='+tstr); // 0x004E03B8 GetWindowText( 0x004E03B8, Tstr, 260 ); // заголовок окна 'K-MultimediaPlayer' // rm('MEERROR^MessageBox /B=1/T= Stop! /M= Wplay =' + str( Wplay )+' |13'+ ' Tstr = ' + tstr); rm('MEERROR^MessageBox /B=1/T= Stop! /M= tstr='+tstr); // GetClassName( HWnd Wnd, *Asciiz ClassName, int MaxCount ); GetClassName( 0x004E03B8, Tstr, 260 ); // класс окна = 'Winamp v1.x' rm('MEERROR^MessageBox /B=1/T= Stop! /M= tstr='+tstr); // text ( tstr);

    Запуск других программ.


    Вход / Выход из редактора Multi-Edit/ Компиляция программ.
    ExecProg



    Как использовать ???
    ДОС команды. Примеры из макро...
    Importing functions from a DLL

       Удобно так запускать...
    
       #include WinExec.sh // WinExec.s
       CmdLine = GetShortName( 'c:\Program Files\totalcmd\Soft\PhotoFiltre\PhotoFiltre.exe');
       ErPg = ExecProg ( CmdLine, "", "", "", _ep_flags_DontWait | _ep_flags_SkipExec );
                                              Просто работает.
       Встречаються и такие варианты:
       T_Int = ExecProg ( TStr, "", "", "", _EP_Flags_DontWait);
       
       Вот так запускать без всяких условий:
       CmdLine = CmdLine + HLPFile;
       ExecProg( CmdLine, '', '', '', _EP_FLAGS_DONTWAIT | _EP_FLAGS_NORMAL | _EP_FLAGS_EXEAUTO | _EP_FLAGS_EXEMASK);
      
    
       int ExecProg(
                        str Prog[ 1024 ]       = Parse_Str( "/PROG=", MParm_Str ),
                        str Working_Dir[ 260 ] = Parse_Str( "/WD=", MParm_Str ),   - рабочая папка
                        str Stdout_File[ 260 ] = Parse_Str( "/RED=", MParm_Str ),  - выходной файл
                        str Stderr_File[ 260 ] = Parse_Str( "/REDERR=", MParm_Str ),  - файл ошибок?
                        int Flags              = Parse_Int( "/FLAGS=", MParm_Str )
                   ) trans2
    
       Error_Level = ExecProg( CmdLine, vcsPrjDir, vcsName, vcsName, Flags );
    
    
          _EP_FLAGS_COMSPEC   0x00000001  // Run using command processor
          _EP_FLAGS_NoFrGnd   0x00000002  // Do not set Multi-Edit as the foreground window
          _EP_FLAGS_DONTWAIT  0x00000004  // Do not wait for program to complete
          _EP_FLAGS_APPEND    0x00000008  // Append to end of redirection file
          _EP_FLAGS_NOBYPASS  0x00000010  // Do not display Bypass dialog
          _EP_FLAGS_WDPROG    0x00000020  // Use program directory as working dir
          _EP_FLAGS_BNDASDOS  0x00000040  // Run bound program as Dos program
          _EP_FLAGS_VMEXEC    0x00000080  // Unsupported
          _EP_FLAGS_NOEXEC    0x00000100  // Internal use only
          _EP_Flags_RunBkg    0x00000200  // Run program in the background
          _EP_Flags_SkipExec  0x00000400  // Do not run DOSEXEC for Dos programs
          _EP_Flags_NoSavFile 0x00000800  // Do not do an auto file save
    
          _EP_Flags_ExeAuto   0x00000000  // Autodetect program exe type
          _EP_Flags_ExeDos    0x00001000  // Run as a Dos program
          _EP_Flags_ExeWin    0x00002000  // Run as a Windows program
          _EP_Flags_ExeOs2    0x00003000  // Run as an Os/2 program
          _EP_Flags_ExeW32C   0x00004000  // Run as a Win32 console program
          _EP_Flags_ExeMac    0x00005000  // Run as a macro
          _EP_Flags_ExeTelnet 0x00006000  // Run as a Telnet Session
          _EP_Flags_ExeMask   0x00007000  // Mask for the Exe types flags
    
          _EP_FLAGS_AutoRun   0x00008000  // Auto run BkgTaskMac on RunBkg done
    
          _EP_FLAGS_NORMAL    0x00000000  // Show window in normal state
          _EP_FLAGS_HIDE      0x00010000  // Hide window
          _EP_FLAGS_MINIMIZED 0x00020000  // Show window in minimized state
          _EP_FLAGS_MAXIMIZED 0x00030000  // Show window in maximized state
          _EP_FLAGS_SHOWMASK  0x00030000  // Mask for the show flags
    
    ExecProg
    *^*
    System - Windows - CPU - MEM - int___ / Register - Машинный уровень
     Machine Level interface operations
     

    Достут к записям реестра

    Тут - Про работа с Системным Реестром надо.
    Пример, см макро: "RegOpenKeyEx" см.File:"C:\Me\Src\Mail.s"; Line:150;


    Удаление, испавление ошибок в реестре, по списку
    C:\Program Files\Reg Organizer\TextFile(ошибки найденые).txt
    - программа дорогая, но список выдает...



    // адрес начала строки в памяти --- Make_Message(' &= '+STR(&tstr)); PortOut(адрес_порта); // прочитать Пока не нашёл как это делается в ДОСе 16/05/00 16:51 - Ншёл! См примеры в macro_file MECOM; macro COM_PORT_STATUS /* Baud Rate */ R_BX = 1; Call RETOPTION; ......... ......... RETOPTION: R_AX = ax; Intr($66); t_int = R_BX >> 8; RET; Machine Level Functions Примеры EMS_Stat = EMS_Stat & $FD; //Выключить свопинг расширенной памяти
    *^*

    ERROR

    Часто эта ошибка 20
     DLGGETINT PC=20
     Invalid MENU handle

    Воэможно это 1020 ?

    Unable to create temporary file. Usually caused by having the Temporary File Path assigned to an invalid path. Change the path to a valid one via the Backups/Directories menu selection (On the Install Menu).
    Все просто!

     Это .. DlgKill(TAdlg);было раньше  чем
      .... DlgGetInt( TAdlg, 1024 ) )...



    Ошибка 42- см. вых. файл компилятора - c:\Me\Temp\MeErr.tmp
    Multi-Edit for Windows CMACW Macro Language Compiler V9.0e
    Global_Str( 'DIC.shh(1399, 2): ERROR 42: Comment not closed
    
    А так он выглядит в AkelPad

    Знаки не отображаются в Ме? Что то не то...
    и при копировании, это становится так:
    Multi-Edit for Windows CMACW Macro Language Compiler V9.0e
    Global_Str( 'DIC.s
    Где она?.
    Делаю так, выхожу из Ме, переименовываю файл,
    беру исправный из архива - и сравниваю их.
    и правильно со строки 1399 - строчка, как незакрытый комент -
    хотя вызлядит как закрытый потому что между /* */ находится
                                      'D:\\English\\MemDic.dic
    вОТ, ЭТА строчка, потратил пол-утра, чтоб найти её...
    Но про многое узнал попутно, тоже польза большая..






    Пример
      int ErPg = ExecProg ( CmdLine, "", "", "", 0 );
      IF (ErPg>0) rm('MEERROR^MEERROR');
      IF (Error_Level) rm('MEERROR^MEERROR');
    
    Error_Level = 0 ;// целая переменная = код ошибки
    Целое значение, содержащее признак (код) от последней произошедшей ошибки.
    Получение кода Error_Level (ME) из кода стандартной ошибки DOS
    ErrDOS = S_OPEN_FILE (FlName, 0, Han); // получение номера ошибки ДОС
    If (Err) { Error_Level = 3000 + ErrDOS; GoTo FinEr;}
    1001 - 1031 - ошибки ME
    2002 - ошибки Принтера
    3002 - 3241 - DOS ( две последние - те же что и для DOS)
    
    5001 - 5005 - ME
             5001 - нет макро? как понять, если откомпилировано.
    6001 - 6999 - 
    7000 - 7999 -
    8000 - 8999 -
    9001 - 9999 - Ошибки в моих макро
                   Проверка правельности ввода даты  - Error_Level из Correct_Day ( str TDay )
           9051- Неправильный год
           9052- Неправильный месяц
           9053- Неправильное число дня. 
    
    
    
    Пример
    IF (Error_Level) Beep; //Если произошла ошибка, то издать "би-ип"
    
    Пример
    IF (Error_Level) rm('MEERROR^MEERROR');
    Макро MEERROR - дешифрирует этот код в текстовое сообщение.
    Усовершенствования - возможность исправлят/дополнять список ошибок.
    Макро MessageBox - Позволяет сообщать об этом.
    
    
    
    *^*
    Коды, относящиеся к дисковым операциям:
    
    1 Неверный номер функции
    2 Файл не найден
    3 Путь не найден
    4 Уже открыто максимально допустимое число файлов
    5 Отрицание доступа (ошибка оборудования)
    6 Неверный номер файла
    15 Указан неверный накопитель
    16 Попытка удалить текущий каталог
    17 Не то же устройство
    18 Больше нет файлов (при поиске в каталоге с использованием джокеров)
    
    
    
    *^*

    Время. Календарь. Timer "би-ип" Delay, Индикаторы...

      Timer Event Function List
      Beep ...Miscellaneous Functions
    
     date  -->  01.08.2014    - так выдаёт драйвер. 
     число -  copy ( date, 1, 2 );
     месяц -  copy ( date, 3, 2 );
     int YN - // Цифра года  - 
     Val( YN, copy ( date, 7, 4 )); // для будущего, сегодня год.
    
     time --> ='13:32:21' утром ='7:00:07'  
       str Tim = time; If ( XPos( ':', Tim, 1 )==2 ) {Tim = Copy ( '0'+ Tim, 1, 5 );}             
     часы и минуты 
      надо так - st[10] = STR_DEL(TIME,6,3); //timefix begin
     // Устанавливаю время, в числах, для вычисления - 
     str NowTime = copy ( TIME, 1, 5 ); // - 8:18:
     if(XPos(':',NowTime, 1)==2){NowTime=copy('0'+ NowTime,1,5);}
     int HH,MM;
     Val(HH, copy ( NowTime, 1, 2 ) );  // Час = 18; // (0 - 23)
     Val( MM, copy ( NowTime, 4, 5 ) ); // TMinute = 8; // (0 - 59)
    
     IF (Date == '31.12.99') Beep;// Пора заканчивать столетие!
     Make_Message('Доброе утро, Мистер Фелпс!');
     str DT = DATE +' '+ copy(TIME,1,5); // Число месяца, дата и время.
    
     MYPROTO.S - Мои Для работы с календарными датами в файле;
     #include MyProto.sh
     Segodnja = Today_Now;          // Выдаёт строку вида "ггггммдд".
    
     rm('MyDT /M=0'); // =0 - без меню.  =1 - меню;
        там - tstr = Str_DT ( 0 );   // = 0....5   - строка, разного вида.
          - Выдача строки такого вида.
                0    - 20/07/08 15:14
                1    -  Воскресенье. 20 июля 2008 года; 15 часов 14 минут.
                2    - 0807201515
                3    - 20080720
                4    - 15:15
                5    - 1701
     
     Так Получить только день и число -
     str DenChislo = copy ( Str_DT ( 1 ),1, (XPos(';',Str_DT(1), 1))-1)+'.';
     
     str Segodnya - Today_Now; // = '20140805' 
     str SegodnyaText = To_Write_Day(Segodnya); // Вторник. 5 августа 2014 года;
       или написать 
     str DMYText = To_Write_Day('20140805'); 
    
      перевод числа милисекунд в строку вида '00:00:00,000';-
          
          "tttime" см.File:"C:\Me\Src\TestMac.s"; Line:70;
    
    

    Системный таймер

    System_Timer - RETURNS: The current system time (in 55 thousandths of a second).

    Кроме часов реального времени, любой компьютер (даже простейший IBM PC) содержит устройство, называемое системным таймером. Это устройство подключено к линии запроса на прерывание IRQ0 и вырабатывает прерывание INT 8h приблизительно 18,2 раза в секунду
    (точное значение - 1193180/65536 раз в секунду).

    При инициализации BIOS устанавливает свой обработчик для прерывания таймера. Этот обработчик каждый раз увеличивает на 1 текущее значение четырехбайтовой переменной, располагающейся в области данных BIOS по адресу-
    0000:046Ch - счетчик тиков таймера. Что такое тик? (24*60*60 = 86400)/(256*256 = 65536) = 1.318359375
    Если этот счетчик переполняется (прошло более 24 часов с момента запуска таймера), в ячейку 0000:0470h заносится 1.

    Таймер Windows является глобальным ресурсом, он тикает с одинаковой частотой для всей системы целиком. Получается, что если какая-то программа увеличивает частоту таймера, то это сказывается на поведении всей системы.
    http://habrahabr.ru/company/intel/blog/186998/


     Системный 
    таймер использовать так:-
     int WTime = System_Timer + 18; // 1 тик = (1/18) секунды
     do { // 1 сек = 1000*18 тиков
            ...
            здесь что-то делать в течении одной секунды
            ...
     } while( System_Timer < WTime );
    
     Секундомер.
     Int ВремяНачала = System_Timer;
        ...
        тут процесс...
        ...
      // сколько секунд прошдо - за это время -
     Str ВремяКонца = str((System_Timer - ВремяНачала) mod 18);
     str MB1str = " System_Timer = " +str(System_Timer)+"\n" +
                 " Time =" +time+"\n"+
                 " Last_Keypress_Time =" + str(Last_Keypress_Time) +"\n"+
                 " Last_Event_Time =" + Str(Last_Event_Time) +
                 "\n";
     
      // устанавливается в 0 таймер,
      
     int tSystem_Timer = System_Timer;
     FW:
       // выход из цикла по таймеру ---
       if (( System_Timer - tSystem_Timer )> (18*3) )  {  // больше 3-х сек.
            rm('MEERROR^MessageBox /B=1/T= Stop! System_Timer /M= Нет запуска программы.');
            goto Fin_HHpusk; }
       int HWnd = FindWindow ('HH Parent','HTML Help');
     if ( !HWnd ) { goto FW; }
      
      
      // Установка, сброс в 0 - после запуска проигрывателя.
      Set_Global_Int( 'SystemTimer0', System_Timer);
          real ST;
          int iST;
      RR: 
          ST = Real_I (System_Timer - Global_Int( 'SystemTimer0'));   
          // ST = 1 мин = 1120 =   60000 / 1120 = 53.5714285714
          // Это по теории , опытным путем установил =  ST = ST * 54.684;
          //  50 min = 2981918 - 50*60000 = 3000000
          //  60 min = 3578115 == 3600000
          ST = ST * 54.687;
          iST = Int_R (ST);
          rm('USERIN^VERIFY /BL=/T= ST ='+str(iST));
          if(!Return_Int) Goto Fin;
          goto RR;           
     
     
     
     MessageBox( 0,MB1str, " Stop ", 0);
     Пример использования будильника см. в c:\Me\Src\ACD.s - SETALARM
     IF (Time == '07:35:00am') Beep;//Действие подобное будильнику
     
     
     
     

    КЛАВИШИ, ЗВУКИ и ВРЕМЯ

    запуск программы работы со звуком. см.File:"C:\Me\Src\MeUtil1.s"; Line:923; #include MewLib32.sh // mewlib32.s - GetCtrlUpTime // Return the time when the Ctrl key was last pressed/released.
    //=== Звук === MessageBeep(0x00F4240); // - Разные звуки - Нет описания, два нашел. SB - описание на звуковую карту - Управление громкостью - Включить проигрывание в фоне звука.- Многократное повторение - Так я дописал к началу каждого файла заголовок, и можно стало их слушать. copy /b HeadWAV.wav+FILM070.DAT FILM070.wav Beep - звучит. Но только один раз. Коротко. не зависит от повторений. Надо запускать файл - макро для звука - указать зв. файл. write ('System_Timer = ' + str(System_Timer),3,3,0,7); Delay(1000*18);// Звучать 1 секунду write ('System_Timer = ' + str(System_Timer),3,3,0,7); Sound(0); // Выкл // Запускать макро через определённый интервал времени. int eh = Set_Timer_Event ( macro_cmd, time_interval, mode ); // macro_cmd = 'ALARM' // time_interval = 18 * 30 = 1 сек. // mode = ($FF=all). EDIT Затем, eh надо передать в другое макро. Т.к. Нельзя отключить самого себя макро! Только из другого! en = GLobal_Int('eh'); Kill_Timer_Event (eh); // убрать событие eh -> event_handle, // что было установлено ранее. Пример: if (GLobal_Int('MyTimer')) { Kill_Timer_Event(GLobal_Int('MyTimer')); Set_GLobal_Int('MyTimer',0); } Last_Event_Time; // время прошедшее после последнего событи Last_Keypress_Time; // время прошедшее как нажали кнопку Last_Update_Time; // время прошедшее как, текущее окно в последний раз // обновлялось Пример: // Показать сколько строк из файла обработано Eof; N_Lin_Max = C_Line; Tof; Do { . . . . . Down; N_Lin++; N = N_Lin*40/N_Lin_Max; // сколько процентов сделано if(N == 0 )Write( '',1,1,7,0); Write( '',1+N,N,7,0); } While (not(At_EOF));
    *^*

    Key1 Key2 - Клавиатура

    Key Assignments Using CMAC
    Cmd_To_Key ( key_code, cmd_constant, mode )

    WCMD Operations/What are WCMD's
    Keystroke Macro Functions


    tstr = Make_Key_Name( Make_Word( parse_int("/K1=",key_str), parse_int("/K2=",key_str)));

    Узнать код нажатия клавиш:
      RRR: 
      if ( Check_Key ) { 
           text ( 'Нажато <' + Make_Key_Name ( Make_Word ( key1, key2))+ '>  Key1=' + str( Key1) + '    Key2=' + str( Key2) ); cr;      
      }
      if (( Key1 == 27 ) & ( Key2 == 1 )) goto Fin;
      goto RRR;
      



    Подробно смотри:
    Управление клавиатурой и дисплеем.
    
    Word_Left; == Pass_Key(0,115);// <CtrlLF>  Встать на начало слова
    
    #include MewLib32.sh  // mewlib32.s - 
    
    GetCtrlUpTime // Return the time when the Ctrl key was last pressed/released.
    GetAltUpTime  // Return the time when the Alt key was last pressed/released
    
    Список в файле - Keys.sh
    
    Примеры---
    tstr = Make_Key_Name( Make_Word( parse_int("/K1=",key_str), parse_int("/K2=",key_str)));
    tstr = make_key_name( make_word( key1, key2 ) );
    
    
    if ( Check_Key ) { // комп греется, занят постоянно проц. IF (( Key1 == 27 ) && ( Key2 == 1 )) // Клавиша «Esc» {Switch_Win_Id( Wnew ); // Переключиться на новое окно New_Screen; GoTo Fin;} }
    // Получить символ с клавиатуры: ZK = Char ( Key1 ); // Проверить, не нажат ли <Esc>? if ( Key1 != 27 ) goto L1; if ( Check_Key && (( Key1 == 27 ) && ( Key2 == 1 ))) goto Fin_E; // Действия по клавишам пока не будет нажат <Esc> while ( ( Key1 != 27 ) && ( Key2 != 1 ) ) { read_key; IF (( Key2 == 162 )||( Key2 == 251 )) rm ( 'MEHELP^ScreenMrk' ); ........ и другие ............ }; Присвоить клавише, проверячя не занята ли она jx = Inq_Key ( Key1, Key2, DOS_SHELL, tstr); // возврат - jx =0 свободна // проверено if ( ( jx == 1 ) | ( jx == 2 ) ) { // и если строка tstr - // 1 = Macro assignment // 2 = Keystroke macro assignment // Запустить как будто бы нажали Pass_Key( key1, key2 ); // Ждать и Считать код клавиши Read_Key; // Процессор грееться !!! IF (Key1 == 0) Push_Key( Key1, Key2 ); // Если key1 = 0, то нажата была расширенная клавиша IF ((Key1 == 0) && (Key2 = 59)) Make_Message('Вы нажали F1!'); Приостановка, на врема того, что нажата клавиша. int shift_stat = peek ( 0, 0x417 ) , // Область данных клавиатуры // первый байт состояния. while ( shift_stat == peek ( 0, 0x417 )) { if ( check_key ) { shift_stat = -1; push_key(key1, key2); } }

    ПРИСВОЕНИЯ КЛАВИШАМ

    запускать макро //Присвоить команду WORD_RIGHT клавише Control+Стрелка Вправо в режиме edit CMD_TO_KEY( <CtrlRT>, WORD_RIGHT, Edit); macro set_perenos;// пример для назначения клавиши { int(ls); LS = Parse_Int('/LS=',MParm_Str); Set_Global_Int('linesize',LS); Macro_to_Key(<ctrl\>,'perenos',edit); } ОПЕРАЦИИ С МЕТКАМИ ФУНКЦИОНАЛЬНЫХ КЛАВИШ МАКРО НАЖАТИЯ КЛАВИШ KEY_IN(Это тестовая строка<ENTER>); СИНТАКСИС РАСШИРЕННОЙ КЛАВИАТУРЫ КОМАНДЫ, КОТОРЫЕ ПРИСВОЕНЫ КЛАВИШАМ в этом экране.
    *^*
    Принтер
    Пока не подключал.
    
    
    
    
    
    
    *^*
    Сканер
    Пока не подключал.
    
    
    
    
    
    
    *^*
    Мышка
      Imported Functions  - Первоисточник 
    
    
    
    *^*

    FTP / InterNet / Wi-Fi / Модем. / Коммуникационный модуль.

    Memo


    Макро чтай там - ftp.s




    Учебники:


    Устройство Интернета

    HlpPHP.htm


    *^*
    ЗАМЕЧАНИЯ по РУКОВОДСТВО ПО МАКРО ЯЗЫКУ Мои ЗАМЕЧАНИЯ по РУКОВОДСТВО ПО МАКРО ЯЗЫКУ
    
    А Этот текст я взял из MEv4, сократил, и добавил кое-что
    и он в основном работает и в MEv6.
    Работу начал выполнять в
    
    Понедельник, 17 июня 1996 года; 15 часов 00 минут.
    Вчера, в России проходили выборы президента.
    
    А вот сегодня решил добавить и сократить
    Среда. 15 октября 1997 года; 21 часов 55 минут.
    
    Продолжаю и сегодня.
    Суббота. 25 октября 1997 года; 22 часов 10 минут.
    
    Продолжаю и сегодня.
    Воскресенье. 9 ноября 1997 года; 16 часов 14 минут.
    
    Вторник. 25 ноября 1997 года; 19 часов 06 минут.
    Постепенно дописываю то что узнаю - и исправляю почти каждый день.
    
    - 10/01/98 08:48
    После Нового 98 года переписал седьмую версию с примерами теперь
    будет легче разбираться. Начал оформлять справочник по новому -
    удалить то что уже знаю и пересортировать.
    
    Воскресенье. 19 апреля 1998 года; 20 часов 42 минут.
    А сегодня пасха.
    
    Вторник. 5 мая 1998 года; 13 часов 05 минут.
    "Как написать макро для Multi-Edit V7.00P ( от 05/05/98 )
    Поставил в работу.
    
    Вторник. 12 января 1999 года; 17 часов 11 минут.
    Делаю новые улучшения. Работаю уже на Celerone 300
    
    Среда. 17 февраля 1999 года; 18 часов 14 минут.
    Новое в оформлении главного меню выбора
    
    Вторник. 6 июня 2000 года; 10 часов 18 минут.
    Кое - какие новые идеи появились.
    До сих пор в этом файле небыло индекстой страницы!
    Сортировка страниц и индексов.
    Сегодня жара - +31. Вчера Клинтон был в Киеве проездом из Москвы.
    
    
     Воскресенье. 17 августа 2014 года; 20 часов 28 минут.
     Давно не редактировал этот файл по-крупному. 
    А все только мелкие дополнения. На украине гражданская война - Донбас пыоает. У нас жара +36
    *^*
    INDEX
    Copyright ©kvm- 1996-2018 гг.