掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Releaseしたのに「Formが使われている」となる? (ID:30722)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Form2をReleaseした後でないと、再度Createできないはずなのに 「コンポーネント名 Form2 はすでに使われています」でエラーになります。 (1) アプリケーションがActiveになる時に、TCommXのオープンを行っています。 (親となるシステムでもQRコードリーダーを使っている為) (2) アプリケーションがDeActiveになる時に、TCommXのクローズを行っています。 (3) Form2はエラーが発生したプログラムと並行に実行可能なプログラムでも共有しています。 (4) TCommXのオープン、クローズを行わない場合はエラーが発生しない様です。 (5) エラーが発生する場合と発生しない場合があります。 上記以外のエラーの発生する条件がわかっていません。 また、エラーはプログラムの提供先でのみ発生しているのでエラーが発生しているタイミングもわかっていません。 エラーを回避する方法等、おわかりの方いらっしゃいましたら、ご教授お願いします。 以下がソース(サンプル)です。よろしくお願いします。 TFrom1 = class(TForm) //省略 CommX1: TCommX; //省略 private //省略 function ComPortOpen: Boolean; public procedure ActivateProc(Sender: TObject); procedure DeActivateProc(Sender: TObject); end; //============================================================================== // Form1 //============================================================================== procedure TForm1.FormShow(Sender: TObject); begin Application.onfiltered= ActivateProc; //アプリがアクティブになった場合の処理 Application.onfiltered= DeActivateProc; //アプリがアクティブでなくなった場合の処理 QRComFlg := True; //QRを利用するかどうかの設定を持つのであれば、このフラグで切替え if not ComPortOpen then QRComFlg := False; end; //----------------------------------------------------------- procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DeActivateProc(Self); end; //============================================================================== // QR制御 //============================================================================== procedure TForm1.ActivateProc(Sender: TObject); begin if QRComFlg then begin try ComPortOpen; except QRComFlg := False; end; end; end; //---------------------------------------------------------- procedure TForm1.DeActivateProc(Sender: TObject); begin if QRComFlg then begin CommX1.PortClose; end; end; //----------------------------------------------------------- // QRポートオープン //----------------------------------------------------------- function TForm1.ComPortOpen: Boolean; begin CommX1.ClearReceiveBuf; Result := True; CommX1.PortClose; try CommX1.PortNo := //省略; CommX1.BitRate := //省略; Commx1.CharSize := //省略; Commx1.ParityBit := //省略; Commx1.StopBit := //省略; Commx1.FlowCtrl := //省略; CommX1.PortOpen; except Result := False; end; end; //============================================================================== // Form2の表示 //============================================================================== function TForm1.Button1Click(Sender: TObject) begin //Button1クリック前のControlにSetFocus Button1.Enabled := False; Form2 := TForm2.Create(Application); try //省略 Form2.ShowModal; //省略 finally Form2.Release; Button1.Enabled := True; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.