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 вызывает проблемы? Как правильно добавить новую строку?

0

Решение

В настоящее время выполняется обновление до нового 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 здесь — надеюсь, что это поможет!

1

Другие решения