2013-11-19 3 views
1

По-видимому привлекательная особенность FMX заключается в добавлении визуальных объектов в TListBox. В предыдущем вопросе я упомянул проблему correctly positioning objects inside the TListBox. Дополнительное раздражение, которое я обнаружил, использует InsertObject. Когда 8 объектов добавляются в TListBox, я получаю «Аргумент вне диапазона». На Android я могу получить это сообщение об ошибке при добавлении второго объекта. Я мог бы изолировать эту проблему в небольшой программе:Ошибка при добавлении объектов в TListBox?

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 с тремя компонентами. При нажатии на кнопку скорости объект добавляется к ListBox в основной программе следующим образом:

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. Интересно, является ли это ошибкой или моей ошибкой. Может ли кто-нибудь помочь мне?

+0

Интересно. Кроме того, ваш второй вопрос должен быть задан в другом вопросе. –

+0

Я адаптировал вопрос к вашему предложению и упомянул платформы: ошибка возникает как на Win32, так и на Android. – Arnold

ответ

0

Попробуйте это:

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: Create custom Listbox item

Смежные вопросы