Как я могу получить динамические значения для переменной свойства моего компонента

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

Исходный код

var // global
  _V_TB_DefaultColor: TColor

type
  TMyClass = class
  ...
  property ColorDefault: tcolor read _V_TB_DefaultColor write FDefaultColor;
  //[dcc32 Error] MyButton.pas(85): E2168 Field or method identifier expected
  ...
  end;

Редактировать:

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

type
  TTestClass = class(TPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
    FColorDefault:tcolor;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function GetGlobalColorVariable:TColor;
  published
    { Published declarations }
    property DefaultColor:TColor read GetGlobalColorVariable write FColorDefault;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComponents', [TTestClass]);
end;


constructor TTestClass.Create(AOwner: TComponent);
begin
  ColorInitiate;
  inherited;
  color:=DefaultColor;
end;

destructor TTestClass.Destroy;
begin
  inherited;
end;

function TTestClass.GetGlobalColorVariable: TColor;
begin
  result:=_V_TB_DefaultColor;
end;

end.
-1
Emre Acikgoz 15 Апр 2016 в 06:07

3 ответа

Лучший ответ

Глядя на ваш вопрос, кажется, что вы имеете дело с двумя проблемами.

Первая проблема - как получить доступ к некоторой глобальной переменной с помощью свойства.

Вы можете сделать это, используя метод Getter вашего свойства следующим образом:

type
  TTestClass = class(TPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    function GetDefaultColor: TColor;
  published
    { Published declarations }
    property DefaultColor: TColor read GetDefaultColor;
  end;

var // global
  _V_TB_DefaultColor: TColor

implementation

function TTestClass.GetGlobalColorVariable: TColor;
begin
  result := _V_TB_DefaultColor;
end;

Это похоже на то, что вы сделали в своем вопросе. Это всегда заставит ваше свойство DefaultColor возвращать то же значение, которое хранится в вашей глобальной переменной _V_TB_DefaultColor.

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

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

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

type
  TTestClass = class(TPanel)
  private
    { Private declarations }
    class var FDefaultColor: TColot;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    class function GetDefaultColor: TColor;
  published
    { Published declarations }
    class property DefaultColor: TColor read FDefaultColor write FDefaultColor;
  end;

Теперь изменение DefaultColor в одном компоненте изменит DefaultColor для всех компонентов того же класса. Но имейте в виду, что вам все равно придется выполнить соответствующую процедуру для каждого из ваших компонентов, чтобы обновить себя. Это не будет сделано автоматически.


Теперь ваша вторая проблема - обнаружить изменение вашей переменной DefaultColor и соответствующим образом обновить компонент / ы.

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

Как это реализовать?

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

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

0
SilverWarior 16 Апр 2016 в 07:43

Вам необходимо ознакомиться с документацией по свойствам http://docwiki.embarcadero.com/RADStudio/XE7/en/Properties

Ваш код

property ColorDefault:tcolor read _V_TB_DefaultColor write FDefaultColor;

Не одобрен компилятором, потому что _V_TB_DefaultColor не является полем или методом вашего класса. Свойство, вероятно, следует объявить как:

property ColorDefault:tcolor read FDefaultColor write FDefaultColor;

Чтобы установить FDefaultColor равным глобальной переменной _V_TB_DefaultColor, вам необходимо

MyClass.ColorDefault := _V_TB_DefaultColor;

В подходящем месте вашего кода, например f.ex в конструкторе вашего класса.

Обратите внимание: чтобы изменить цвет вашего компонента, вам необходимо присвоить новое значение свойству ColorDefault. Изменение значения вашей глобальной переменной _V_TB_DefaultColor не приведет к автоматическому изменению значения свойства.


В пересмотренном коде вы добавили

function TTestClass.GetGlobalColorVariable: TColor;
begin
  result:=_V_TB_DefaultColor;
end;

Это ничего не даст, если вы не присвоите результат функции чему-либо. Поскольку функция является членом TTestCalss, я считаю, что вы хотите установите свойство Color непосредственно в этой функции:

function TTestClass.GetGlobalColorVariable: TColor;
begin
  Color:=_V_TB_DefaultColor;
end;

В этом случае вы можете изменить его на procedure, потому что вы не используете возвращаемое значение:

procedure TTestClass.GetGlobalColorVariable;
begin
  Color:=_V_TB_DefaultColor;
end;
0
Tom Brunberg 15 Апр 2016 в 07:34

Всем спасибо,

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

-1
Emre Acikgoz 23 Апр 2016 в 08:40