首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi与线程

Delphi与线程
EN

Stack Overflow用户
提问于 2020-12-05 16:11:16
回答 1查看 198关注 0票数 1

我有一个用TRestRequest加了TThread.CreateAnonymousThreadTListView。第一次运行时一切正常,但在PulltoRefresh上不工作(没有冻结,没有结果)。如果我不使用线程,它可以很好地处理冻结。

当我使用除ListView.Items.Clear之外的相同代码时,问题出在哪里

这是我的代码。

代码语言:javascript
复制
procedure TForm4.Server;
var
  i, Id: Integer;
  UName, Descr,ThumbUrl: UnicodeString;
  LItem: TListViewItem;
begin
  FDMemTable1.EmptyDataSet;
  TThread.CreateAnonymousThread(
    procedure
    begin
      RESTClient1.BaseURL := {my PHP URL};
      RESTRequest1.Execute;
      FDMemTable1.First;
    
      TThread.Synchronize(nil,
        procedure
        var
          i: integer;
        begin
          for i := 0 to FDMemTable1.RecordCount - 1 do
          begin
            Id := FDMemTable1.FieldByName('id').Value;
            UName := FDMemTable1.FieldByName('username').Value;
            Descr := FDMemTable1.FieldByName('descr').Value;
            ThumbUrl := FDMemTable1.FieldByName('image_url').Value;
            ListView1.BeginUpdate;
            LItem := ListView1.Items.Add;
            LItem.Data['Id'] := Id;
            LItem.Data['UName'] := UName;
            LItem.Data['Descr'] := Descr;
            LItem.Data['ThumbUrl'] := ThumbUrl;
            LItem.Adapter.ResetView(LItem);
            ListView1.EndUpdate;
            FDMemTable1.Next;
          end;
        end
      );
    end
  ).Start;
end;
    
procedure TForm4.FormShow(Sender: TObject);
begin
  LoadFormState;
  Server;
end;
    
procedure TForm4.ListView1PullRefresh(Sender: TObject);
begin
  ListView1.BeginUpdate;
  try
    ListView1.Items.Clear;
  finally
    ListView1.EndUpdate;
  end;
  Server;
end;

我不得不提一下在ListView1UpdatingObjects上创建的项目。我在Android上测试了它。

EN

回答 1

Stack Overflow用户

发布于 2020-12-10 04:30:20

最后,我必须首先清除ListView1.Items位图,然后删除该项,如下所示。

代码语言:javascript
复制
procedure TForm4.ListView1PullRefresh(Sender: TObject);
var
  i: integer;
  AItem: TListViewItem;
  iBitmap: TListItemImage;
begin
  ListView1.BeginUpdate;
  try
    ListView1.OnPaint := nil;
    while ListView1.Items.Count > 0 do
    begin
      iBitmap := ListView1.Items[0].Objects.FindObjectT<TListItemImage>('MImage');
      if (Assigned(iBitmap) and iBitmap.OwnsBitmap) then
      begin
        iBitmap.Bitmap.Free;
        iBitmap.Bitmap := nil;
      end;
      ListView1.Items.Delete(0);
    end;
  finally
    ListView1.EndUpdate;
    Server;
  end;

接下来,在代码中的某个位置设置ListView1.OnPaint := ListView1Paint

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65155010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档