asd0023 发表于 2026-4-19 13:52:44

火山 MFC 表格怎么在输入时限制输入长度

本帖最后由 asd0023 于 2026-4-19 13:53 编辑

火山 MFC 表格怎么在输入时限制输入长度?
<火山程序 类型 = "通常" 版本 = 1 />
方法 置单元格输入长度 <公开 类型 = 逻辑型 注释 = "限制单元格的最大可输入字符长度,只对文本型单元格有效." 返回值注释 = "成功返回真,失败返回假." @禁止流程检查 = 真>
参数 列号 <类型 = 整数 注释 = "指定需要限制输入长度的列号,从0开始.">
参数 最大长度 <类型 = 整数 注释 = "指定单元格最大可输入的字符数量,正整数.">
{
    @ CVWnd_Grid* pWnd = (CVWnd_Grid*)GetMfcWndPtrWithValidHWnd ();
    @ if (pWnd != NULL && pWnd->SetMaxTextLength (@<列号>, @<最大长度>))
    @ {
    @   pWnd->Refresh ();
    @   return TRUE;
    @ }
    @ return FALSE;
}
错误: 使用所指定的本地编译器编译当前程序失败错误: vpkg_全局.cpp<H:\voldev25\plugins\vprj_win\classlib\sys\mfc_ui_grid\w_mfc_ui_grid.v>, 595: 错误:   error C2039: "SetMaxTextLength": 不是 "CVWnd_Grid" 的成员    H:\voldev25\plugins\vprj_win\classlib\sys\\mfc_ui_grid\\src\\mfc_ui_grid.h(26): note: 参见“CVWnd_Grid”的声明    vpkg_外部组件操作库_.cpp    vpkg_程序综合库_.cpp    vpkg_进程权限库_.cpp
编译生成目标文件"x'x'x'x'x'x'x"失败,耗费时间 1188 毫秒.
--- 项目"x'x'x"编译或链接失败. 编译过程中共遇到了 1 个警告, 3 个错误.



创世魂 发表于 2026-4-19 14:07:34

就没有这个方法肯定报错啊。

asd0023 发表于 2026-4-19 14:44:26

创世魂 发表于 2026-4-19 14:07
就没有这个方法肯定报错啊。

那要怎么写火山MFC 表格在输入时限制输入长度.
谢谢

朕的 发表于 2026-4-19 14:51:45

asd0023 发表于 2026-4-19 14:44
那要怎么写火山MFC 表格在输入时限制输入长度.
谢谢

消息判断-键盘-拦截

asd0023 发表于 2026-4-19 15:06:04

朕的 发表于 2026-4-19 14:51
消息判断-键盘-拦截

最好在表格控件里写这条
方法 置单元格输入长度 <公开 类型 = 逻辑型 注释 = "限制单元格的最大可输入字符长度,只对文本型单元格有效." 返回值注释 = "成功返回真,失败返回假." @禁止流程检查 = 真>
参数 列号 <类型 = 整数 注释 = "指定需要限制输入长度的列号,从0开始.">
参数 最大长度 <类型 = 整数 注释 = "指定单元格最大可输入的字符数量,正整数.">
直接调用
表格1. 置单元格输入长度(1,6)//限制表格单元在编辑时只能输入最大6个字符

朕的 发表于 2026-4-19 22:24:51

asd0023 发表于 2026-4-19 15:06
最好在表格控件里写这条
方法 置单元格输入长度
参数 列号


表格有这个命令吗?

asd0023 发表于 2026-9-20 11:08:28

本帖最后由 asd0023 于 2026-9-20 11:50 编辑

在w_mfc_ui_grid.v里创建一个方法名
<火山程序 类型 = "通常" 版本 = 1 />

方法 置编辑状态最大字符数 <公开 类型 = 逻辑型 注释 = "限制编辑状态下允许最大字符数" @禁止流程检查 = 真>
参数 列号 <类型 = 整数 注释 = "要限制的列号,(-1 表示不按列判断),>=0使用 参数2">
参数 最大字符数 <类型 = 整数 注释 = "编辑状态下允许最大字符数" @默认值 = 0>
{
    变量 实际限制 <类型 = 整数>
    如果 (列号 == 取光标列号 () && 列号 > -1)
    {
      实际限制 = 最大字符数
    }
    否则
    {
      实际限制 = 0
    }
    @ BOOL bRet = FALSE;
    @ CVWnd_Grid* pGrid = (CVWnd_Grid*)GetMfcWndPtr();
    @ if (pGrid != NULL)
    @ {
    @   HWND hGrid = pGrid->GetSafeHwnd();
    @   HWND hEdit = NULL;
    @   if (hGrid != NULL)
    @   {
    @         // 第一步:在 grid 直接子窗口里找类名为 "Edit" 的
    @         hEdit = ::FindWindowEx(hGrid, NULL, _T("Edit"), NULL);
    @         // 第二步:没找到就枚举所有后代(最多两层就够,grid 的编辑框不会埋得太深)
    @         if (hEdit == NULL)
    @         {
    @             HWND hChild = ::GetWindow(hGrid, GW_CHILD);
    @             while (hChild != NULL && hEdit == NULL)
    @             {
    @               hEdit = ::FindWindowEx(hChild, NULL, _T("Edit"), NULL);
    @               if (hEdit == NULL)
    @               {
    @                     HWND hGrand = ::GetWindow(hChild, GW_CHILD);
    @                     while (hGrand != NULL && hEdit == NULL)
    @                     {
    @                         hEdit = ::FindWindowEx(hGrand, NULL, _T("Edit"), NULL);
    @                         hGrand = ::GetWindow(hGrand, GW_HWNDNEXT);
    @                     }
    @               }
    @               hChild = ::GetWindow(hChild, GW_HWNDNEXT);
    @             }
    @         }
    @         if (hEdit != NULL)
    @         {
    @             ::SendMessage(hEdit, EM_SETLIMITTEXT, (WPARAM)@<实际限制>, 0);
    @             bRet = TRUE;
    @         }
    @   }
    @ }
    @ return bRet;
    返回 (假)

}

<火山程序 类型 = "通常" 版本 = 1 />

方法 表格_字符输入 <接收事件 类型 = 整数 注释 = "当用户输入一个字符后发生此事件,字符键包括任何可打印的键盘字符及回车(Enter)" 注释 = "和退格(BackSpace)键."
      返回值注释 = "本事件的处理方法返回值如果小于0,表明事件已经得到处理且不再需要后续处理,如果" 返回值注释 = "大于0,则将该值作为新的替代字符代码继续进行后续处理.如果等于0,则使用原字符值继"
      返回值注释 = "续进行后续处理.">
参数 来源对象 <类型 = 表格 注释 = "提供事件产生的具体来源对象">
参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
参数 字符代码 <类型 = 字符 注释 = "提供所输入的字符">
{
    来源对象.置编辑状态最大字符数 (2, 7)
    返回 (0)
}

页: [1]
查看完整版本: 火山 MFC 表格怎么在输入时限制输入长度