更新请参阅下面的更新部分,该部分基于 OP 在他自己的回答中的观察。
下面的最小项目没有表现出您描述的行为。
如果我单击 ListView1 中的任何项目,ItemClickedCount 变量只会增加一,
正如表单标题上显示的那样(如果我双击表单,ItemClickedCount
按预期增加 2)。
要实现您的切换,只需切换一个布尔值就足够了,或者您可以简单地
从ItemClickedCount 是奇数还是偶数得出切换状态。
所以,我认为您描述的行为必须来自 soe 部分
您的 q 中未提及的代码。显然,找出原因的方法
是迭代地简化您的表单及其代码。祝你好运!
procedure TForm1.BuildList;
var
LItem : TListViewItem;
ListItemText : TListItemText;
Index : Integer;
begin
ListView1.BeginUpdate;
try
ListView1.Items.Clear;
ListView1.ItemAppearanceObjects.ItemEditObjects.Text.TextVertAlign := TTextAlign.Leading;
for Index := 0 to 19 do begin
LItem := ListView1.Items.Add;
LItem.ButtonText := 'Hello';
LItem.Text := 'Row: ' + IntToStr(Index);
LItem.Height := 25;
ListItemText := TListItemText.Create(LItem);
ListItemText.PlaceOffset.X := 100;
ListItemText.PlaceOffset.Y := 25 * (Index - 1);
ListItemText.Name := 'Name' + IntToStr(Index);
end;
finally
ListView1.EndUpdate;
end;
end;
procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer;
const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
begin
Inc(ItemClickedCount);
Caption := IntToStr(ItemClickedCount);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
BuildList;
end;
更新 回复您的评论 + 答案,是的,我确实看到每次单击鼠标都会调用两次 ListView1ItemClickEx。我有
调查了为什么会发生这种情况,这似乎是故意的,尽管为什么对我来说并不明显。
查看 FMX.ListView 的来源(我在西雅图这样做,因此您的行号可能会有所不同),
ListView1ItemClickEx 由第 2003 行调用(Case Entry.Incident of ... TDelayedIncident.ClickEvent:)
在过程 TListViewBase.ProcessIncident(const Entry: TDelayedIncidentEntry);
显然,要被调用两次,每次点击必须有两个这样的Incidents,所以我随后研究了这些事件是如何添加到正在处理的任何列表/队列中的。于是我在第 1949 行查看了procedure TListViewBase.StartIncident(const Incident: TDelayedIncident; const Triggered: Boolean;
const TimeToWait: Single; const CustomData: NativeInt);
。
每次鼠标点击后,这会被调用两次:
第一次查看调用堆栈时,调用源自第 4083 行的 procedure TListViewBase.SetNewItemIndex(const NewIndex: Integer)。
第二次,来自procedure TListViewBase.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single)内部。
我不清楚如何通过 TListView 的属性设置来避免这种情况,但它可能是。但是,ListView1ItemClickEx 处理程序中仍然可以包含一个简单的解决方法:
procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer;
const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
var
LItem : TListViewITem ;
begin
Inc(ItemClickedCount);
if not Odd(ItemClickedCount) then
Exit;
Caption := IntToStr(ItemClickedCount);
LITem := ListView1.Items[ItemIndex];
LItem.Tag := LItem.Tag + 1 ;
LItem.Text := LItem.Text + ' ' + LItem.Tag.ToString + 'clicks';
end;
我想知道如何将这种重复数据删除处理连接到可以包含在源单元中的插入器类中。如果我能想到一个干净的方法,我可能会在稍后添加它。