Symbian C ++ - Операции с подстрокой над дескрипторами - PullRequest
2 голосов
/ 02 декабря 2008

Какой предпочтительный / самый простой способ манипулировать строками TDesC, например, для получения подстроки.

Я приведу пример моего сценария.

RBuf16 buf;
...
CEikLabel label;
...
label->SetTextL(buf); // (SetTextL takes a const TDesC&)

Я хочу получить подстроку из buf. Так хочу ли я напрямую манипулировать RBuf16, и если да, то как лучше?

Есть ли способ конвертировать в const char *, чтобы я мог просто использовать стандартную манипуляцию строкой C.

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 02 декабря 2008

Лучший или нет, я не могу комментировать, но я использую следующие методы для извлечения подстрок из дескрипторов:

TDes::LeftTPtr()
TDes::MidTPtr()
TDes::RightTPtr()

или

TDesC::Left()
TDesC::Mid()
TDesC::Right()

с разницей между двумя наборами в том, что первый возвращает новый модифицируемый дескриптор, второй - новый неизменяемый дескриптор, содержащий подстроку.

Пока вы разрабатываете на платформе Symbian, я бы настоятельно рекомендовал следовать соглашениям Symbian, а не постоянно думать о Symbian C ++ со стандартной точки зрения C или C ++. Используйте библиотеки, которые Symbian специально сделал доступными, вместо стандартных библиотек C / C ++, которые Symbian может поддерживать или не поддерживать напрямую. Поскольку конечной целью приложения, разработанного на Symbian, является запуск на мобильном устройстве, где надежность и надежность приложений имеют наибольшее значение, вам следует придерживаться того, что Symbian предпочитает и предлагает.

2 голосов
/ 02 декабря 2008

Чтение descriptors.blogspot.com (прокрутите вниз после загрузки).

Вы можете использовать TDes :: LeftTPtr, TDes :: RightTPtr или TDes :: MidTPtr, который даст вам подстроку в виде TPtr (то есть дескриптор, который манипулирует исходными данными).

Вы можете использовать функцию TDes :: Copy, если хотите создать копию своей подстроки.

1 голос
/ 02 декабря 2008

Если вам нужна подстрока из RBuf16, это просто - просто используйте TDes16::MidTPtr

Вы можете преобразовать const char *, выполнив это:

TPtr8 narrowBuf;

// Create a buffer with enough space to store every character, plus one for 
// a null terminator
narrowBuf.AllocL( buf.Length() + 1);

// TPtr8::Copy accepts a TDesC16 
narrowBuf.Copy( buf );

// Append a null terminator and return a pointer to the resultant data
const char* ptr = (const char*)narrowBuf.PtrZ();

Однако теперь у вас есть суженная копия исходных данных. Если вы хотите снова установить метку, вам нужно ее расширить (TDes16 :: Copy (const TDesC8 &)) перед использованием. Попытка сделать Symbian похожим на «нормальный» C ++ с char * и wchar_t * на самом деле не работает - использование дескрипторов слишком укоренилось в ОС.

...