何とか使えそうです。
Gridの1列目に商品コード、2列目に商品名、3列目に数量とします。
商品コードを入力後、Tabキーを押すと商品名が検索されて表示され、
3列目へキャレットが移動するようにします。
このコードは色々と試行錯誤した結果です。参考になればうれしいです。
もし、別のコードを試される場合、プログラムが無限ループになることが多いので、
暴走しても終了できるようにIDEの環境で実行してください。
Form1にStringGrid1とTimer1を配置します。
(定義部は省略)
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Options := StringGrid1.Options + [goEditing,goTabs,goAlwaysShowEditor];
StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
Timer1.Enabled := false;
Timer1.Interval := 100; // もっと短くても良いと思います。
end;
procedure wait1000; // 約1000m秒間待つ
var
i:integer;
begin
for i := 1 to 10 do begin
Application.ProcessMessages;
sleep(100);
end;
end;
// データベースモドキ '123'を受け取ると'abc'を返し、それ以外は'Err'を返す。
function DBmodoki(val:string):string;
begin
if val = '123' then result := 'abc' else result := 'Err';
end;
procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
var Value: string);
begin
beep; // このイベントが発生したことを確認するため。本来不要
wait1000; // もし暴走した時に暴走を緩やかにするため。本来不要
if ACol = 1 then begin
Value := DBmodoki(StringGrid1.Cells[0,ARow]);
Timer1.Enabled := true; // TTimerにTabキーを押させる
end;
end;
// ↓がミソです。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
StringGrid1.Perform(WM_KEYDOWN, VK_TAB, 1);
StringGrid1.Perform(WM_KEYUP, VK_TAB, 1);
end;
end.
============================================
以下の例は無限ループになります。
if ACol = 1 then begin
StringGrid1.Cells[1,ARow] := DBmodoki(StringGrid1.Cells[0,ARow]);
Timer1.Enabled := true; // TTimerにTabキーを押させる
end;
キャレット(カーソル)があるセルに対してコードで文字を書き込むとループします。
StringGridからフォーカスを奪うShowmessage()等もループします。
もし、Showmessage()を使いたい場合はTimerにShowmessage()のコードを書きます。
|