DAO components work like queries in MS Access, so you needn't to specify index. You specify Sort property and Jet Engine
finds and uses proper index automatically. If suitable index doesn't exist, Jet Engine automatically sorts records, so such operation is not limited to indexed fields.

Property DAODatabase.Password is used for user's password when user level security is enabled. Such passwords are stored in workgroup information file with .mdw extension.

How do I set number of threads in DAO 3.5?

Change this value in registry database with regedit.exe (default is 3):

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Jet 3.5\Threads

This value determines number of threads for internal use in Jet engine only and not for using in application.

How do I use DAO 3.5 functions in C++ Builder?

C++ Builder converts DAO interface unit, originally created in Delphi, so return value of Delphi function is converted as the last parameter of C++ function and C++ functions always return HRESULT type.

Use DML (Data Manipulation Language) SQL statements instead of loops. For
example deleting records with SQL statement 'DELETE FROM MyTable' is much
faster than deleting each record separately with TDAOTable.Delete statement in
loop. Jet database engine contains very sophisticated cost-based query
optimizer. You can activate function ShowPlan to see created plan of execution for each query:
Create this key in registry database:

with DAODatabase.Handle.TableDefs.Item['MyTable'].Indexes do
for i := 0 to Count - 1 do
begin
ShowMessage('Index: ' + Item[i].Name);
with Item[i] do
for j := 0 to Fields.Count - 1 do
ShowMessage('Field: ' + Fields.Item[j].Name);
end;

with DAODatabase do
for i := 0 to Containers.Count - 1 do
with Containers[i] do
for j := 0 to Documents.Count - 1 do
ShowMessage('Container: ' + Containers[i].Name + ' Document: ' + Documents[j].Name);

How do I retrieve table permissions?

var Permissions: Integer;
Permissions := DAODatabase.Containers['Tables'].Documents['MyTable'].Permissions;
if Permissions = dbSecNoAccess then ShowMessage('NoAccess');
if Permissions and dbSecFullAccess = dbSecFullAccess then ShowMessage('FullAccess');
if Permissions and dbSecDelete = dbSecDelete then ShowMessage('Delete');
if Permissions and dbSecReadSec = dbSecReadSec then ShowMessage('ReadSec');
if Permissions and dbSecWriteSec = dbSecWriteSec then ShowMessage('WriteSec');
if Permissions and dbSecDBCreate = dbSecDBCreate then ShowMessage('DBCreate');
if Permissions and dbSecDBOpen = dbSecDBOpen then ShowMessage('DBOpen');
if Permissions and dbSecDBExclusive = dbSecDBExclusive then ShowMessage('DBExclusive');
if Permissions and dbSecDBAdmin = dbSecDBAdmin then ShowMessage('DBAdmin');
if Permissions and dbSecCreate = dbSecCreate then ShowMessage('Create');
if Permissions and dbSecReadDef = dbSecReadDef then ShowMessage('ReadDef');
if Permissions and dbSecWriteDef = dbSecWriteDef then ShowMessage('WriteDef');
if Permissions and dbSecRetrieveData = dbSecRetrieveData then ShowMessage('RetrieveData');
if Permissions and dbSecInsertData = dbSecInsertData then ShowMessage('InsertData');
if Permissions and dbSecReplaceData = dbSecReplaceData then ShowMessage('ReplaceData');
if Permissions and dbSecDeleteData = dbSecDeleteData then ShowMessage('DeleteData');

Use UserName property to retrieve permissions for specified user or group: