Delphi TStringGrid输入验证只允许C+上的数字、小数和逗号+;建筑商XE8

Delphi TStringGrid输入验证只允许C+上的数字、小数和逗号+;建筑商XE8,delphi,c++builder,c++builder-xe8,Delphi,C++builder,C++builder Xe8,这个问题是另一个问题的延伸: 我有一个可编辑的TStringGrid。我只希望用户为网格中的每个单元格键入数字和最多一个小数点或逗号 通过上面的链接,我了解了如何只允许某些键,而不知道如何跟踪给定单元格中某个键值已经存在多少次 从上面的链接中,我得到了以下信息: void\uu fastcall TSetDataForm::ProbabilityGridKeyPress(TObject*发送方,系统::WideChar&Key) { if(Key==VK_BACK) 回来 如果((键L'9')

这个问题是另一个问题的延伸:

我有一个可编辑的
TStringGrid
。我只希望用户为网格中的每个单元格键入数字和最多一个小数点或逗号

通过上面的链接,我了解了如何只允许某些键,而不知道如何跟踪给定单元格中某个键值已经存在多少次

从上面的链接中,我得到了以下信息:

void\uu fastcall TSetDataForm::ProbabilityGridKeyPress(TObject*发送方,系统::WideChar&Key)
{
if(Key==VK_BACK)
回来
如果((键L'9'))
{
ShowMessage(“请仅输入数字”);
键=0;
}
}

如何允许
,“
但只允许一次?

我的问题是因为我不知道如何读取用户正在写入的单元格文本

以下是我为感兴趣的人提供的解决方案:

void\uu fastcall TSetDataForm::ProbabilityGridKeyPress(TObject*发送方,系统::WideChar&Key)
{
if(Key==VK_BACK)
回来
如果(!((键>=L'0')&(键单元格[ProbabilityGrid->Col][ProbabilityGrid->Row])>0)
{
ShowMessage(“两点!”);
键=0;
}
}

我的问题源于我不知道如何读取用户正在写入的单元格文本

以下是我为感兴趣的人提供的解决方案:

void\uu fastcall TSetDataForm::ProbabilityGridKeyPress(TObject*发送方,系统::WideChar&Key)
{
if(Key==VK_BACK)
回来
如果(!((键>=L'0')&(键单元格[ProbabilityGrid->Col][ProbabilityGrid->Row])>0)
{
ShowMessage(“两点!”);
键=0;
}
}

我建议使用
TryStrToFloat()
来验证输入,那么用户是否输入了有效的十进制字符串就毫无疑问了。您只需处理以下额外情况:

  • 用户正在编辑字段末尾以外的某个位置键入字符,可以选择文本,也可以不选择文本

  • 用户正在将文本复制/粘贴到编辑器中

例如:

类TStringGridAccess:公共TStringGrid
{
公众:
__属性编辑器;
};
void u fastcall tsetdata::ProbabilityGridKeyPress(TObject*发送方,系统::WideChar&Key)
{
开关(钥匙)
{
案例3://Ctrl-C
案例8://退格
回来
案例22://Ctrl-V
{
键=0;
TInplaceEdit*编辑器=((tstringridaccess*)概率网格)->InplaceEditor;
字符串SaveCellText=ProbabilityGrid->Cells[ProbabilityGrid->Col][ProbabilityGrid->Row];
字符串SaveEditText=编辑器->文本;
int SaveSelStart=Editor->SelStart;
int SaveSelLen=编辑器->SelLength;
编辑器->执行(WM_粘贴,0,0);
TFormatSettings fmt=TFormatSettings::Create();
fmt.DecimalSeparator=_D('.');
双重价值;
if(TryStrToFloat(编辑器->文本、值、fmt))
回来
概率网格->单元格[概率网格->列][概率网格->行]=SaveCellText;
编辑器->文本=保存编辑文本;
编辑器->SelStart=SaveSelStart;
编辑器->SelLength=SaveSelLen;
打破
}
案例_D('0'):
案例(1):
案例_D('2'):
案例D('3'):
案例D('4'):
案例D('5'):
案例(6):
案例(7):
案例D('8'):
案例D('9'):
案例D('.'):
{
TInplaceEdit*编辑器=((tstringridaccess*)概率网格)->InplaceEditor;
字符串str=编辑器->文本;
int idx=编辑器->选择开始;
int len=编辑器->SelLength;
String str2=str.SubString(1,idx)+Key+str.SubString(1+idx+len,MaxInt);
TFormatSettings fmt=TFormatSettings::Create();
fmt.DecimalSeparator=_D('.');
双重价值;
if(TryStrToFloat(str2,value,fmt))
回来
打破
}
}
ShowMessage(_D(“请仅输入小数”);
键=0;
}

我建议使用
TryStrToFloat()
来验证输入,那么用户是否输入了有效的十进制字符串就毫无疑问了。您只需处理以下额外情况:

  • 用户正在编辑字段末尾以外的某个位置键入字符,可以选择文本,也可以不选择文本

  • 用户正在将文本复制/粘贴到编辑器中

例如:

类TStringGridAccess:公共TStringGrid
{
公众:
__属性编辑器;
};
void u fastcall tsetdata::ProbabilityGridKeyPress(TObject*发送方,系统::WideChar&Key)
{
开关(钥匙)
{
案例3://Ctrl-C
案例8://退格
回来
案例22://Ctrl-V
{
键=0;
TInplaceEdit*编辑器=((tstringridaccess*)概率网格)->InplaceEditor;
字符串SaveCellText=ProbabilityGrid->Cells[ProbabilityGrid->Col][ProbabilityGrid->Row];
字符串SaveEditText=编辑器->文本;
int SaveSelStart=Editor->SelStart;
int SaveSelLen=编辑器->SelLength;
编辑器->执行(WM_粘贴,0,0);
TFormatSettings fmt=TFormatSettings::Create();
fmt.DecimalSeparator=_D('.');
双重价值;
if(TryStrToFloat(编辑器->文本、值、fmt))
回来
概率网格->单元格[概率网格->列][概率网格->行]=SaveCellText;
编辑器->文本=保存编辑文本;
编辑器->SelStart=SaveSelStart;
编辑器->SelLength=SaveSelLen;
打破
}
案例D('0