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

研究会

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

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

〔1008〕Re:ACFinder 090811test版(EXEのみ) Hidemi Oya (09/08/12 17:59)
〔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)
〔1010〕Re:ACFinder 090811test版(EXEのみ) Hidemi Oya (09/08/12 22:34)

〔1008〕Re:ACFinder 090811test版(EXEのみ)
 Hidemi Oya WEB  (09/08/12 17:59)

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

>表示処理自体は OnClickに書いています。
 ああ、OnClick でしたか。確かに、OnClick で処理するとカーソルが滑らなくなりますね。

>OnKeyDown 時に無視するのはいいんですが、Up時の表示で、矢印キーのDown Up を小刻みに繰り返した場合(OnKeyUpイベントが連続的に発生した場合)、結局以前のように、キー操作が終わってからもしばらく表示処理が勝手に続きます。
>表示中フラグが立っている時に無視する処理をいれた場合、タイミングによって、最後にキーを離した時の項目が表示されなかったりで、もう少し試行錯誤してみます。
 そういわれてみれば、確かに(^_^;)。ってことは、OnKeyUp イベントが発生したときに、以前の表示処理を実行中なら中断して、新たな表示に切り替えるようにしなきゃならないってことか…。これは、結構面倒ですね。
 とりあえず、薬剤タブの各コンポーネントの表示速度の向上でどこまで行けるかを確認してみた方が良いかもしれません。

 たとえば、TStrings 関係のコンポーネントは、値を変更する前後を下記のように BeginUpdate と EndUpdate で囲んでやると、かなり速くなります。また、TStringGrid は、Rows[] で一括して行を扱うより、Cells でセル単位に値を代入した方が高速でした。さらに、セル単位で操作する場合でも、行毎に BeginUpdate と EndUpdate で囲んだ方が高速になるようです。
 あとは、[#997] で書いたような検索の高速化ですね。ひとつひとつは小さな改善でも、ちりも積もれば山となるかも…。

1. 通称・登録番号・成分・系統の各リストボックス
ListBox.BeginUpdate;
ListBox.Clear;
ListBox.Add(...);
 …
ListBox.EndUpdate;

2. ログペイン
Memo.Lines.BeginUpdate;
Memo.Add(...);
 …
Memo.Lines.EndUpdate;

3. 成分表・適用表の各ストリンググリッド
StringGrid.Rows[row].BeginUpdate;
StringGrid.Cells[col, row] := .....;
 …
StringGrid.Rows[row].EndUpdate;

〔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;

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

引用なし
   すみません。訂正です。

1. 通称・登録番号・成分・系統の各リストボックス
ListBox.Items.BeginUpdate;
ListBox.Items.Clear;
ListBox.Items.Add(...);
 …
ListBox.Items.EndUpdate;

2. ログペイン
Memo.Lines.BeginUpdate;
Memo.Lines.Add(...);
 …
Memo.Lines.EndUpdate;

〔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.