Laboratory of Mobile Agricultural Chemicals Searcher
携帯農薬検索実験室

研究会

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
11 / 114 ツリー <前へ | 次へ>

〔974〕ACFinder 090801test版 kabe (09/08/01 22:54)

〔1009〕Re:ACFinder 090811test版(EXEのみ) Hidemi Oya (09/08/12 22:25)
〔1012〕KeyUp 時のみ表示 Hidemi Oya (09/08/13 7:45)
〔1014〕Re:KeyUp 時のみ表示 Hidemi Oya (09/08/13 18:54)

〔1009〕Re:ACFinder 090811test版(EXEのみ)
 Hidemi Oya WEB  (09/08/12 22:25)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

> そういわれてみれば、確かに(^_^;)。ってことは、OnKeyUp イベントが発生したときに、以前の表示処理を実行中なら中断して、新たな表示に切り替えるようにしなきゃならないってことか…。これは、結構面倒ですね。
 と思ったんですが、OnClick では処理が終わるまでメッセージがマスクされてるみたいなので、下記のような方法でうまくいきました。表示速度の最適化を行ってももっさり感が残る場合は、お試しください。

//Form の private に、リストボックスの数だけ下記の2行を追加。
FList1KeyUp: boolean;
FList1Selected: integer; // リスト更新時に -1 に設定すること

// ListBox1 の OnKeyUp イベント処理
procedure TForm1.ListBox1KeyUp(...);
begin
FList1KeyUp := true;
ListBox1Click(Sender);
end;

// ListBox1 の OnMouseUp イベント処理
procedure TForm1.ListBox1MouseUp(...);
begin
FList1KeyUp := true;
ListBox1Click(Sender);
end;

// ListBox1 の OnClick イベント処理
procedure TForm1.ListBox1Click(Sender: TObject);
begin
// KeyUp または MouseUp 時以外は無処理
if not FList1KeyUp then Exit;
try
// 同じアイテムが選択された場合は無処理
if ListBox1.ItemIndex = FList1Selected then Exit;
(* ここに表示処理 *)
FList1Selectd := ListBox1.ItemIndex; // 現在の表示アイテムを保存
finally
FList1KeyUp := false; // 表示処理後は KeyUp フラッグをクリア
end;
end;

〔1012〕KeyUp 時のみ表示
 Hidemi Oya WEB  (09/08/13 7:45)

引用なし
   kabe さん、こん**は。Hidemi Oya です。

 こちらの方がもっと簡単に実装できます。Selected 変数を初期化しなくてすむので新たなバグを生みにくいですが、少しカーソルが滑るかも…。

//Form の private に、リストボックスの数だけ下記の行を追加。
FList1KeyDown: boolean;

// ListBox1 の OnKeyUp イベント処理
procedure TForm1.ListBox1KeyUp(...);
begin
FList1KeyDown := false;
ListBox1Click(Sender);
end;

// ListBox1 の OnKeyDown イベント処理
procedure TForm1.ListBox1KeyDown(...);
begin
FList1KeyDown := true;
end;


// ListBox1 の OnClick イベント処理
procedure TForm1.ListBox1Click(Sender: TObject);
begin
// KeyDown 時は無処理
if FList1KeyDown then Exit;
(* ここに表示処理 *)
end;

〔1014〕Re:KeyUp 時のみ表示
 Hidemi Oya WEB  (09/08/13 18:54)

引用なし
   >Selected 変数を初期化しなくてすむので新たなバグを生みにくいですが
 すみません、寝ぼけてたようです(^_^;)。FList1Selected は、同じアイテムが選択されたときに表示ルーチンを実行しないために設定してるので、こちらの方法でも必要です。

//Form の private に、リストボックスの数だけ下記の2行を追加。
FList1KeyDown: boolean;
FList1Selected: integer; // リスト更新時に -1 に設定すること

// ListBox1 の OnKeyUp イベント処理
procedure TForm1.ListBox1KeyUp(...);
begin
FList1KeyDown := false;
ListBox1Click(Sender);
end;

// ListBox1 の OnKeyDown イベント処理
procedure TForm1.ListBox1KeyDown(...);
begin
FList1KeyDown := true;
end;

// ListBox1 の OnClick イベント処理
procedure TForm1.ListBox1Click(Sender: TObject);
begin
// KeyDown 時は無処理
if FList1KeyDown then Exit;
// 同じアイテムが選択された場合は無処理
if ListBox1.ItemIndex = FList1Selected then Exit;
(* ここに表示処理 *)
FList1Selectd := ListBox1.ItemIndex; // 現在の表示アイテムを保存
end;

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
11 / 114 ツリー <前へ | 次へ>
ページ:  ┃  記事番号:   
(SS)C-BOARD vv3.8 is Free.