Конференция "Компоненты" » Изменение свойств [D7, WinXP]
 
  • webpauk © (28.01.09 11:54) [0]
    в моем компоненте(Tpersistent) есть свойство Text(String).
    как отловить изменение свойства так, как это реализовано у TEdit (procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;)
  • DimaBr © (28.01.09 12:22) [1]
    > в моем компоненте(Tpersistent)
    Я удивлён, обычно
    TMyComponet = class(TComponent)



    На самом деле думаю ситуация такая

    TMyProperty = class(TPersistent)
     published
        property Text: string read fText write SetText;
    end;
    TMyComponet = class(TComponent)
     published
        property MyProperty: TMyProperty
    end;



    Тогда, есть несколько решений:
    1. Организовать событие в сложном свойстве, и подписываться на него из компонента

    TMyProperty = class(TPersistent)
     protected
        property OnChange: TNotifyEvent read fOnChange write fOnChange;
    end;

    procedure TMyProperty.SetText;
    begin
     if fText = Value then Exit;
     fText := Value;
     if Assigned(fOnChange) then fOnChange(self);
    end;

    constructor TMyComponet.Create;
    begin
     fMyProperty := TMyProperty.Create;
     fMyProperty.OnChange := DoPropertyChange;
    end;



    2. Если сложное свойство однозначно принадлежит одному компоненту, то можно известить об изменении напрямую

    TMyProperty = class(TPersistent)
     private
       fOwner: TPersistent;
     published
        property Text: string read fText write SetText;
    end;

    procedure TMyProperty.SetText;
    begin
     if fText = Value then Exit;
     fText := Value;
     TMyComponet(fOwner).DoPropertyChange;
    end;



    или например послать сообщение


    procedure TMyProperty.SetText;
    begin
     if fText = Value then Exit;
     fText := Value;
     if Owner is TControl
       then TControl(fOwner).Perform(CM_TEXTCHANGED,0,0);
    end;

  • webpauk © (28.01.09 12:26) [2]

    > DimaBr ©   (28.01.09 12:22) [1]


    я имел в виду чуть другое.
    когда вводишь текст в Edit.Text (csDesigning), это сразу же отображается на компоненте.
    в предложенном тобой варианте изменения в компоненте произойдут только после нажатия клавиши "enter"
  • DimaBr © (28.01.09 12:56) [3]
    Ничего не понимаю, объясняйтесь яснее.
    Вы хотите автоматическое изменение в контроле при вводе в инспекторе ?
  • DimaBr © (28.01.09 13:39) [4]
    Тогда, возможны два варианта
    1. Написать редактор свойства
    2. Использовать готовый

    { TCaptionProperty
     Property editor for the Caption and Text properties.  Updates the value of
     the property for each change instead on when the property is approved. }


     TCaptionProperty = class(TStringProperty)
     public
       function GetAttributes: TPropertyAttributes; override;
     end;

    function TCaptionProperty.GetAttributes: TPropertyAttributes;
    begin
     Result := inherited GetAttributes + [paAutoUpdate];
    end;

  • Игорь Шевченко © (28.01.09 15:07) [5]

    > как отловить изменение свойства так, как это реализовано
    > у TEdit (procedure CMTextChanged(var Message: TMessage);
    >  message CM_TEXTCHANGED;)


    Очевидно через SetText, больше никак
 
Конференция "Компоненты" » Изменение свойств [D7, WinXP]
Есть новые Нет новых   [134464   +62][b:0][p:0.002]