【问题标题】:Firemonkey: Setting TLabel Text causes String Index out of Range ExceptionFiremonkey:设置 TLabel 文本导致字符串索引超出范围异常
【发布时间】:2015-08-31 20:14:30
【问题描述】:

我有一个方法可以构建帮助消息,然后将TLabel 的文本属性设置为该帮助消息。但是,每当我尝试设置标签的文本时,都会出现以下异常:

'String index out of range. (-1) Must be >=0 and <=42'

方法如下:

void __fastcall TPasswordChangeForm::BuildHelpMessage()
{
    String HelpMsg = "";

    if( NewPassEdit->Text.Length() < MinPasswordLength )
    {
        HelpMsg += "Password length too short.";
    }
    else
    {
        HelpMsg += "Password length OK.";
    }

    HelpMsg += "\n";

    if( NewPassEdit->Text == ConfirmPassEdit->Text )
    {
        HelpMsg += "Passwords match.";
    }
    else
    {
        HelpMsg += "Passwords do not match.";
    }

    ShowMessage( HelpMsg ); //added for debugging, shows string as expected

    HelpLabel->Text = HelpMsg;  //exception thrown here
}

我添加了一个ShowMessage 调用只是为了检查我的字符串的值。它显示得很好。我还可以将标签设置为任意值,例如:

HelpLabel-&gt;Text = "This message works!";

我在构建HelpMsg 字符串时是否做错了什么?

编辑:注释掉将 \n 添加到字符串的行可以解决问题。同样,下面的代码会导致异常:

String test = "this is a test";
test += "\n";
test += "test 2";

HelpLabel->Text = test;

引起问题的 \n 是什么?如何正确添加新行?

【问题讨论】:

  • 尝试改用"\r\n",甚至是RTL的sLineBreak常量。也许 Text 属性在 FireMonkey 中是平台敏感的。并非所有平台都使用"\n" 换行。
  • \r\n 最终也能正常工作。谢谢!

标签: c++ firemonkey c++builder-xe8


【解决方案1】:

目前正在更新到新的 C++ Builder,因此无法使用您的 sn-p。我有处理错误消息的方法,这些错误消息输出到日志选项卡而不是 ShowMessage,而不是使用字符串,尽管我使用了 TStringList。例如:

void __fastcall TPasswordChangeForm::BuildHelpMessage()
{
    TStringList HelpMsg = new TStringList(this);

    if( NewPassEdit->Text.Length() < MinPasswordLength )
    {
        HelpMsg->Add("Password length too short.");
    }
    else
    {
        HelpMsg->Add("Password length OK.");
    }

    if( NewPassEdit->Text == ConfirmPassEdit->Text )
    {
        HelpMsg->Add("Passwords match.");
    }
    else
    {
        HelpMsg->Add("Passwords do not match."_;
    }

    ShowMessage(HelpMsg->Text); //added for debugging, shows string as expected

    HelpLabel->Text = HelpMsg->Text;  //exception thrown here
}

通过在访问 Text 属性时使用 TStringList 或 TStrings(父级),输出对象内的字符串,每个字符串由回车符和换行符分隔。

查看TStringList Docs here - 希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多