Firemonkey: установка текста TLabel приводит к тому, что индекс строки выходит за пределы диапазона

У меня есть метод, который создает сообщение помощи, а затем устанавливает 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->Text = "This message works!";

Я делаю что-то не так, как я строю HelpMsg Строка?

Редактировать: комментирование строки, которая добавляет \ n к строке, решает проблему. Точно так же следующий код будет вызывать исключение:

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

HelpLabel->Text = test;

Что такого в \ n вызывает проблемы? Как правильно добавить новую строку?

1 ответ

Решение

В настоящее время выполняется обновление до нового C++ Builder, поэтому вы не можете поиграть со своим фрагментом. У меня есть метод для обработки сообщений об ошибках, которые выводятся на вкладку журнала, в отличие от 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
}

Используя TStringList или TStrings (parent) при доступе к свойству Text, строки в объекте выводятся, каждая из которых отделяется переводом каретки и переводом строки.

Посмотрите Документы TStringList здесь - надеюсь, что это поможет!

Другие вопросы по тегам