Now, (Object) Pascal being as type-safe as it is, this will of course be easiest if all your functions (or procedures) have the same "signature", i.e, number and types of parameters. If they do, it ought to be as simple as:
type
MyFunctionType: function(Param1: Integer; Param2: Real): Integer;
MyFunctionArray: array[1..3] of MyFunctionType;
procedure StuffEmInArray;
begin
MyFunctionArray[1] := @SomeFunctionOfMyType;
MyFunctionArray[2] := @AnotherFunctionOfMyType;
MyFunctionArray[3] := @TheseFunctionAreOfCourseDeclaredAlready;
end; { procedure StuffEmInArray }
If they have different signatures, you'll have to fiddle around with explicit type-casts to "defeat" (or "fool") the type-safety:
type
MyFunctionArray: array[1..3] of Pointer;
procedure StuffEmInArray;
begin
MyFunctionArray[1] := Pointer(@SomeFunctionOfAnyType);
MyFunctionArray[2] := Pointer(@SomeFunctionOfAnotherType);
MyFunctionArray[3] := Pointer(@TheseFunctionMustStillBePredeclared);
end; { procedure StuffEmInArray }
And then you have the problem that when you use these untyped pointers, you might have to cast them back to a specific function type -- preferably the right one for each... (I'm not sure if you can call code just like "MyResult := MyFunctionArray[Index](MyInteger, MyReal);", etc; maybe not with untyped function parameters.)
But I'm not sure you have to go this "low-level" at all -- it doesn't feel very "Delphi-style" to me. Have you investigated creating your own Event types (predefined "procedure(Param1: aType; Param2: aType ...) of Object" types of properties), and possibly dynamic event handler assignment? (Or, to be really naive, a case statement that branches to different functions/procedures depending on the tab-sheet's index -- or its Tag property; that's what it's for, after all -- in a common event handler?)
Anyway, this should all be pretty well documented in the Help files, so try looking for "function types" and the address-of operator, @.
HTH!
(NOTE: This is all from memory, so might contain syntax errors etc!)