Убедитесь, что вложенный дочерний элемент управления виден - PullRequest
2 голосов
/ 10 февраля 2011

У меня есть служебная программа, которую я вызываю, когда проверка ввода пользователя в диалоге завершается неудачно. Он устанавливает фокус на нарушающее управление, издает звуковые сигналы и отображает соответствующее сообщение для пользователя. Это работает хорошо, пока нарушающий контроль не скрыт. Теперь я должен приспособить это к ситуации, когда соответствующие элементы управления являются дочерними элементами неких складных групповых блоков (возможно, даже вложенных), и я должен убедиться, что поля «предков» раскрыты перед вызовом SetFocus.

Теперь у меня есть несколько возможностей:

  • Внедрить знания о сворачиваемом компоненте в процедуру сообщения об ошибках. Я бы хотел этого избежать, так как рутина должна быть довольно общей.
  • Передача обратного вызова, который может быть вызван до (или вместо) SetFocus. Это подвержено ошибкам, потому что нужно помнить, чтобы передать обратный вызов во всех соответствующих местах.
  • Моим любимым решением, вероятно, было бы событие (или переопределяемый метод) (возможно, в TWinControl), которое сообщает элементу управления контейнера «пожалуйста, убедитесь, что вы и ваши дочерние элементы управления видимы», но я не знаю такой вещи.

Есть идеи, как мне справиться с этой ситуацией?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2011
  1. Определить интерфейс с помощью метода, называемого что-то вроде: EnsureVisible.
  2. Реализуйте его для всех ваших компонентов (вам может потребоваться получить собственные версии некоторых из этих компонентов). Это позволяет различным элементам управления вести себя совершенно по-разному.
  3. Когда элемент управления должен убедиться, что он виден, он обходит своих родителей и вызывает EnsureVisible, если реализован интерфейс.

Если вам не нравятся интерфейсы, сделайте это с помощью специального сообщения Windows, но вы поймете основную идею.

2 голосов
/ 10 февраля 2011

На мой взгляд, лучшим решением будет отдельная подпрограмма, которая собирает знания обо всех элементах управления контейнером, позволяя подпрограмме проверки диалога оставаться универсальной и в то же время достаточно сфокусированной, чтобы ее можно было легко протестировать и поддерживать. Что-то вроде:

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;

Методы в стиле ООП, основанные на виртуальных методах или реализации интерфейсов, были бы более элегантными, но требуют доступа к исходному коду всех элементов управления, которые вы хотите использовать: даже если у вас есть доступ ко всем необходимым источникам, предпочтительно не вносить никаких изменений, потому что это усложняет обновление этих элементов управления (вам придется заново вносить изменения после получения новых файлов от поставщика).

1 голос
/ 10 февраля 2011

Каждый компонент знает свой Parent. Вы можете пройти вверх по списку, чтобы сделать каждого родителя видимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...