如何使用TControl附加任何类型的对象?

时间:2013-11-22 18:13:00

标签: delphi firemonkey-fm2

我想添加一个带有TTreeViewItem的TList和一个自定义类(TRoom)的对象。在delphi 2007中,有一个Pointer类型的字段'Data'已被替换为TValue,我不知道如何使用它。我在互联网上搜索了一些声明它暂时无法处理自定义类型。

除了制作黑客课程外,有人可以设法实现这个目标吗?

例如,以下表单代码应该正常运行: -

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMX.TreeView, FMX.Layouts, FMX.Edit;

type
  TRoom = class

    ID : WORD;
    Name : String;

  end;

  TForm1 = class(TForm)
    TreeView1: TTreeView;
    TreeViewItem1: TTreeViewItem;
    Button1: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
  List : TList;
begin

  // Get The List From TreeViewItem1
  // pani's Solution  - List := TList ( TreeViewItem1.TagObject );

  Edit1.Text := TRoom ( List.First ).Name;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Room : TRoom;
  List : TList;

begin

  List := TList.Create;
  Room := TRoom.Create;
  Room.ID := 5;
  Room.Name := IntToStr ( 5 );
  List.Add ( Room );

  // Add The List To TreeViewItem1    
  // pani's Solution  - TreeViewItem1.TagObject := List;

end;

end.

2 个答案:

答案 0 :(得分:2)

如果要将对象“附加”到TControl,TControl的父类TFmxObject会引入存储任何对象值的.TagObject属性。

除了使用此属性之外,您还可以将.Tag属性与类型转换为NativeInt和您想要的类类型,例如:TreeViewItem1.Tag:= NativeInt(List);和List:= TList(TreeViewItem1.Tag);

答案 1 :(得分:1)

在“小”g“'通用方式中,FMX控件的Data属性应获取或设置控件的核心值。在TImage情况下,这将显示位图,TEdit文本等等。因此,它的目的与VCL树视图项的Data属性完全不同,后者是从对象挂起任意一段数据。

正如pani正确回答的那样,如果要将任意对象引用挂起到FMX树视图项,则可以使用TagObject那说,尽管有关FMX躲避正确的OOP行为的烦恼(参见here),但如果要动态创建树视图项,那么更好的方法可能是派生自定义{{1后代:

TTreeViewItem

或者,如果房间列表的生命周期与它所关联的树视图项的生命周期相同,您实际上可以将该列表封装在该项中:

uses System.Generics.Collections;

type
  TRoomTreeViewItem = class(TTreeViewItem)
    RoomList: TList<TRoom>; //better use a generic than non-generic list as mentioned above
  end;

有些人可能会认为第二种变体是非UI与UI代码的可怕混淆 - 但我个人并不反对(事实上,这就是为什么我建议它),尽管是YMMV。