Как я могу убедиться, что форма чистая и перекрашена?, Некоторые изображения Timage остаются на экране даже после того, как я очищаю растровое изображение - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть программа, которая позволяет пользователю нажимать на каталог, и программа начнет загружать все изображения там и отображать их на экране, а пользователь может просматривать их, прокручивая вниз
Теперь вот проблема,после того, как программа загрузит каталог, если пользователь нажимает на другой каталог, после загрузки нового каталога несколько раз на экране остается предыдущих изображений (Form)!, теперь вот что, если я, например, попробую сосредоточить внимание на другом контроллере (компоненте), а затем нажму на форму, останки будут очищены! , поэтому кажется, что проблема заключается в том факте, что t форма не перекрашена или что-то в этом роде!
Вот что вам нужно знать о моей программе:
1-То, что я сказал, происходит в Fullscreen 2-Я в FMX и я использую TImage
В конце я должен упомянуть, что я уже пытался использовать form1.invalidate;, который очищает остатки чего-то вроде изменения размера изображения, но не работает с остатками изображения (, когда яскажем, остаётся, я имею в виду целую картинку, а не остаткивроде показывает то, о чем я говорю, я думаю, что проблема связана с тем, что я выполняю свою загрузку и очистку в другом потоке, потому что я не смог воспроизвести эту проблему в однопоточном приложении
Вот код теста:

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, System.Generics.Collections,
  FMX.Objects;

type
  TForm2 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  mImageList: TList<TImage>;
  mSwitch: boolean;

implementation
uses
  Threading;

{$R *.fmx}

procedure TForm2.FormCreate(Sender: TObject);
var
  cImage: TImage;
  I: Integer;
begin
  mImageList := TList<TImage>.create;
  mSwitch := false;

  for I := 0 to 3 do
  begin
    cImage := TImage.Create(nil);
    cImage.Parent := Form2;
    mImageList.Add(cImage);
  end;

  Form2.FullScreen := true;
  timer1.Interval := 3000;
end;

procedure TForm2.Timer1Timer(Sender: TObject);

begin

  TThread.CreateAnonymousThread(procedure
    var
      I: Integer;
      heightSum: single;
      path: string;
    begin
      if not(mSwitch) then
        path := 'images\1\1 ('
      else
        path := 'images\2\2 (';

      heightSum := 0;

      for I := 0 to mImageList.Count - 1 do
      begin
        mImageList[I].Bitmap := nil;
      end;

      for I := 0 to mImageList.Count - 1 do
      begin
        mImageList[I].Bitmap.LoadFromFile(path + (i + 1).ToString + ').jpg');
        mImageList[I].Width := mImageList[I].Bitmap.Width;
        mImageList[I].Height := mImageList[I].Bitmap.Height;
        mImageList[I].Position.X := Form2.Width / 2 - mImageList[I].Width / 2;
        mImageList[I].Position.Y := heightSum;
        heightSum := heightSum + mImageList[I].Height;
      end;

      TThread.Synchronize(nil, procedure
        begin
        end);
    end).Start;


  mSwitch := not(mSwitch);
end;

end.
...