Компьютер сделает всё, что вы ему скажете,
но это может сильно отличаться от того,
что вы имели в виду.
1. Используй! Быстрые клав. - (Alt+F9) и посмотреть Menu\Tools\Command Editing
!!! При старте работают только те макро, что перекомпилированы в БИБЛИОТЕКУ 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
Каждое макро должно состоять из - [#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;}
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:
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:
*^*Жми 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; // получить абсолютное значение
#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: }
Переменная ДОС 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 */
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, ;
Вставлять для тестирования - из 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; }*^*
Отнова, для всех языков, файл - 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 к своему макро? - вопрос и до 23/07/13 18:05 нерешён. 04/05/11 17:32 - исправил в макро HELP.s - см. там. Есть макро - DoHelp.s - читай, там написано.*^*
*^*
Много спец. макро есть - См.примеры: 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', ''); Глоб. ПЕРЕМЕННЫЕ
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 );*^*
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));
// см в Fonts.sh - там новый дописал. rm ('SetupFont /ID=DLG/PN=&TesttFont'); str tstr = Parse_Str("/NAMEDLG=", TesttFont); text ('"'+tstr+'"');*^*
The Fonts - Шрифты - дополнительный файл. Можно посмотреть.
Надо делать...кириллица и другое Пример: ᡈ(ᡈ) -Два байта.
ПЕРЕКОДИРОВКА Мои функции см.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( )); }Подробнее
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;
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));
Примеры из файлов - 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; }
Каждое окно определяются индивидуальными параметрами Основа - 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; // делаю окно и загружаю в него файл
#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
========================================================================= #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);*^*
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 - Редактирование заметки, запись в любой файл. и другие -
*^*
#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, "" ); //
// Показать окно со значениями = 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 шаг изменения частоты + вверх; -вниз
Примеры макро (для тестирования). 1. Сначала нужно подготовить глобальные переменные: Поле ввода для (1-й) строки: SET_GLOBAL_STR('префиксISTR_1','нач_знач'); Поле ввода для целого числа: SET_GLOBAL_INT('префиксIINT_1','нач_знач'); 2. Теперь готовим параметы для поля ввода: Set_Global_Str('префиксIPARM_1','/T=text'+ 'др.(см.ниже)' ) /T= подсказка поля, рамки, приглашение, и др...
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>"*^*
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);*^*
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; } }*^*
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;
#include Fprompt.sh str tstr = 'C:\\'; SelectDirectory( 0, tstr, "Выбрать папку", "dHelp", 0 ); make_message('Выбрана папка => '+ tstr);
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_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; }
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другое, вниматольно -
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
В системе по-умолчанию всегда открыты три "файла" -- stdin (клавиатура),
stdout (экран) и stderr (вывод сообщений об ошибках на экран). Эти, и любые
другие открытые файлы, могут быть перенапрвлены. В данном случае, термин
"перенаправление" означает получить вывод из файла, команды, программы,
сценария или даже отдельного блока в сценарии
и передать его на вход в другой файл, команду, программу или сценарий.
|
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 flagsExecProg
*^*
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
Часто эта ошибка 20DLGGETINT 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 ) )...
Multi-Edit for Windows CMACW Macro Language Compiler V9.0e Global_Str( 'DIC.s hh (1399, 2): ERROR 42: Comment not closedА так он выглядит в AkelPad
Multi-Edit for Windows CMACW Macro Language Compiler V9.0e Global_Str( 'DIC.sГде она?.
'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 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;
Кроме часов реального времени, любой компьютер (даже простейший 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));
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 - Первоисточник*^*
А Этот текст я взял из 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