【问题标题】:Error in adding objects to a TListBox?将对象添加到 TListBox 时出错?
【发布时间】:2013-11-19 20:43:52
【问题描述】:

FMX 的一个明显吸引人的特性是向 TListBox 添加可视对象。在之前的问题中,我提到了correctly positioning objects inside the TListBox 的麻烦。我发现的另一个烦恼是使用 InsertObject。当将 8 个对象添加到 TListBox 时,我得到“参数超出范围”。在 Android 上,我在添加第二个对象时会收到此错误消息。我可以在一个小程序中隔离这个问题:

  unit tlist_item;

  interface

  uses
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
    FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls;

  type
     TItem_Frame = class(TFrame)
      Button1: TButton;
      Label1: TLabel;
      SpeedButton1: TSpeedButton;

      procedure SpeedButton1Click (Sender: TObject);

     public
        FOnInsert: TNotifyEvent;
        class var FSequence: Int32;

        constructor Create (AOwner: TComponent); override;
     end; // Class: TFrame1 //

  implementation

  {$R *.fmx}

  constructor TItem_Frame.Create (AOwner: TComponent);
  begin
     inherited Create (AOwner);

     Self.Name := Format ('Frame_%d', [FSequence]);
     FSequence := FSequence + 1;
  end; // Create //

  procedure TItem_Frame.SpeedButton1Click (Sender: TObject);
  begin
     if Assigned (FOnInsert)
        then FOnInsert (Sender);
  end;

  end.

上面的代码描述了一个包含三个组件的 TFrame。通过按下速度按钮,一个对象被添加到主程序的列表框中,如下所示:

  unit tlist_main;

  interface

  uses
     System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
     FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
     FMX.ListBox,
     tlist_item;

  type
     TMain_Form = class(TForm)
      ListBox: TListBox;
      procedure FormCreate(Sender: TObject);

     private
        procedure do_insert (Sender: TObject);

     public

     end; // Class: TForm1 //

  var
    Main_Form: TMain_Form;

  implementation

  {$R *.fmx}

  procedure TMain_Form.FormCreate (Sender: TObject);
  begin
     do_insert (ListBox);
  end; // FormCreate //

  procedure TMain_Form.do_insert (Sender: TObject);
  var
     frame: TItem_Frame;
  begin
     frame := TItem_Frame.Create (ListBox);
     frame.Parent := ListBox;
     frame.Position.Y := frame.FSequence * frame.Height;
     frame.Width := ListBox.Width;
     frame.FOnInsert := do_insert;
     ListBox.InsertObject (frame.FSequence - 1, frame);
  end; // do_insert //

  end.

该错误发生在 InsertObject 调用的 do_insert 中,并且在 Win32 和 Android 中都发生。我想知道这是我的错误还是我的错误。谁能帮帮我?

【问题讨论】:

  • 有趣。另外,您的第二个问题应该在另一个问题中提出。
  • 我根据您的建议调整了问题并提到了平台:Win32 和 Android 都出现错误。

标签: delphi listbox delphi-xe5


【解决方案1】:

试试这个:

procedure TMain_Form.do_insert (Sender: TObject);
  var
     frame: TItem_Frame;
  begin
     frame := TItem_Frame.Create (ListBox);
     frame.Parent := ListBox;
     frame.align := TAlignLayout.alTop;
     frame.Height := 50;
     frame.FOnInsert := do_insert;
     ListBox.InsertObject (frame.FSequence - 1, frame);
  end;

或查看此链接如何制作自定义列表框项目: Create custom Listbox item

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多