2017-08-06 3 views
0

私はTAniindicatorコンポーネントが新しくなっています。テスト目的のために、リストビューの作成中にリストビューを作成してアニメーションを表示/回転させるプロジェクトをまとめました。TAniIndicatorが回転しない - tlistviewをロードする

type 
TLoadThread = class(TThread) 
public 
constructor Create; reintroduce; 
protected 
procedure Process; 
procedure Execute; override; 
end;  

constructor TLoadThread.Create; 
begin 
inherited Create(True); 
FreeOnTerminate := True; 
end; 

procedure TLoadThread.Process; 
begin 
Form1.BuildListView; 
end; 

procedure TLoadThread.Execute; 
begin 
inherited; 
FreeOnTerminate := True; 
Synchronize(Process); 
end; 

var _loadThread : TLoadThread; 

procedure TForm1.ThreadTerminated(Sender: TObject); 
begin 
AniIndicator1.Enabled := False; 
AniIndicator1.Visible := False; 
end; 

procedure TForm1.BuildListView; 
var i : integer; 
    LI : TListViewItem; 
begin 
    Listview1.BeginUpdate; 
try 
    for i := 1 to 2000 do 
    begin 
    LI := Listview1.Items.Add; 
    LI.Text := 'Listview Item ' + IntToStr(i); 
    end; 
finally 
    Listview1.EndUpdate; 
end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
AniIndicator1.Visible := False; 
_loadThread := nil; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
_loadThread := TLoadThread.Create; 
_loadThread.OnTerminate := ThreadTerminated; 
_loadThread.Start; 
AniIndicator1.Enabled := True; 
end; 

私は正しい軌道にいると思っていましたが、これはうまく動作していないと思います。

答えて

0

あなたのワーカースレッドは、TThread.Synchronize()によって呼び出されているProcess()メソッド内にすべての時間を費やしているため、メインUIスレッドで実行されます。 Process()はUIメッセージを処理していないため、TAniIndicatorは機能しません。

あなたのワーカースレッドはまったく役に立たないです。すべてのコードがメインのUIスレッドで実行されています。だから、あなたにも完全TLoadThreadを取り除くことがあります。

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    AniIndicator1.Visible := False; 
end; 

procedure TForm1.BuildListView; 
var 
    i : integer; 
    LI : TListViewItem; 
begin 
    AniIndicator1.Visible := True; 
    AniIndicator1.Enabled := True; 
    ListView1.BeginUpdate; 
    try 
    for i := 1 to 2000 do 
    begin 
     LI := ListView1.Items.Add; 
     LI.Text := 'ListView Item ' + IntToStr(i); 
     if (i mod 100) = 0 then 
     Application.ProcessMessages; 
    end; 
    finally 
    ListView1.EndUpdate; 
    AniIndicator1.Enabled := False; 
    AniIndicator1.Visible := False; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    BuildListView; 
end; 

そうでない場合は、あなたがスレッドを使用している場合、実際にUI触れループ自体、唯一の作品同期しない:

type 
    TLoadThread = class(TThread) 
    public 
    constructor Create; reintroduce; 
    protected 
    procedure Execute; override; 
    end; 

constructor TLoadThread.Create; 
begin 
    inherited Create(True); 
    FreeOnTerminate := True; 
end; 

procedure TLoadThread.Execute; 
begin 
    Form1.BuildListView; 
end; 

var 
    _loadThread : TLoadThread = nil; 

procedure TForm1.ThreadTerminated(Sender: TObject); 
begin 
    _loadThread := nil; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    AniIndicator1.Visible := False; 
end; 

procedure TForm1.BuildListView; 
var 
    i : integer; 
begin 
    TThread.Synchronize(nil, 
    procedure 
    begin 
    AniIndicator1.Visible := True; 
    AniIndicator1.Enabled := True; 
    ListView1.BeginUpdate; 
    end 
); 
    try 
    for i := 1 to 2000 do 
    begin 
     TThread.Synchronize(nil, 
     procedure 
     var 
      LI : TListViewItem; 
     begin 
      LI := ListView1.Items.Add; 
      LI.Text := 'ListView Item ' + IntToStr(i); 
     end 
    ); 
    end; 
    finally 
    TThread.Synchronize(nil, 
     procedure 
     begin 
     ListView1.EndUpdate; 
     AniIndicator1.Enabled := False; 
     AniIndicator1.Visible := False; 
     end 
    ); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if _loadThread <> nil then 
    begin 
    _loadThread := TLoadThread.Create; 
    _loadThread.OnTerminate := ThreadTerminated; 
    _loadThread.Start; 
    end; 
end; 
+0

レミーを、あなたの入力のために非常に感謝、それは今多くの感覚を作る、多くの感謝:) –

関連する問題