Xorcist:
I wasn't suggesting having a fixed-length array, but I thought you could have done this:
[pascal]
SetLength(FJoyCaps,FJoyList.Count); // Set length here
FillChar(FJoyCaps[0], (FJoyList.Count * SizeOf(TDIDevCaps)), 0); //Zero memory -- not sure if this is necessary or not...
for iCount := 0 to (FJoyList.Count - 1) do begin
SetLength(FJoyDevice, Length(FJoyDevice) + 1);
FDirectInput.CreateDevice(PGUID(FJoyList.Objects[iCount])^, FJoyDevice[iCount], nil);
FJoyDevice[iCount].SetDataFormat(@c_dfDIJoystick2);
FJoyDevice[iCount].SetCooperativeLevel(Handle, DISCL_EXCLUSIVE or DISCL_FOREGROUND);
//SetLength(FJoyCaps, Length(FJoyCaps) + 1); // Remove this line
FJoyCaps[iCount].dwSize := SizeOf(TDIDevCaps);
FJoyDevice[iCount].GetCapabilities(FJoyCaps[iCount]);
DevNum := iCount;
FJoyDevice[iCount].EnumObjects(EnumInputAxis, nil, DIDFT_AXIS);
FJoyDevice[iCount].Acquire;
end;
[/pascal]

Stevie:

SetLength(FJoyDevice, Length(FJoyDevice) + 1); should be fine.

'High' actually returns length - 1, so to expand the array you would have to do:
SetLength(FJoyDevice,High(FJoyDevice)+2);

Length and SizeOf are completely different. Length returns the number of characters in a string, or the number of elements in an array. SizeOf returns the amount of space a particular type takes up (dynamic arrays are actually pointers, so this will always return 4)