У меня есть такая строка: DialogTitle = IDD_SETTING_DLG в файле сохранения (я уже сохранил ее в массиве с именем m_TextArray).
Теперь я хочу получить часть "IDD_SETTING_DLG" (или хотя бы " IDD_SETTING_DLG") и сохранить ее в переменной CString. Я использовал метод Tokenize, но он не сработал.
Вот мои коды:
BOOL CTab1::OnInitDialog()
{
UpdateData();
ReadSaveFile();
SetTabDescription();
UpdateData(FALSE);
return TRUE;
}
void CTab1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_SHOWDES, m_ShowDes);
}
void CTab1::ReadSaveFile()
{
if (!SaveFile.Open(SFLocation, CFile::modeRead | CFile::shareDenyWrite, &ex))
{
ReadSettingFile();
}
else
{
for (int i = 0; i < 100; i++)
{
SaveFile.ReadString(ReadLine);
m_TextArray[i] = ReadLine.GetString();
}
}
}
void CTab1::SetTabDescription() //m_TextArray[2] is where i stored the text
{
Position = 0;
Seperator = _T(" = ");
m_ShowDes = m_TextArray[2].Tokenize(Seperator, Position);
while (!m_ShowDes.IsEmpty())
{
// get the next token
m_ShowDes = m_TextArray[2].Tokenize(Seperator, Position);
}
}
Любое решение или подсказка будут очень признательны.
@ Ян, это ничего не показывало в IDC_SHOWDES Editbox
Попробуйте strtok(). Посмотрите ответ это:
@ Вы имеете в виду вызвать UpdateData() после завершения цикла while или вызвать его в цикле?
В некоторых случаях после этого да, но я понимаю, что вы вызываете это в верхней функции, поэтому я удалил свой комментарий.
@Sisir, когда я заменяю TCHAR * str = (LPCTSTR)cstr; на TCHAR * str = (LPCTSTR)m_TextArray[2];, пишет Ошибка: a value of type LPCTSTR can not be used to initialize an entity of type TCHAR
Вы пытались пройти, чтобы увидеть, где что-то идет не так?
@ Ян, да, я только что отладил его и обнаружил, что while loop зацикливается 3 раза: в первый раз m_ShowDes будет содержать текст DialogTitle, во второй раз он будет содержать IDD_SETTING_DLG, который я хочу, и не знаю, почему он снова зациклился и значение m_ShowDes меняется обратно на "". Вот почему ничего не отображается в поле редактирования.
@Ian Если вы получаете ошибку приведения типа, попробуйте использовать этот код TCHAR * str = cstr.GetBuffer(); вместо TCHAR * str = (LPCTSTR)cstr
Ваш цикл while настроен на цикл пока m_ShowDes не пусто... поэтому он завершается только тогда, когда он пуст.
@Ian Если я введу эту строку в цикл SetDlgItemText(IDC_SHOWDES,m_ShowDes)->, это сработает. Но я не думаю, что эта строка нужна, верно? Потому что я уже сделал DDX_Text(pDX, IDC_SHOWDES, m_ShowDes) в DataExchange.
@Sisir, теперь ошибка This function or variable maybe unsafe
@TurtleLover Сообщение об ошибке содержит только ответ на вашу проблему. Используйте strtok_s() вместо strtok().
MFC предпочитает CString::Tokenize функциям C strtok/strtok_s, которые даже несовместимы с UTF16.





Поскольку вы просто ищете часть строки, которая следует за токеном, нет необходимости использовать Tokenize. Просто найдите позицию символа токена (ваш «=») и получите все после этого:
void CTab1::SetTabDescription() //m_TextArray[2] is where i stored the text
{
CString separator = _T(" = ");
CString source = m_TextArray[2];
// Get position of token...
int position = source.Find(separator);
// If token is found...
if (position > -1 && source.GetLength() > position)
m_ShowDes = source.Mid(position + 1); // extract everything after token
}
Каким образом это не сработало? Пожалуйста, объясни.