単独のプロジェクトでは問題なく実行できるのですが、
いくつかのソースを用いてModalにして行うとできません。
その際のエラーメッセージが、EAccessViolationと出ます。
メモリに不正にアクセスしたためだというのはわかるのですが、
対処法がわかりません。
どうやら間違っていそうなところはわかりましたが、単独で行ったときにはエラーが出ませんでした。
Label2.Caption→TOPOGRAPHIC.Label2.Caption
単独 Modalにして行うとき
いくつかのソースを用いて作る場合にはLabelの前にForm名をつけますよね?
Modalにするときの設定がまずいのでしょうか?
↓作るときのソース
TOPOGRAPHIC := TTOPOGRAPHIC.Create(Application);
TOPOGRAPHIC.ShowModal;
TOPOGRAPHIC.Free;
どのタイミングでラベルを参照していますか?
にしのさんありがとうございます。
Form.Create→TBitmap.Createを行ってからです。
また、Form.Canvas.Draw(x,y,Bitmap)でもエラーが出ます。
BitmapはHeight,Width指定しています。
OnCreateイベントでなく、OnShowイベントで処理してみてください。
OnShowイベントでだめなら、OnActivateイベントなどで処理してみてください。
OnShow,OnActivateともに試してみましたができませんでした。
他にOnClickなど試せるものは試したのですが無理でした。
何かプログラム内容にまずいところがあるとしか考えられません。
プログラムは下のような感じです。
implementation
uses FbiAd,FbiDa,ELMAPS,ISGRS,STM2,VSELMAPS,VSGRS,
ROUGH_R,SPEED_R,SPEED_R_C,SXY_R,TLOOP_R;
procedure LINE;
var i,j:Integer;
begin //if (IGR AND 16) = 0 then LINE;
TOPOGRAPHIC.Label10.Caption := FloatToStr(SC); //CURRENT
//Bitmapの作成
Bitmap3 := TBitmap.Create;
Bitmap3.Width := 600;
Bitmap3.Height := 330;
Bitmap3.Canvas.Pen.Color := clWhite;
Bitmap3.Canvas.MoveTo(16,80);Bitmap3.Canvas.LineTo(616,80);
//途中省略
OPOGRAPHIC.Canvas.Draw(16,80,Bitmap3);
Bitmap3.Free;
//Bitmapの作成
Bitmap2 := TBitmap.Create;
Bitmap2.Width := 12;
Bitmap2.Height := 330;
//途中省略
Bitmap2.Canvas.Brush.Color := clBlack;
Bitmap2.Canvas.Rectangle(0,308,12,330);
TOPOGRAPHIC.Canvas.Draw(558,80,Bitmap2);
Bitmap2.Free;
end;
procedure TTOPOGRAPHIC.TOPOGRAPHIC(Sender: TObject);
begin LINE;
end;
LINEは、フォームのprivateなプロシージャにしてみてください。
LINEをprivateにして実行しましたが結果は変わりませんでした。
毎回’ソースファイルが見つかりません(Graphics.pas)’とメッセージが出てから
EAccessViolationとなります。
示されたソースをこちらでテストするとエラーにはなりません。
別な場所に問題があると思われます。
> procedure TTOPOGRAPHIC.TOPOGRAPHIC(Sender: TObject);
> begin LINE;
> end;
この部分はいつ実行しているのですか?
これがOnSHowイベントにあたると考えてよろしいでしょうか。
予想では、変数TOPOGRAPHICに、Formが作成される前に、TOPOGRAPHICを操作しようとしているのだと思いました。
Createが成功した時点で、TOPOGRAPHICに格納されていますよね。
# TOPOGRAPHIC := TTOPOGRAPHIC.Create(Application);
# この部分
privateにして、自分のフォームのラベルやキャンバスを変更する方が安全だと思います。
Graphicsがないというのは、実行時に出るのでしょうか。
ソースが見つからなければコンパイルは失敗し、実行できるのは「コンパイル前の実行ファイル」ということになりますよ。
つまり、ソースの修正は効いていないということになります。
Graphicsがないのであれば、uses節に追加してください。TBitmapを作成するときに必要になります。
もしかしたら、TBitmapは別のところにも定義されているのかもしれません。失念しましたが、前にTBitmapの定義が重なり、
Bitmap := Graphics.TBitmap.Create;
としなければならなかったことがあります。もしかしたら関係ないかもしれません。
Bitmapがいたるところで定義が重なっていました。
初歩的なミスに気づかずつき合わせてしまってすいません。
おかげで助かりました。にしのさんどうもありがとうございます。
ツイート | ![]() |