Как установить свойства фрейма на основе свойств его дочерних компонентов? - PullRequest
0 голосов
/ 26 ноября 2010

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

У меня есть рамка с компонентом, скажем, это TButton. После размещения фрейма на форме я изменяю свойство компонента, скажем, я установил тег на кнопке равным 100.

В конструкторе фреймов я хотел бы сделать что-то вроде этого:

constructor TMyFrame.Create(AOwner: TComponent);
begin
  inherited;

  if Button1.Tag = 100
    then DoSomething
    else DoSomethingElse;
end;

Я обнаружил, что в данный момент (при создании) тег кнопки все еще равен 0. Может кто-нибудь порекомендовать другой способ сделать это?

В нашем приложении есть несколько мест, где пользователи могут вводить операторы SQL. Для этого мы используем компонент SynEdit . Для этой цели мы создали рамку с расширенной функциональностью.

Иногда нам нужна версия с поддержкой данных (TDBSYnEdit), а в других случаях нам нужна «обычная» версия (TSynEdit). Мы решили эту проблему, установив управление контентом страницы во фрейме и переключившись на правильную страницу во время разработки. Вкладки скрыты, поэтому пользователь не подозревает, что это происходит.

Проблема в том, что иногда наши разработчики забывают установить правильную страницу в элементе управления страницы или случайно выбирают не ту страницу.

Я хотел исправить это, добавив следующий код к событию Create в кадре

if DBSQLMemo.DataField > ''
  then pcMemos.ActivePage := tsDataAware
  else pcMemos.ActivePage := tsNonDataAware;

Моя теория заключалась в том, что, если разработчик установил свойства источника данных / поля данных редактора, фрейм следует использовать в «режиме с учетом данных», а редактор с учетом данных должен быть видимым. Оказывается, на момент создания эти свойства не заданы.

У кого-нибудь есть хорошее предложение, как мне решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 26 ноября 2010

Как насчет переопределения «загруженных» процедур? Затем, когда все дочерние компоненты загружены, отсканируйте их на предмет того, что вам нужно?

, например

interface

...
protected
  procedure Loaded; override;
...

implementation

procedure Loaded;
var
  i: Integer;
begin
  inherited;

  for i := 0 to pred(Self.ComponentCount) do
    if Self.Components[i] is TSynEdit then
    begin
      // do something
    end;
end;

Если нужный вам компонент не является прямым потомком фрейма, вам необходимо отсканировать дочерние элементы дочерних элементов и т. Д.

0 голосов
/ 26 ноября 2010

Еще одна идея: как насчет создания SynEdit в коде, а не визуально? (Зависит от того, насколько вы хотите изменить его с помощью дизайнера форм.) Затем вы можете удалить PageControl и иметь только один экземпляр редактора на кадр.

0 голосов
/ 26 ноября 2010

Я бы удалил встроенный SynEdit из фрейма и вместо этого дал бы фрейму свойство со ссылкой на экземпляр SynEdit. Таким образом, у вас не всегда будет бесполезный экземпляр SynEdit, и пользователь может даже решить использовать производную SynEdit, о которой вы даже не думали.

...