Конференция "Компоненты" » Составной компонент.
 
  • misha_gr (12.01.07 17:23) [0]
    Вроде несложная задачка, но споткнулся.

    Создается составной компонент:

     TCompoundControl = class(TWinControl)
     private
       FInnerControl : TControl; //(Например TEdit)
       FLabel: TLabel;
       FSplitter: TSplitter;
     procedure CMTextChanged(var Message: TMessage);
       message CM_TEXTCHANGED;
     ...
     end;

    procedure TCompoundControl.CMTextChanged(var Message: TMessage);
    begin
     Flabel.Caption := Caption;
    end;

    Как сделать так, чтобы в design-time корректно отображалась Caption? То есть, при добавлении контрола на форму его Caption становился равен его Name? У меня он почему-то пустой.
  • Юрий Зотов © (13.01.07 16:32) [1]
    В конструкторе:
    ControlStyle := ControlStyle + [csSetCaption];
  • misha_gr (15.01.07 13:09) [2]
    Неа, не правильно. Впрочем, спасибо, уже подсмотрел в исходнике TLabelEdit. Если вдруг кому интересно:

    TCompoundControl = class(TWinControl)
    ...
    protected
    procedure SetName(const Value: TComponentName); override;
    ...
    end;

    procedure TCompoundControl.SetName(const Value: TComponentName);
    begin
     if (csDesigning in ComponentState) and ((FLabel.GetTextLen = 0) or
       (CompareText(FLabel.Caption, Name) = 0)) then
       FLabel.Caption := Value;
     inherited;
    end;
  • DimaBr (15.01.07 15:03) [3]

    procedure TControl.SetName(const Value: TComponentName);
    var
     ChangeText: Boolean;
    begin
     ChangeText := (csSetCaption in ControlStyle) and
       not (csLoading in ComponentState) and (Name = Text) and
       ((Owner = nil) or not (Owner is TControl) or
       not (csLoading in TControl(Owner).ComponentState));
     inherited SetName(Value);
     if ChangeText then Text := Value;
    end;


    Если у вас собственное Caption типа

    property Caption: string read FCaption write SetCaption;


    то естественно оно никоем образом не относится к свойству Text.
  • DimaBr (15.01.07 15:05) [4]
    забыл есчо

    TControl = class()
    property Caption: TCaption read GetText write SetText stored IsCaptionStored;

  • Юрий Зотов © (15.01.07 23:35) [5]
    > misha_gr   (15.01.07 13:09) [2]

    > Неа, не правильно.

    У Вас. Правильно - использовать "родное" свойство Caption.
  • misha_gr (18.01.07 10:23) [6]
    to Юрий Зотов.

    Я, пожалуй, неправильно сформулировал вопрос. Допустим, когда я добавляю на форму какой-нить компонент, тот же TLabel, его Caption автоматически становится равным его имени. При изменении имени тут же меняется и Caption (если Caption не изменялся разработчиком). Вот такого же эффекта я и хотел добиться для составного компонента. Что и было достигнуто путем подглядывания в "близкий по духу" TLabeledEdit.

    Благодарю за ответы и звыняйте за путанную формулировку.
  • Юрий Зотов © (18.01.07 12:21) [7]
    > misha_gr   (18.01.07 10:23) [6]

    См. [1], [3], [4] и [5]. В совокупности с [0] это и получите.
 
Конференция "Компоненты" » Составной компонент.
Есть новые Нет новых   [119210   +27][b:0][p:0.001]