На мой взгляд, лучшим решением будет отдельная подпрограмма, которая собирает знания обо всех элементах управления контейнером, позволяя подпрограмме проверки диалога оставаться универсальной и в то же время достаточно сфокусированной, чтобы ее можно было легко протестировать и поддерживать. Что-то вроде:
procedure ForceControlVisible(C: TControl);
begin
// Recursive code
if Assigned(C.Parent) then ForceControlVisible(C.Parent);
// Code specific to each container control class
if C is TTabSheet then
begin
// Code that makes sure "C" is the active page in the PageControl
// goes here. We already know the PageControl itself is visible because
// of the recursive call.
end
else if C is TYourCollapsibleBox then
begin
// Code that handles your specific collapsible boxes goes here
end
end;
Методы в стиле ООП, основанные на виртуальных методах или реализации интерфейсов, были бы более элегантными, но требуют доступа к исходному коду всех элементов управления, которые вы хотите использовать: даже если у вас есть доступ ко всем необходимым источникам, предпочтительно не вносить никаких изменений, потому что это усложняет обновление этих элементов управления (вам придется заново вносить изменения после получения новых файлов от поставщика).