2008-12-02 6 views
2

Quelle est la manière préférée/la plus simple de manipuler des chaînes TDesC, par exemple pour obtenir une sous-chaîne.Symbian C++ - Opérations de sous-chaînes sur des descripteurs

Je vais vous donner un exemple de mon scénario.

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

Je veux obtenir une sous-chaîne de buf. Donc, je veux manipuler le RBuf16 directement et si oui quelle est la meilleure façon?

Existe-t-il un moyen de convertir en const char * afin que je puisse simplement utiliser la manipulation de chaîne C standard.

Merci à l'avance

Répondre

2

Lire descriptors.blogspot.com (défiler vers le bas une fois chargé).

Vous pouvez utiliser TDes :: LeftTPtr, TDes :: RightTPtr ou TDes :: MidTPtr qui vous donnera une sous-chaîne en tant que TPtr (c'est-à-dire un descripteur qui manipule les données d'origine).

Vous pouvez utiliser la fonction TDes :: Copy si vous souhaitez créer une copie de votre sous-chaîne.

2

meilleur ou non, je ne peux pas commenter, mais j'utiliser les méthodes suivantes pour extraire des sous-chaînes de descripteurs:

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

ou

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

la différence entre les deux ensembles étant que le premier renvoie un nouveau descripteur modifiable, le second, un nouveau descripteur non modifiable, contenant la sous-chaîne. Pendant que vous développez sur la plate-forme Symbian, je vous suggère fortement de suivre les conventions Symbian, et de ne pas penser à Symbian C++ d'un point de vue standard C ou C++ tout le temps. Utilisez les librairies spécifiquement mises à disposition par Symbian, au lieu des librairies C/C++ standard que Symbian peut ou non prendre en charge directement. Puisque le but ultime d'une application développée sur Symbian est de fonctionner sur un appareil mobile où la fiabilité et la robustesse des applications sont les plus importantes, vous devez vous en tenir à ce que Symbian préfère et suggère.

+0

Je suis entièrement d'accord avec votre dernier paragraphe et j'ai essayé de me forcer à apprendre les façons étranges et merveilleux de Symbian. – adam

+0

Je suis d'accord avec la conclusion mais pas pour les mêmes raisons. Ce n'est pas vrai que "Symbian sait mieux" OMI. Par exemple, les hypothèses de performance guidant les conceptions d'API des descripteurs sont obsolètes pour les smartphones modernes, IMO. Mais il est préférable de travailler avec les bibliothèques plutôt que d'utiliser des caractères bruts. –

1

Si vous voulez une sous-chaîne à partir d'un RBuf16, c'est simple - il suffit d'utiliser TDes16::MidTPtr

Vous pouvez convertir un const char * en faisant ceci:

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(); 

Cependant, ce que vous avez maintenant un est un copie rétrécie des données originales. Si vous souhaitez à nouveau définir l'étiquette, vous devrez l'élargir (TDes16 :: Copy (const TDesC8 &)) avant de l'utiliser. Essayer de rendre Symbian "normal" C++ avec char * et wchar_t * ne fonctionne pas vraiment - l'utilisation de descripteurs est trop ancrée dans le système d'exploitation.

+0

"ce que vous avez maintenant est une copie rétrécie des données d'origine" - parfois vous avez besoin de convertir en UTF-8 (avec CnvUtfConverter) si vous voulez faire la manipulation char * de style C.Je suis d'accord qu'il est généralement préférable d'accepter l'inévitable et de travailler avec des descripteurs. –