把一个"结构体"当做属性后碰到的问题
2021-05-01 00:32
1006 查看
把一个"结构体"当做属性后碰到的问题
当我把一个"结构体"在类中当做属性后, 在实用中可以直接读取结构体成员, 但不能直接写入...
下面是由此引发的小练习:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); end; TMyClass = class strict private FPos: TPoint; procedure SetPos(const Value: TPoint); public property Pos: TPoint read FPos write SetPos; //属性 Pos 对应一个点结构 end; var Form1: TForm1; implementation {$R *.dfm} { TMyClass } procedure TMyClass.SetPos(const Value: TPoint); begin FPos := Value; end; {测试} procedure TForm1.Button1Click(Sender: TObject); var obj: TMyClass; begin obj := TMyClass.Create; ShowMessageFmt('%d, %d', [obj.Pos.X, obj.Pos.Y]); //可以直接访问结构中的元素 // obj.Pos.X := 11; //但不能直接给结构中的元素赋值 // obj.Pos.Y := 22; obj.Free; end; //变通一 procedure TForm1.Button2Click(Sender: TObject); var obj: TMyClass; begin obj := TMyClass.Create; obj.Pos := Point(22,33); // ShowMessageFmt('%d, %d', [obj.Pos.X, obj.Pos.Y]); obj.Free; end; //变通二 procedure TForm1.Button3Click(Sender: TObject); var obj: TMyClass; pt: TPoint; begin obj := TMyClass.Create; pt.X := 33; pt.Y := 44; obj.Pos := pt; ShowMessageFmt('%d, %d', [obj.Pos.X, obj.Pos.Y]); obj.Free; end; //变通三(假如属性的 get 不是方法) procedure TForm1.Button4Click(Sender: TObject); var obj: TMyClass; p: PPoint; begin obj := TMyClass.Create; p := Addr(obj.Pos); p.X := 44; p.Y := 55; ShowMessageFmt('%d, %d', [obj.Pos.X, obj.Pos.Y]); obj.Free; end; //变通四(假如属性的 get 不是方法) procedure TForm1.Button5Click(Sender: TObject); var obj: TMyClass; begin obj := TMyClass.Create; PPoint(Addr(obj.Pos)).X := 55; PPoint(Addr(obj.Pos)).Y := 66; ShowMessageFmt('%d, %d', [obj.Pos.X, obj.Pos.Y]); obj.Free; end; end.
练习二:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end; TMyClass = class private FPos: TPoint; function GetPos: TPoint; procedure SetPos(const Value: TPoint); function GetXY(const Index: Integer): Integer; procedure SetXY(const Index, Value: Integer); public property Pos: TPoint read GetPos write SetPos; property X: Integer index 0 read GetXY write SetXY; property Y: Integer index 1 read GetXY write SetXY; end; var Form1: TForm1; implementation {$R *.dfm} { TMyClass } function TMyClass.GetPos: TPoint; begin Result := FPos; end; procedure TMyClass.SetPos(const Value: TPoint); begin FPos := Value; end; function TMyClass.GetXY(const Index: Integer): Integer; begin Result := 0; case Index of 0: Result := FPos.X; 1: Result := FPos.Y; end; end; procedure TMyClass.SetXY(const Index, Value: Integer); begin case Index of 0: FPos.X := Value; 1: FPos.Y := Value; end; end; {测试} procedure TForm1.FormCreate(Sender: TObject); var obj: TMyClass; begin obj := TMyClass.Create; obj.X := 11; obj.Y := 22; ShowMessageFmt('%d, %d', [obj.Pos.X, obj.Pos.Y]); obj.Free; end; end.
相关文章推荐
- Rust、Erlang 并发数量比较
- 解决Play框架启动提示JVM内存分配失败的问题
- 做了一个 62 进制的简单实现
- Windows Server 2008 R2 负载平衡入门篇Apache2.2+Tomcat7.0整合配置详解
- 使用Scala写了个简单的Scheme解释器
- 现在使用控件, 更喜欢继承
- 写了一个字符串的二维表: TSta
- 覆盖、再覆盖
- 记一次失败的Perl + Nginx + FastCGI 配置过程
- 执行 Application.Terminate 后, OnDestroy 中的代码还会执行
- Perl Dancer 学习(一)
- 关于字符串, 之前没这样用过
- 以接口为主导的设计中, 我在使用的框架模式
- 结合领域驱动设计的SOA分布式软件架构
- 获取程序自身大小的函数
- 捕捉 midi 输入消息的基本程序
- Delphi XE2 之 FireMonkey 入门(9) - TBitmap
- C#综合揭秘——细说进程、应用程序域与上下文之间的关系C#综合揭秘——细说多线程(下)”
- WCF揭秘——共享数据契约
- 使用泛型, 写一个为任意类型的动态数组添加元素的方法