列表框仅在按下时突出显示

时间:2014-11-02 01:02:31

标签: delphi listbox firemonkey delphi-xe6

我正在创建一个Delphi XE6 Firemonkey移动应用程序,并希望突出显示一个列表框项目,但仅在按下它时。有关我所效果的示例,请创建一个新的Firemonkey桌面应用程序,添加TListBox并添加以下事件处理程序和代码: -

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin  
//populate the listbox
for i := 0 to 19 do
ListBox1.Items.Add(IntToStr(i));
end;

procedure TForm1.ListBox1ItemClick(const Sender: TCustomListBox;
const Item: TListBoxItem);
begin
ListBox1.ItemIndex:=-1;
end;

现在单击列表框中的某个项目,突出显示应在释放鼠标按钮时消失。重复移动练习只能看到长时间的按压产生所需的结果,短按会导致突出显示。所以我在表单上删除了一个计时器,设置为FALSE,间隔为200并创建一个OnTimer事件: -

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin  
//populate the listbox
for i := 0 to 19 do
ListBox1.Items.Add(IntToStr(i));
end;

procedure TForm1.ListBox1ItemClick(const Sender: TCustomListBox;
const Item: TListBoxItem);
begin
Timer1.Enabled:=TRUE;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ListBox1.ItemIndex:=-1;
Timer1.Enabled:=FALSE;
end;

取得了进展,但通过快速按下列表框,列表框很容易保持突出显示。我在TListView上尝试了计时器选项,它看起来像希望的那样工作,但我很想找到TListBox的解决方案。

接下来的brainwave是在listboxitem中添加一个按钮: -

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
BoxItem: TListBoxItem;
ListBoxSpeedButton: TSpeedButton;

begin
for i := 0 to 99 do
 begin
 ListBox1.Items.Add(IntToStr(i));
 BoxItem := ListBox1.ListItems[ListBox1.Items.Count-1];
 ListBoxSpeedButton:=TSpeedButton.Create(nil);
 ListBoxSpeedButton.Parent:=BoxItem;
 ListBoxSpeedButton.CanFocus:=FALSE;
 ListBoxSpeedButton.Align:=TAlignLayout.Client;
 end;
end;

但是,当滚动列表框时,按钮会被激活,当使用自定义的“速度”按钮时,滚动会生涩并且没有响应,我不禁觉得我在没有需要的时候使用控件。

这里有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:0)

嗯......我首先会说滚动时不要使用列表框...... FMX列表框意味着停滞不前,滚动时性能可怕。使用TListView和TListViewItems。在SO和包装的Delphi XE6示例中有大量关于如何通过TListView实现列表的示例。话虽如此,不需要定时器。利用已经可用于此类事物的事件,例如OnMouseDown和onMouseUp,这些事件基本上分配给每个FMX控件(ListBox ListBoxItem或ListView等)......有很多方法可以实现这个......

试试这个 - 为每个listboxItem设置onMouseDown和MouseUp事件,如下所示:

procedure TForm1.ListBoxItem5MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  if sender is TListboxItem then
    ListBox.ItemIndex:=TListBoxItem(sender).index
end;

procedure TForm1.ListBoxItem5MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  ListBox.ItemIndex:=-1;
end;