inherited create でnull参照となってしまう

解決


tomomi  2005-12-10 01:14:05  No: 19167

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;


えーと  2005-12-10 02:45:36  No: 19168

私の所では再現しません。
新旧ともに正常に動きます。

Windows XP SP1
Delphi2005 Update3+非公式パッチ+FastMMです。


どやさ  2005-12-14 01:53:07  No: 19169

なんともいえませんが、
全体の作り方によってありえますね

FBitmap: TBitmap;
これが TfrmMainform のメンバーだとすれば
inherited Create; の前に書けば
親が Nil 状態なので
FBitmap が存在しない可能性があります。


tomo  2005-12-14 19:54:14  No: 19170

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;
--<<

このせいでしょうか。


tomomi  2006-01-11 06:20:31  No: 19171

デバッグしたところ、以下のような処理順序になっていました。
--->>
①constructor TfrmMainform.Create(AOwner: TComponent);の
  inherited Create(AOwner);まで
②procedure TfrmMainform.FormCreate(Sender: TObject);
③constructor TfrmMainform.Create(AOwner: TComponent);の
  inherited Create(AOwner);以降の処理
---<<
dlg.ShowModalは②内で行っているのですが、③の部分を通らないまま
その処理に移ってしまっているのが原因だと判断。
②内の処理を別メソッドにし、③後に呼ばれるように修正すると
エラーはでなくなりました。


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

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






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