Ошибка при добавлении объектов в TListBox?

По-видимому, привлекательной особенностью FMX является добавление визуальных объектов в TListBox. В предыдущем вопросе я упомянул проблему правильного позиционирования объектов внутри TListBox< /а>. Дополнительным неудобством, которое я обнаружил, является использование InsertObject. Когда в TListBox добавляются 8 объектов, я получаю «Аргумент вне допустимого диапазона». На 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.

Ошибка возникает в do_insert при вызове InsertObject и происходит как в Win32, так и в Android. Интересно, это баг или моя ошибка? Может ли кто-нибудь помочь мне?


person Arnold    schedule 19.11.2013    source источник
comment
Интересно. Кроме того, ваш второй вопрос следует задать в другом вопросе.   -  person Jerry Dodge    schedule 20.11.2013
comment
Я адаптировал вопрос к вашему предложению и упомянул платформы: ошибка возникает как на Win32, так и на Android.   -  person Arnold    schedule 20.11.2013


Ответы (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;

или ознакомьтесь с этой ссылкой, как создавать настраиваемые элементы ListBox: Создать настраиваемый элемент ListBox

person Remi    schedule 29.01.2014