This 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); ...
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:
Make the class
in which actNumKey
is declared a friend of TBankAct
Declare a public const
static
TInt
data
member iOffset
(for example) in the TBankAct
class and include a line of code:
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); ...
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