Modalにする際には?

解決


Moda  2003-02-08 01:01:16  No: 2835

単独のプロジェクトでは問題なく実行できるのですが、
いくつかのソースを用いてModalにして行うとできません。
その際のエラーメッセージが、EAccessViolationと出ます。
メモリに不正にアクセスしたためだというのはわかるのですが、
対処法がわかりません。
どうやら間違っていそうなところはわかりましたが、単独で行ったときにはエラーが出ませんでした。

Label2.Caption→TOPOGRAPHIC.Label2.Caption
  単独                Modalにして行うとき

いくつかのソースを用いて作る場合にはLabelの前にForm名をつけますよね?
Modalにするときの設定がまずいのでしょうか?

↓作るときのソース
TOPOGRAPHIC := TTOPOGRAPHIC.Create(Application);
          TOPOGRAPHIC.ShowModal;
          TOPOGRAPHIC.Free;


にしの  2003-02-08 04:26:06  No: 2836

どのタイミングでラベルを参照していますか?


Moda  2003-02-08 04:51:30  No: 2837

にしのさんありがとうございます。
Form.Create→TBitmap.Createを行ってからです。
また、Form.Canvas.Draw(x,y,Bitmap)でもエラーが出ます。
BitmapはHeight,Width指定しています。


にしの  2003-02-08 05:54:29  No: 2838

OnCreateイベントでなく、OnShowイベントで処理してみてください。
OnShowイベントでだめなら、OnActivateイベントなどで処理してみてください。


Moda  2003-02-09 01:42:44  No: 2839

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;


にしの  2003-02-09 02:00:59  No: 2840

LINEは、フォームのprivateなプロシージャにしてみてください。


Moda  2003-02-09 02:24:37  No: 2841

LINEをprivateにして実行しましたが結果は変わりませんでした。
毎回’ソースファイルが見つかりません(Graphics.pas)’とメッセージが出てから
EAccessViolationとなります。


にしの  2003-02-09 02:50:50  No: 2842

示されたソースをこちらでテストするとエラーにはなりません。
別な場所に問題があると思われます。
> 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;
としなければならなかったことがあります。もしかしたら関係ないかもしれません。


Moda  2003-02-09 03:29:58  No: 2843

Bitmapがいたるところで定義が重なっていました。
初歩的なミスに気づかずつき合わせてしまってすいません。
おかげで助かりました。にしのさんどうもありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加