📄 tech.txt
字号:
7、具有定义有 AS_RECEIVE_VAR 标志参数的命令例子:
8、具有 _SDT_ALL 数据类型参数的命令例子:
// 输入框
static ARG_INFO s_ArgInfo[] =
{
{
/*name*/ _T("提示信息"),
/*explain*/ _T("如果提示信息包含多行,可在各行之间用回车符 (即“字符 (13)”)、"
"换行符 (即“字符 (10)”) 或回车换行符的组合 (即:“字符 (13) + "
"字符 (10)”) 来分隔。如果提示信息太长或行数过多,超过部分将不会被显示出来"),
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*type*/ SDT_TEXT,
/*default*/ 0,
/*state*/ AS_DEFAULT_VALUE_IS_EMPTY,
}, {
/*name*/ _T("窗口标题"),
/*explain*/ _T("参数值指定显示在对话框标题栏中的文本。如果省略,默认为文本“请输入:”"),
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*type*/ SDT_TEXT,
/*default*/ 0,
/*state*/ AS_DEFAULT_VALUE_IS_EMPTY,
}, {
/*name*/ _T("初始文本"),
/*explain*/ _T("参数值指定初始设置到对话框输入文本框中的内容"),
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*type*/ SDT_TEXT,
/*default*/ 0,
/*state*/ AS_DEFAULT_VALUE_IS_EMPTY,
}, {
/*name*/ _T("存放输入内容的容器"),
/*explain*/ _T("参数值所指定的容器可以为数值或文本型,用于以不同的数据类型取回输入内容"),
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*type*/ _SDT_ALL,
/*default*/ 0,
/*state*/ AS_RECEIVE_VAR,
}, {
/*name*/ _T("输入方式"),
/*explain*/ _T("参数值可以为以下常量值: 1、#输入文本; 2、#输入整数; 3、#输入小数; "
"4、#输入密码。如果省略本参数,默认为“#输入文本”"),
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*type*/ SDT_INT,
/*default*/ 0,
/*state*/ AS_DEFAULT_VALUE_IS_EMPTY,
}
};
static CMD_INFO s_CmdInfo =
{
/*ccname*/ _T("输入框"),
/*egname*/ _T("InputBox"),
/*explain*/ _T("在一对话框中显示提示,等待用户输入正文并按下按钮。"
"如果用户在确认输入后(按下“确认输入”按钮或回车键)退出,返回真,否则返回假"),
/*category*/ 15,
/*state*/ NULL,
/*ret*/ SDT_BOOL,
/*reserved*/ 0,
/*level*/ LVL_SIMPLE,
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*ArgCount*/ 5,
/*arg lp*/ s_ArgInfo
};
// 命令实现函数
void fnInputBox (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
LPTSTR szTipText;
if (pArgInf [0].m_dtDataType != _SDT_NULL)
szTipText = pArgInf [0].m_pText;
else
szTipText = NULL;
CInputDlg dlg (NULL, (IsEmptyStr (szTipText) ? IDD_INPUT_DLG2 : IDD_INPUT_DLG));
if (pArgInf [0].m_dtDataType != _SDT_NULL)
dlg.m_strTip = szTipText;
if (pArgInf [1].m_dtDataType != _SDT_NULL)
dlg.m_strCaption = pArgInf [1].m_pText;
if (pArgInf [2].m_dtDataType != _SDT_NULL)
dlg.m_strInitText = pArgInf [2].m_pText;
if (pArgInf [4].m_dtDataType == _SDT_NULL)
dlg.m_nInputWay = 1;
else
dlg.m_nInputWay = max (1, min (4, pArgInf [4].m_int));
if (dlg.DoModal () == IDOK)
{
PMDATA_INF pInf = pArgInf + 3;
// 由于“存放输入内容的容器”参数定义为_SDT_ALL数据类型,所以必须检查其
// m_dtDataType以获取实际数据类型。
switch (pInf->m_dtDataType)
{
case SDT_TEXT:
//!!! 注意必须释放以前的文本。
MFree (*pInf->m_ppText);
*pInf->m_ppText = CloneTextData ((char*)(LPCTSTR)dlg.m_strResult);
break;
case SDT_BYTE:
*pInf->m_pByte = (BYTE)(DWORD)atoi (dlg.m_strResult);
break;
case SDT_SHORT:
*pInf->m_pShort = (SHORT)atoi (dlg.m_strResult);
break;
case SDT_INT:
*pInf->m_pInt = atoi (dlg.m_strResult);
break;
case SDT_INT64:
*pInf->m_pInt64 = _atoi64 (dlg.m_strResult);
break;
case SDT_FLOAT:
*pInf->m_pFloat = atof (dlg.m_strResult);
break;
case SDT_DOUBLE:
*pInf->m_pDouble = atof (dlg.m_strResult);
break;
}
// 设置返回值。
pRetData->m_bool = TRUE;
}
else
{
// 设置返回值。
pRetData->m_bool = FALSE;
}
}
///////////////////
9、具有定义有 AS_RECEIVE_VAR_ARRAY 标志参数的命令例子:
// 取命令行
static ARG_INFO s_ArgInfo[] =
{
{
/*name*/ _T("存放被取回命令行文本的数组容器"),
/*explain*/ _T("在命令执行完毕后,本容器数组内被顺序填入在启动易程序时附加"
"在其可执行文件名后面的以空格分隔的命令行文本段。容器数组内原有数据被全部销毁,"
"容器数组的维数被自动调整为命令行文本段数"),
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*type*/ SDT_TEXT,
/*default*/ 0,
/*state*/ AS_RECEIVE_VAR_ARRAY,
}
};
static CMD_INFO s_CmdInfo =
{
/*ccname*/ _T("取命令行"),
/*egname*/ _T("GetCmdLine"),
/*explain*/ _T("本命令可以取出在启动易程序时附加在其可执行文件名后面的所有以空格分隔"
"的命令行文本段"),
/*category*/ 7,
/*state*/ NULL,
/*ret*/ _SDT_NULL,
/*reserved*/ 0,
/*level*/ LVL_SIMPLE,
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*ArgCount*/ 1,
/*arg lp*/ s_ArgInfo
},
// 命令实现函数
void fnGetCmdLine (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
LPBYTE p = (LPBYTE)GetCommandLine (), pb;
// 跳过调用程序名。
BYTE ch = ' ';
if (*p++ == '\"')
ch = '\"';
while (*p++ != ch);
if (ch != ' ' && *p == ' ') p++; // 跳过第一个空格。
CMyDWordArray aryText;
while (*p != '\0')
{
if (*p == '\"')
{
p++;
pb = p;
while (*pb != '\0' && *pb != '\"')
{
if (IS_CC (*pb) == TRUE)
{
if (pb [1] == 0) break;
pb++;
}
pb++;
}
aryText.Add ((DWORD)CloneTextData ((char*)p, pb - p));
p = pb;
if (*p != '\0') p++;
}
else if (*p > ' ')
{
pb = p;
while (*pb != '\0' && *pb != '\"' && *pb > ' ')
{
if (IS_CC (*pb) == TRUE)
{
if (pb [1] == 0) break;
pb++;
}
pb++;
}
aryText.Add ((DWORD)CloneTextData ((char*)p, pb - p));
p = pb;
}
else
p++;
}
//!!! 必须先释放原变量数组的数据内容。
NotifySys (NRS_FREE_ARY, (DWORD)pArgInf->m_dtDataType, (DWORD)*pArgInf->m_ppAryData);
// 建立新变量数组数据。
INT nSize = aryText.GetDWordCount () * sizeof (DWORD);
p = (LPBYTE)MMalloc (sizeof (INT) * 2 + nSize);
*(LPINT)p = 1; // 数组维数。
*(LPINT)(p + sizeof (INT)) = aryText.GetDWordCount ();
memcpy (p + sizeof (INT) * 2, aryText.GetPtr (), nSize);
*pArgInf->m_ppAryData = p; // 将新内容写回该数组变量。
}
///////////////////
10、具有定义有 AS_RECEIVE_VAR_OR_ARRAY 标志参数的命令例子:
// 取数组成员数
static ARG_INFO s_ArgInfo[] =
{
{
/*name*/ _T("欲检查的容器"),
/*explain*/ _T("参数值指定欲检查其成员数目的数组容器或者欲检查其是否为数组的容器"),
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*type*/ _SDT_ALL,
/*default*/ 0,
/*state*/ AS_RECEIVE_VAR_OR_ARRAY,
},
};
static CMD_INFO s_CmdInfo =
{
/*ccname*/ _T("取数组成员数"),
/*egname*/ _T("GetAryElementCount"),
/*explain*/ _T("取指定数组容器的全部成员数目,如果该容器不为数组,返回-1,因此本"
"命令也可以用作检查指定容器是否为数组容器"),
/*category*/ 6,
/*state*/ NULL,
/*ret*/ SDT_INT,
/*reserved*/ 0,
/*level*/ LVL_SIMPLE,
/*bmp inx*/ 0,
/*bmp num*/ 0,
/*ArgCount*/ 1,
/*arg lp*/ s_ArgInfo
};
void fnGetAryElementCount (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)
{
//!!! 对于具有 AS_RECEIVE_VAR_OR_ARRAY 或 AS_RECEIVE_ALL_TYPE_DATA 标志的参数,
// 其数据类型中可能带有DT_IS_ARY数组标志,必须以以下方式分离出其数据类型和数组标志。
// DATA_TYPE dtDataType = pArgInf [0].m_dtDataType & ~DT_IS_ARY;
BOOL blIsAry = (pArgInf [0].m_dtDataType & DT_IS_ARY) != 0;
if (blIsAry == FALSE)
pRetData->m_int = -1;
else
GetAryElementInf (*pArgInf [0].m_ppAryData, &pRetData->m_int);
}
///////////////////
11、具有定义有 AS_RECEIVE_ARRAY_DAT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -