【发布时间】:2018-05-21 15:47:05
【问题描述】:
我试图拥有一个包含对另一个对象 (MyString) 的引用的 TEditDescendant,这样当我编辑 TEdit 文本时,MyString 会得到更新,反之亦然。 这在 MyString 已经存在时有效。但是,如果我需要 MyEdit 才能创建 MyString,它就不起作用。
下面的代码是一个最小的例子:
- btnCreateMyEdit 创建 myEdit 并为其提供一些文本。
-
btnCreateMyString 创建 myString 的实例 btnCheck 显示问题:
- 如果 btnCheck 是在 myString 存在之后创建的(即单击 btnCreateMyString 之后),则没有问题。
- 如果在 myString 存在之前(即单击 btnCreateMyString 之前)创建了 btnCheck,则表明未创建 MyString。
我正在使用 Delphi Tokyo。
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.Edit, FMX.StdCtrls;
type
tMyString= class(TObject)
private
fvalue:string;
property value : string read fvalue write fvalue;
end;
TMyEdit = class(TEdit)
constructor Create(AOwner: TComponent); override;
private
fMyString: tMyString;
fOnChange : TNotifyEvent;
procedure MyOnChange(Sender : TObject);
public
procedure setMyString(prop:tMyString);
property MyProperty: tMyString read fMyString write setMyString;
procedure load;
property OnChange : TNotifyEvent read fOnChange write fOnChange;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
end;
var
Form1: TForm1;
Myedit1:TMyEdit;
Mystring:TMyString;
implementation
{$R *.fmx}
constructor TMyEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Inherited OnChange := MyOnChange;
end;
procedure TMyEdit.MyOnChange(Sender : TObject);
begin
if (text<>'') and (fMyString=nil) then fMyString:=TMyString.Create;
fMystring.value:=self.text;
end;
procedure TMyEdit.load;
begin
if fMyString<>nil then
text:=fMyString.value;
end;
procedure TMyEdit.setMyString(prop:tMyString);
begin
fMyString:=prop;
load;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Myedit1:=TMyEdit.Create(Form1);
MyEdit1.Parent:=Form1;
Myedit1.MyProperty:=MyString;
MyEdit1.Text:='any text';
Myedit1.MyOnChange(self);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
button2.Text:=Myedit1.myproperty.value;
button2.Text:= Mystring.value;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
mystring:=tmystring.Create;
mystring.value:='123';
end;
end.
【问题讨论】:
-
这和你上一个问题完全一样。相同的解决方案。删除
MyString,或使其与其他引用保持同步。考虑以下代码,其中x和y的类型为Integer。如果我写x := 1,然后是y := x,然后是x := 2,你希望在y中看到什么价值? -
我无法删除 myString。在我的真实代码中,它是另一个对象的属性。如何使用这种构造(或其他构造)来使用 tEdit 后代来更新另一个对象的属性?
-
那么你需要保持两个实例同步。当你修改一个时,修改另一个。我已经在骗局中说过了。现在,你能回答我的问题吗?
y的值是 1 还是 2? -
我只是不知道该怎么做——我的想法是 TMyEdit 会自动更新与之关联的任何实例。对于许多 TMyString 属性,我将有几个 TMyEdits - 我想简单地将每个 TMyEdit 与一个属性相关联,并以此确保同步性以最小化代码。
-
... 无论如何,如果问题被重新打开,我可以向 Op 提供所需的答案,我将在其中准确解释他如何实现他的目标。我已经多次尝试过 Op 的尝试,我什至决定将我的这种方法称为“财产转发”。