Interface: ISpeechDataKey
EnumKeys Method
The EnumKeys method returns the name of one subkey of the data key, specified by its index.
The starting index is zero. A count of subkeys or an enumeration of subkey names can be performed by calling this method repetitively, starting with an index of zero, and increasing the index until all items are enumerated. This is indicated by an SPERR_NO_MORE_ITEMS error.
ISpeechDataKey.EnumKeys(
Index As Long
) As String
Parameters
- Index
- The index of the subkey to be returned.
Return Value
A String variable containing the name of the subkey.
Example
The following Visual Basic form code demonstrates several ISpeechDataKey methods, including OpenKey, EnumKeys, SetStringValue, and DeleteValue. It also demonstrates the creation and deletion of custom object token attributes, and the selection of tokens by these custom attributes. A custom attribute called "SenseOfHumor" is created for each voice token. This attribute name is intentionally unrelated to any actual characteristics of a voice or a voice token; it is intended to be obviously meaningless and easily distinguishable from installed voice attributes. To run this code, create a form with the following controls:
- A list box called List1
- Two command buttons called Command1 and Command2
Copy the code below and paste it into the Declarations section of the form.
The Form_Load procedure creates an SpObjectTokenCategory object and sets it to the category of voices in the speech configuration database.
The Command1 procedure sets one data key object to the category of voices, and another data key object to the Tokens subfolder. It then enumerates the voice tokens contained in Tokens and writes a value called SenseOfHumor in the Attributes subfolder of each voice token. The values written are "0" and "1" alternately, so that every second voice has a non-zero SenseOfHumor attribute value. Finally, the procedure calls a subroutine which uses the SenseOfHumor attribute in a GetVoices call.
The Command2 procedure enumerates the voice token "Attributes" subfolders and removes all "SenseOfHumor" attributes. It then calls the subroutine which uses "SenseOfHumor" attributes in a GetVoices call after these attributes have been removed.
Option Explicit
Dim C As SpeechLib.SpObjectTokenCategory 'one object token category
Dim T As SpeechLib.SpObjectToken 'one object token
Dim V As SpeechLib.SpVoice 'Voice used for enumeration
Dim Kc As SpeechLib.ISpeechDataKey 'DataKey of the category
Dim Kf As SpeechLib.ISpeechDataKey 'DataKey of its tokens folder
Dim Kt As SpeechLib.ISpeechDataKey 'DataKey of one token
Const SPERR_NO_MORE_ITEMS = &H80045039;
Private Sub Command1_Click()
Dim nn As Long
Dim strKey As String, strValue As String
Set Kc = C.GetDataKey 'Get DataKey of voice category
Set Kf = Kc.OpenKey("Tokens") 'Get DataKey of its "Tokens" subfolder
nn = 0
On Error Resume Next
Do
strKey = Kf.EnumKeys(nn)
If Err.Number = SPERR_NO_MORE_ITEMS Then Exit Do
'Write an attribute for each voice:
'Attribute "SenseOfHumor" will be true for alternating voices
Set Kt = Kf.OpenKey(strKey) 'Kt = the DataKey of the voice token
Set Kt = Kt.OpenKey("Attributes") 'Kt = the DataKey of voice\Attributes
If nn Mod 2 Then strValue = "1" Else strValue = "0"
Call Kt.SetStringValue("SenseOfHumor", strValue)
nn = nn + 1
Loop
Err.Clear
On Error GoTo 0
Call TestAttributes 'Select voices using this attribute
End Sub
Private Sub Command2_Click()
Dim nn As Long
Dim strKey As String
Set Kc = C.GetDataKey 'Get DataKey of voice category
Set Kf = Kc.OpenKey("Tokens") 'Get DataKey of its "Tokens" subfolder
On Error Resume Next
Do
strKey = Kf.EnumKeys(nn)
If Err.Number = SPERR_NO_MORE_ITEMS Then Exit Do
Set Kt = Kf.OpenKey(strKey) 'Kt = the DataKey of the voice token
Set Kt = Kt.OpenKey("Attributes") 'Kt = the DataKey of voice\Attributes
Call Kt.DeleteValue("SenseOfHumor")
nn = nn + 1
Loop
Err.Clear
On Error GoTo 0
Call TestAttributes 'Select voices using this attribute
End Sub
Private Sub Form_Load()
On Error GoTo EH
'Create new token object, and set its ID to voice tokens
Set C = New SpObjectTokenCategory
C.SetId SpeechCategoryVoices
Set V = New SpVoice
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub TestAttributes()
On Error GoTo EH
List1.Clear
List1.AddItem "Voices with a sense of humor"
For Each T In V.GetVoices("senseofhumor=1")
List1.AddItem " " & T.GetDescription
Next
List1.AddItem ""
List1.AddItem "Voices with no sense of humor"
'When the "SenseOfHumor" attribute is not present,
'the selection "SenseOfHumor!=1" shows all voices,
'bau the selection "SenseOfHumor=0" would show no voices.
For Each T In V.GetVoices("senseofhumor!=1")
List1.AddItem " " & T.GetDescription
Next
EH:
If Err.Number Then ShowErrMsg
End Sub
Private Sub ShowErrMsg()
' Declare identifiers:
Const NL = vbNewLine
Dim T As String
T = "Desc: " & Err.Description & NL
T = T & "Err #: " & Err.Number
MsgBox T, vbExclamation, "Run-Time Error"
End
End Sub