-1

fmMain と fmEmpl という 2 つのフォームがあります。両方とも、sbMain および sbEmpl と呼ばれるそれぞれの TStatusBar を持っています。データベース コンポーネントを格納する dmData という TDataModule があります。

セル グリッドが強調表示されたときにデータベースからの実際の値を表示できるように、sbEmpl パネルを更新する必要があります。TClientDataSet の OnAfterScroll ハンドラを使用してこのイベントを処理しようとしましたが、fmEmpl ではなく、fmMain でのみ動作します。sbEmpl パネルを更新しようとすると、常にエラー メッセージが表示されます。これはメッセージです:

Access violation at address 00405337 in module 'SpeZet.exe'. Read of address 0000038C.

一方、dmData には両方のヘッダー (.h) が含まれています。

TStatusBar のどこが悪いのでしょうか?

何か案が?

よろしくお願いします。

編集:わかりました、ここにコードがあります:

void __fastcall TdmData::cdsEmplAfterScroll(TDataSet *DataSet)
{

    vEmpl = "Name = " +
            dmData->cdsEmpl->FieldByName("Name")->AsString +
            " | idEmployee = " +
            dmData->cdsEmpl->FieldByName("idEmployee")->AsInteger +
            " | idJob  = " +
            dmData->cdsEmpl->FieldByName("idJob")->AsInteger;

    fmMain->sbMain->SimplePanel = true;
    fmMain->sbMain->SimpleText = vEmpl;
    fmEmpl->sbEmpl->SimplePanel = true;
    fmEmpl->sbEmpl->SimpleText = vEmpl;
}

「アクセス違反」メッセージは、次の行で発生します。

fmEmpl->sbEmpl->SimplePanel = true;
fmEmpl->sbEmpl->SimpleText = vEmpl;
4

2 に答える 2

2

ほとんどの場合、データモジュールには fbEmpl フォームへの有効なポインターがありません。

于 2013-03-29T20:47:38.273 に答える
0

最後に、この記事に基づいて、この問題を解決しました。dmData が fmEmpl の前に作成されることに気付かなかったので、fmEmpl にアクセスしようとすると「アクセス違反」エラー メッセージが表示されます。

fmEmpl が作成されたかどうかを確認する簡単な条件を作成します。これは条件です:

if (fmEmpl != NULL) {
    sbEmpl->SimplePanel = true;
    sbEmpl->SimpleText = sData;
}

これで、dmData から直接 sbEmpl にアクセスして更新できるようになりました。

ありがとう。

于 2013-04-02T09:41:55.833 に答える