Обновление Пожалуйста, смотрите раздел Обновления ниже, который основан на наблюдениях ОП в его собственном ответе.
Минимальный проект ниже не демонстрирует поведение, которое вы описываете.
Если щелкнуть любой элемент в ListView1, переменная ItemClickedCount
увеличивается только на единицу, что подтверждается отображением заголовка формы (если я дважды щелкаю форму, ItemClickedCount
увеличивается на 2, как и ожидалось).
Для реализации вашего переключения достаточно просто переключить логическое значение, иначе вы можете просто получить состояние переключения из того, является ли ItemClickedCount
нечетным или четным.
Итак, я думаю, что описанное вами поведение должно исходить из той части вашего кода, которая не упомянута в вашем вопросе. Очевидно, что способ определить причину состоит в том, чтобы итеративно упростить вашу форму и ее код. Удачи!
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
на клик, поэтому я посмотрел, как эти инциденты добавляются в любой обрабатываемый список / очередь. Затем я посмотрел на procedure TListViewBase.StartIncident(const Incident: TDelayedIncident; const Triggered: Boolean;
const TimeToWait: Single; const CustomData: NativeInt);
в строке 1949.
После каждого щелчка мыши это вызывается дважды:
Первый раз, глядя на стек вызовов, Вызов происходит в procedure TListViewBase.SetNewItemIndex(const NewIndex: Integer)
в строке 4083.
Второй раз, он изнутри 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;
Мне интересно связать эту обработку дедупликации с классом вставки, который вы может включать в свой источник. Если я смогу придумать чистый способ, я добавлю его сюда позже.