Symbian C ++ - operações de substring em descritores
Pergunta
O que é a maneira preferida / mais fácil de manipular cordas TDesC, por exemplo, para obter uma substring.
Vou dar-lhe um exemplo de meu cenário.
RBuf16 buf;
...
CEikLabel label;
...
label->SetTextL(buf); // (SetTextL takes a const TDesC&)
Eu quero conseguir um substring de buf. Então, eu quero manipular o RBuf16 diretamente e em caso afirmativo, qual é a melhor maneira?
Existe uma maneira de converter para const char * para que eu possa usar apenas a manipulação de cadeia C padrão.
Agradecemos antecipadamente
Solução
Leia descriptors.blogspot.com (scroll para baixo uma vez carregado).
Você pode usar TDES :: LeftTPtr, TDES :: RightTPtr ou TDES :: MidTPtr que lhe dará uma substring como um TPtr (ou seja, um descritor que manipula os dados originais).
Você pode usar os TDES :: Função de cópia se você quiser criar uma cópia de seu substring.
Outras dicas
Melhor ou não, eu não posso comentar, mas eu utilizar os seguintes métodos para extrair sub-cordas de descritores:
TDes::LeftTPtr()
TDes::MidTPtr()
TDes::RightTPtr()
ou
TDesC::Left()
TDesC::Mid()
TDesC::Right()
com a diferença entre os dois conjuntos, sendo que o primeiro retorna um novo descritor modificável, este último, um novo descritor não modificável, contendo o sub-string.
Enquanto você desenvolver na plataforma Symbian, eu sugeriria altamente seguir as convenções Symbian, e não pensar em Symbian C ++ a partir de um padrão C ou ponto C ++ de vista o tempo todo. Use as bibliotecas que Symbian fez especificamente disponível, em vez de bibliotecas padrão C / C ++ que Symbian pode ou não pode apoiar directamente. Uma vez que o objetivo final de um aplicativo desenvolvido no Symbian é para ser executado em um dispositivo móvel, onde a confiabilidade e robustez de aplicações importa mais, você deve ficar com o que Symbian prefere e sugere.
Se você quer uma substring de uma RBuf16, isso é simples - basta usar TDes16::MidTPtr
Você pode converter um const char *, fazendo isso:
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();
No entanto, o que você tem agora um é uma cópia estreitou dos dados originais. Se você quiser definir agora o rótulo de novo, você vai precisar para alargá-la (TDes16 :: Copy (const TDesC8 &)) antes do uso. Tentando fazer olhar Symbian como "normal" C ++ com char * e wchar_t * realmente não funciona -. O uso de descritores é muito enraizada no OS