-
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, больше никак