47 lines
1.3 KiB
Markdown
47 lines
1.3 KiB
Markdown
|
# MaxLength
|
|||
|
|
|||
|
- **功能描述:** 在文本编辑框里限制文本的最大长度
|
|||
|
- **使用位置:** UPROPERTY
|
|||
|
- **引擎模块:** String/Text Property
|
|||
|
- **元数据类型:** int32
|
|||
|
- **限制类型:** FName/FString/Fext
|
|||
|
- **常用程度:** ★★★★★
|
|||
|
|
|||
|
在文本编辑框里限制文本的最大长度。但在C++或蓝图层面还是可以自己任意写入值的。
|
|||
|
|
|||
|
## 测试代码:
|
|||
|
|
|||
|
```cpp
|
|||
|
UPROPERTY(EditAnywhere, Category = MaxLengthTest, meta = (MaxLength = 10))
|
|||
|
FString MyString_MaxLength10 = TEXT("Hello");
|
|||
|
```
|
|||
|
|
|||
|
## 测试效果:
|
|||
|
|
|||
|

|
|||
|
|
|||
|
## 原理:
|
|||
|
|
|||
|
在文本框里字符串改变的时候,检查当前的长度,超过则报错。
|
|||
|
|
|||
|
如果是FName属性,则会把MaxLength 继续限制在NAME_SIZE (1024)以内。
|
|||
|
|
|||
|
```cpp
|
|||
|
MaxLength = PropertyHandle->GetIntMetaData(NAME_MaxLength);
|
|||
|
if (InPropertyEditor->PropertyIsA(FNameProperty::StaticClass()))
|
|||
|
{
|
|||
|
MaxLength = MaxLength <= 0 ? NAME_SIZE - 1 : FMath::Min(MaxLength, NAME_SIZE - 1);
|
|||
|
}
|
|||
|
|
|||
|
bool SPropertyEditorText::OnVerifyTextChanged(const FText& Text, FText& OutError)
|
|||
|
{
|
|||
|
const FString& TextString = Text.ToString();
|
|||
|
|
|||
|
if (MaxLength > 0 && TextString.Len() > MaxLength)
|
|||
|
{
|
|||
|
OutError = FText::Format(LOCTEXT("PropertyTextTooLongError", "This value is too long ({0}/{1} characters)"), TextString.Len(), MaxLength);
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
```
|