Delphi5からDelphi2005.NETにコンバートをしています。
以下の場所でnull参照エラーがでます。
原因と解決策をどなたか教えてください。おねがいします。
procedure TfrmMainform.FormCreate(Sender: TObject);
begin
dlg := Tdlg.Create(Application);
try
dlg.ShowModal;←★ここでエラー
finally
dlg.Release;
end;
end;
コンストラクタの作成方法が間違っているからでしょうか?
現在は【新】になっています。
【旧】ロジックで実行すると①でヌル参照になってしまったので
【新】ロジックに変更したのですが、やはりそれが原因でしょうか?
------------------------------------------------------------
Tdlg = class(TForm)
private
FBitmap: TBitmap;
public
constructor Create(AOwner: TComponent); override;
end;
------------------------------------------------------------
【旧】
constructor Tdlg.Create(AOwner: TComponent);
begin
inherited Create(AOwner);←①
FBitmap := TBitmap.Create;
end;
【新】
constructor Tdlg.Create(AOwner: TComponent);
begin
FBitmap := TBitmap.Create;
inherited Create(AOwner);
end;
私の所では再現しません。
新旧ともに正常に動きます。
Windows XP SP1
Delphi2005 Update3+非公式パッチ+FastMMです。
なんともいえませんが、
全体の作り方によってありえますね
FBitmap: TBitmap;
これが TfrmMainform のメンバーだとすれば
inherited Create; の前に書けば
親が Nil 状態なので
FBitmap が存在しない可能性があります。
FBitmapはTfrmMainform のメンバーではなく、Tdlgのメンバーです。
コンストラクタ作成部分の基本形は、
inherited create してから自分のメンバーの設定をする、
という流れでよいのですよね?
【旧】はその基本形にそっているのになぜいけないのかが分かりません。
ただ、気になる点としては、TfrmMainform自体のコンストラクタ作成部分で
inherited create(AOwner)の呼び出し位置を変えてしまっていることです。
-->>
constructor TfrmMainform.Create(AOwner: TComponent);
begin
inherited Create(AOwner);←今はここに変えた
FXXXX1 := XXX;//TfrmMainformのメンバーの設定
:
inherited Create(AOwner);←元はここにあった
:
end;
--<<
このせいでしょうか。
デバッグしたところ、以下のような処理順序になっていました。
--->>
①constructor TfrmMainform.Create(AOwner: TComponent);の
inherited Create(AOwner);まで
②procedure TfrmMainform.FormCreate(Sender: TObject);
③constructor TfrmMainform.Create(AOwner: TComponent);の
inherited Create(AOwner);以降の処理
---<<
dlg.ShowModalは②内で行っているのですが、③の部分を通らないまま
その処理に移ってしまっているのが原因だと判断。
②内の処理を別メソッドにし、③後に呼ばれるように修正すると
エラーはでなくなりました。
ツイート | ![]() |