私は Delphi 7 のプロジェクトに取り組んでいますが、言語やランタイムにあまり詳しくありません。フォームが表示されて描画されるなどの問題をデバッグしようとしていますが、何らかの理由で OnShow イベントが呼び出されません。これはどのような場合に起こりますか?正確にどこを見ればいいですか?
5 に答える
私にとって理にかなっている唯一の説明は、OnShow イベントがハンドラーに正しく接続されていないということです。Object Inspector または .dfm フォームをチェックインします。コードで接続している場合は、十分に早い段階で接続するようにしてください。
ここでチェックする必要があります
最初の OnShow() を宣言する必要があります。
type
TForm2 = class(TForm)
procedure FormShow(Sender: TObject); // <--- IM HERE!
private
{ Private declarations }
public
{ Public declarations }
end;
第二に...
implementation
{$R *.dfm}
procedure TForm2.FormShow(Sender: TObject); <--- IM HERE!
begin
//this time will trigger
end;
最後に、FormShow イベントの Dfm ルックを開く必要があります。
object Form2: TForm2
Left = 0
Top = 0
Caption = 'Form2'
ClientHeight = 284
ClientWidth = 418
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnShow = FormShow <--- IM HERE! without this it will not trigger the OnFormShow
PixelsPerInch = 96
TextHeight = 13
end
それでもうまくいかない場合は、他の関数名 OnShow = FormStart またはこれまでの関数名を参照している可能性があります。
OnShow イベントが呼び出されない場合、フォームが表示される場合にもう 1 つの可能性があります
ShowWindow(Form.Handle, SW_SHOW);
過去にプロジェクトを調べているときにそのようなことを見ましたが、それは Delphi にとって本当に悪い考えです。
フォームがロードされたときに何かを行いたい場合、およびすべてのコンポーネントが初期化されていることを確認したい場合は、loaded を使用できます。
protected
procedure Loaded; override;
フォームの作成中に呼び出されます。
OnActivate で発生する可能性のあるフォームの構築に時間がかかることなく、フォームが初期化されてポップアップするという追加の利点があります。
オブジェクトインスペクターを使用して設定された OnShow ハンドラーが呼び出されなかったときに同様の問題が発生しました。プログラムの実行中に別のハンドラーが割り当てられ、設定が上書きされていることがわかりました。そのため、コードで OnShow への割り当ての可能性を探すこともできます。