Du könntest es in etwa so machen
Delphi-Quellcode:
var Buttons: Array of TButton;
[...]
setlength(Buttons, length(Buttons) + 1);
Buttons[length(Buttons)-1] := TButton.Create;
Buttons.parent := Self;
Buttons.top := y; //musst du selbst festlegen
Buttons.Left := x; //musst du auch selbst festlegen
Buttons.OnClick := ButtonClicksproc;
procedure TIrgendwas.ButtonClicksproc(Sender: TObject);
var LCount: Integer;
LProgramm: String;
begin
for LCount := 0 to length(Buttons) - 1 do
begin
if Sender = Buttons[LCount] then
begin
LProgramm := Programmliste.Strings[LCount];
//jetzt kannst du mit LProgramm dein ShellExecute aufrufen
end;
end;
end;