【发布时间】:2020-04-11 17:48:34
【问题描述】:
我在 Rad Studio 10.3.2 上使用 dephi firemonkey 在 android 9 上进行测试
我想从 TListView 中删除最后一个项目。但在我删除它之前,我想要求确认,然后删除。
为此,我构建了下面的示例代码,它有 1 个 TListview、2 个 Speedbuttons、1 个矩形和 1 个标签。
矩形是可见的,所以当用户滑动 listviewitem 时,它会显示删除按钮。在删除按钮中,我将取消删除并将矩形显示在问题所在的位置,如果单击是则删除该项目。问题是 listviewitem 删除按钮永远不会消失,当用户再次单击屏幕时应用程序崩溃。
以下图片说明操作
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
FMX.ListView, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Objects;
type
TForm1 = class(TForm)
ListView1: TListView;
Rectangle1: TRectangle;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure ListView1DeletingItem(Sender: TObject; AIndex: Integer;
var ACanDelete: Boolean);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ItemDelete : Integer;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
var
Item: TListViewItem;
begin
Item := ListView1.Items.Add();
Item.Text := 'Item 1';
Item := ListView1.Items.Add();
Item.Text := 'Item 2';
Item := ListView1.Items.Add();
Item.Text := 'Item 3';
Item := ListView1.Items.Add();
Item.Text := 'Item 4';
end;
procedure TForm1.ListView1DeletingItem(Sender: TObject; AIndex: Integer; var ACanDelete: Boolean);
begin
ACanDelete := false;
ItemDelete := AIndex;
Rectangle1.Visible := true;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
ItemDelete := -1;
Rectangle1.Visible := false;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
ListView1.Items.Delete(ItemDelete);
ItemDelete := -1;
Rectangle1.Visible := false;
end;
end.
【问题讨论】:
-
如果我忽略滑动并单击 SpeedButton2,
ItemDelete已被编译器初始化为零,因此列表中的第一项(第 1 项)将在没有调用ListView1DeletingItem的情况下被删除,并且我没有 AV。 -
不管问题出在哪里,你真的需要3个步骤(滑动、点击删除、点击是)来完成破坏性动作吗?另一点是在这样的对话框中是/否aren't proper option names。
-
上面的代码只是一个示例。在我的实际应用程序中,代码更加谨慎。是的,我需要在删除前确认。我的问题是当我删除该项目时。我认为问题是单击删除后,该项目应该回到原始表单,在滑动之前,但它没有。
-
@AndreNogueira :有点晚了,只是部分与您关于带有 Delete Button 的 AV 的问题有关。在 Android 上使用 Delphi 10.4.2。我有一个保存数据的数组。我有一个过程,然后根据这个数组填充 Listview。然后将 Listview.ItemIndex 设置为 ItemCount。如果添加项目,这很好用。但是当我删除最后一个项目时,我得到一个访问冲突,在调试后导致删除滑动按钮本身。我所做的是在 onDeleteChangeVisible 内删除时设置索引,否则在 onItemChange 内删除。没有 AV。
-
感谢您的帮助,但现在我工作的公司停止使用 delphi for mobile。我们搬到了颤振。我不得不说,这是一次更好的体验。现在移动设备上的 delphi 只能在遗留应用程序上使用,直到我在 Flutter 上编码
标签: android delphi firemonkey tlistview