Привет,
BVV63.
Ещё кое-что по мотивам...
Цитата: До этого не пользовался ими. Кроме одного, который я создал через "Record" (снимал/устанавливал аттрибут "Read-Only")
Меня заинтересовало...
Ок. Предлагаю взглянуть на сравнительно простой макрос
fAttrs.s [more]
Код: macro_file fAttrs;
// управление атрибутами файла в текущем окне
// без параметров выводит диалог
// с параметрами молча делает заказанное
// есть подсказка
// 2015.09.24, nvv, finished
// 2015.09.08, nvv, started
#include Dialog.sh // header file that contains the def for DlgExecute
#include StdDlgs.sh
#define nMacroName "fAttrs"
#define nCheckRob_Ctrl 1001
#define nCheckHid_Ctrl 1002
#define nCheckSys_Ctrl 1003
#define nCheckArc_Ctrl 1004
#define nBtn_Ok_Ctrl 1061 // кнопка "старт" (пуск)
#define nBtn_About_Ctrl 1062 // микро подсказка "о макросе"
void fAttrs {
int fAtr = Cur_File_Attr; // Attributes:
int nAtr = fAtr;
int fRon = fAtr & 0x01; // 0x01 ReadOnly
int fHid = fAtr & 0x02; // 0x02 Hidden
int fSys = fAtr & 0x04; // 0x04 System
int fArc = fAtr & 0x20; // 0x20 Archive
int fDir = fAtr & 0x10; // 0x10 Directory
int fVol = fAtr & 0x08; // 0x08 Volume ID
int sDlg;
str Parm = caps( mparm_str );
char nSet;
if ( fVol ) {
MsgDlg("!Note - it's a VOLUME\\n"
+ "NO attributes to change with."
, nMacroName + ': Note!', "", 1 );
return();
}
if ( fDir ) {
if ( id_std_Yes != VerifyDlg
( "? It's a DIRECTORY\\n"
+ "Do you want to change its attributes?"
, nMacroName + ': CONFIRM', '', id_std_Yes, 0 ) ) {
return();
}
}
if ( svl( Parm ) ) { // заказаны явные дейстия, отработаем...
int nRon = xpos( "R", Parm, 1 ); // 0x01 Read Only
int nHid = xpos( "H", Parm, 1 ); // 0x02 Hidden
int nSys = xpos( "S", Parm, 1 ); // 0x04 System file
int nArc = xpos( "A", Parm, 1 ); // 0x20 Archive
// int fRon = fAtr & 0x01; // 0x01 Read Only
if ( nRon ) {
if ( str_char( Parm, nRon + 1 ) == "+" ) {
nAtr |= 0x01; // установим этот атрибут
Parm = str_ins( " ", str_del( Parm, nRon + 1, 1 ), nRon + 1 );
} else if ( str_char( Parm, nRon + 1 ) == "-" ) {
nAtr &= ( 0xFF ^ 0x01 ); // скинем этот атрибут
Parm = str_ins( " ", str_del( Parm, nRon + 1, 1 ), nRon + 1 );
} else {
nAtr ^= 0x01; // обратим этот атрибут
}
Parm = str_ins( " ", str_del( Parm, nRon, 1 ), nRon ); // уберём из строки параметров учтённое
}
// int fHid = fAtr & 0x02; // 0x02 Hidden
if ( nHid ) {
if ( str_char( Parm, nHid + 1 ) == "+" ) {
nAtr |= 0x02;
Parm = str_ins( " ", str_del( Parm, nHid + 1, 1 ), nHid + 1 );
} else if ( str_char( Parm, nHid + 1 ) == "-" ) {
nAtr &= ( 0xFF ^ 0x02 );
Parm = str_ins( " ", str_del( Parm, nHid + 1, 1 ), nHid + 1 );
} else {
nAtr ^= 0x02;
}
Parm = str_ins( " ", str_del( Parm, nHid, 1 ), nHid );
}
// int fSys = fAtr & 0x04; // 0x04 System file
if ( nSys ) {
if ( str_char( Parm, nSys + 1 ) == "+" ) {
nAtr |= 0x04;
Parm = str_ins( " ", str_del( Parm, nSys + 1, 1 ), nSys + 1 );
} else if ( str_char( Parm, nSys + 1 ) == "-" ) {
nAtr &= ( 0xFF ^ 0x04 );
Parm = str_ins( " ", str_del( Parm, nSys + 1, 1 ), nSys + 1 );
} else {
nAtr ^= 0x04;
}
Parm = str_ins( " ", str_del( Parm, nSys, 1 ), nSys );
}
// int fArc = fAtr & 0x20; // 0x20 Archive
if ( nArc ) {
if ( str_char( Parm, nArc + 1 ) == "+" ) {
nAtr |= 0x20;
Parm = str_ins( " ", str_del( Parm, nArc + 1, 1 ), nArc + 1 );
} else if ( str_char( Parm, nArc + 1 ) == "-" ) {
nAtr &= ( 0xFF ^ 0x20 );
Parm = str_ins( " ", str_del( Parm, nArc + 1, 1 ), nArc + 1 );
} else {
nAtr ^= 0x20;
}
Parm = str_ins( " ", str_del( Parm, nArc, 1 ), nArc );
}
if ( remove_space( Parm ) == "" ) {
Cur_File_Attr = nAtr; // сожмём то, что осталось. Пусто - Ок
} else { // НЕ пусто - товарищь НЕ понимает...
RM( "fAttrs_About" ); // ! в параметрах вызова есть лишнее-с
}
} else {
DlgCreate( sDlg );
DlgAddCtrl( sDlg, Dlg_Checkbox, "Read Only ", 1, 1, 30, 1, nCheckRob_Ctrl, 0, "" );
DlgAddCtrl( sDlg, Dlg_Checkbox, "Hidden ", 1, 2, 30, 1, nCheckHid_Ctrl, 0, "" );
DlgAddCtrl( sDlg, Dlg_Checkbox, "System file", 1, 3, 30, 1, nCheckSys_Ctrl, 0, "" );
DlgAddCtrl( sDlg, Dlg_Checkbox, "Archive ", 1, 4, 30, 1, nCheckArc_Ctrl, 0, "" );
DlgAddCtrl( sDlg, Dlg_PushButton, "OK", 5, 5, 9, 1, nBtn_Ok_Ctrl, dlgf_DefButton, "" );
DlgAddCtrl( sDlg, Dlg_PushButton, "&?", Dlg_PosOffset + 12, Dlg_PosOffset, 9, dlg_Units | 11
, nBtn_About_Ctrl, 0, "/M=fAttrs_About" );
DlgSetInt ( sDlg, nCheckRob_Ctrl, fRon ); // так было...
DlgSetInt ( sDlg, nCheckHid_Ctrl, fHid );
DlgSetInt ( sDlg, nCheckSys_Ctrl, fSys );
DlgSetInt ( sDlg, nCheckArc_Ctrl, fArc );
if ( Return_Int = DlgExecute( sDlg, nCheckRob_Ctrl, "Attributes to reset", "", "", 0 ) ) { // спросим...
fRon = DlgGetInt ( sDlg, nCheckRob_Ctrl ); // так стало...
fHid = ( DlgGetInt ( sDlg, nCheckHid_Ctrl ) << 1 );
fSys = ( DlgGetInt ( sDlg, nCheckSys_Ctrl ) << 2 );
fArc = ( DlgGetInt ( sDlg, nCheckArc_Ctrl ) << 5 );
nAtr = fRon + fHid + fSys + fArc + fDir + fVol; // соберём атрибуты в кучу
if ( nAtr != fAtr ) Cur_File_Attr = nAtr; // если изменилось - отработаем
}
DlgKill( sDlg );
}
}
void fAttrs_About { // микро подсказка (краткая справка)
MsgDlg( "'" + nMacroName + "' is a tool to handle\\n"
+ "current file attributes.\\n\\n"
+ "Parameters:\\n"
+ "none == to call a dialog\\n"
+ "'R' - ReadOnly (rOn)\\n"
+ "'H' - Hidden (Hid)\\n"
+ "'S' - System (Sys)\\n"
+ "'A' - Archive (Arc)\\n"
+ "(!) any case\\n\\n"
+ "Modifiers:\\n"
+ "'+' - set\\n"
+ "'-' - clear\\n"
+ "none - switch\\n"
+ "spaces ' ' - ignored\\n\\n"
+ "Example:\\n"
+ "'R-h s+' == clear rOn, switch Hid, set Sys"
, 'About ' + nMacroName + '...', "", 1 );
}