diff -r 43e37759235e -r 51a74ef9ed63 Symbian3/SDK/Source/GUID-4F5E644B-B2DD-5CD3-B763-E134F1916E62.dita --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/SDK/Source/GUID-4F5E644B-B2DD-5CD3-B763-E134F1916E62.dita Wed Mar 31 11:11:55 2010 +0100 @@ -0,0 +1,112 @@ + + + + + +How +to use array keysThis document describes how to use array keys. +

To access an array by key construct a TKeyArrayFix, TKeyArrayVar or TKeyArrayPak object. +The choice depends on the array type used and the member function accessed.

+

The following code fragments show how this is done. They construct and +manipulate an array of TBankAct objects that contain data +members representing typical bank account details.

+

The TBankAct class is defined as:

+class TBankAct + { +public : + TBuf<32> iActName; + TUint iActNum; + TUint iActValue; + } +

The following code builds a CArrayFixFlat containing three +elements of type TBankAct, as follows:

+CArrayFixFlat<TBankAct> *anArray; +anArray = new CArrayFixFlat<TBankAct>(3); +TBankAct bankact; +... +_LIT(KName1,"A.Bloggs"); +_LIT(KName2,"F.B.Wittering"); +_LIT(KName3,"Z.Makepeace"); +... +bankact.iActName = KName1; +bankact.iActNum = 3; +bankact.iActValue = 300; +anArray->AppendL(bankact); +... +bankact.iActName = KName2; +bankact.iActNum = 1; +bankact.iActValue = 6000; +anArray->AppendL(bankact); +... +bankact.iActName = KName3; +bankact.iActNum = 2; +bankact.iActValue = 32; +anArray->AppendL(bankact); +... +
Sorting the array

To sort the array into account +number order, first construct a TKeyArrayFix object to define +the location and type of key on which to sort the array:

TKeyArrayFix actNumKey(_FOFF(TBankAct,iActNum),ECmpTUint);

In practice, a data member like iActNum may be private, +in which case this statement may not be permitted by the compiler. Two solutions +are:

    +
  1. Make the class in which actNumKey is +declared a friend of TBankAct

  2. +
  3. Declare a public const static TInt data +member iOffset (for example) in the TBankAct class +and include a line of code:

  4. +
    +
  • const TInt TBankAct::iOffset += _FOFF(TBankAct,iActNum);

  • +

actNumKey can then be constructed:

TKeyArrayFix actNumKey(bankact.iOffset,ECmpTUint);

ECmpTUint is +an enumerator of the TKeyCmpNumeric enumeration; this constructor +defines a numeric key.

Now use the key definition to do the sort:

... +anArray->Sort(actNumKey); +...

See also:

    +
  • _FOFF

  • +
+
Re-sort the array

Re-sort the array into account +name order, ignoring the case of the name, and then insert another element +into the array maintaining the same order.

First, construct another TKeyArrayFix object:

TKeyArrayFix actNameKey(_FOFF(TBankAct,iActName),ECmpFolded);

ECmpFolded is an enumerator of the TKeyCmpText enumeration; this constructor +defines a descriptor key.

Now use the key definition to re-sort the +array and insert a new element into the correct place:

... +anArray->Sort(actNameKey); +... +_LIT(KNewName,"W.B.NewPerson"); +... +bankact.iActName = KNewName; +bankact.iActNum = 69; +bankact.iActValue = 24; +... +anArray->InsertIsqL(bankact,actNameKey); +...

Note that the function InsertIsqL() does +not permit duplicates. If there is already an element with the same account +name in the array, then the call to the function leaves withKErrAlreadyExists.

Use +the key definition to find an array element with a specific name and change +the iActValue data member of that element:

+... +_LIT(KFindName,"A.Bloggs"); +bankact.iActName = KFindName; +... +TInt position; +if (anArray->FindIsq(bankact,actNameKey,position)) + { + // array element NOT found + ... + } +else + { + (*anArray)[position].iActValue = 40,000,000; + ... + }

Notes

    +
  • Sorting a packed array +is achieved using the SortL() member function.

  • +
  • Although the example +uses an array of fixed length objects and a TKeyArrayFix object, +the same techniques apply to variable length and packed arrays.

  • +
+
\ No newline at end of file