2013-03-28 66 views
-1

我有两种叫做fmMain和fmEmpl的形式。两个都有每个TStatusBar调用sbMain和sbEmpl。我有一个名为dmData的TDataModule来存储数据库组件。TStatusBar有什么问题?

我需要更新sbEmpl板因此它可以在单元网格的突出显示从数据库中显示的实际值。我一直试图使用TClientDataSet的OnAfterScroll处理程序来处理这个事件,但它只是在fmMain上工作,而不是在fmEmpl上工作。如果我尝试更新sbEmpl面板,它总会引发错误消息。这是消息:

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

鉴于,我已经在dmData上包括两个头(.h)。

用什么去TStatusBar错在这里?

有什么想法?

提前感谢了很多。

编辑:好,这里是代码:

fmEmpl->sbEmpl->SimplePanel = true; 
fmEmpl->sbEmpl->SimpleText = vEmpl; 
+0

代码将有助于诊断此问题。 – 2013-03-29 14:53:47

+0

@GregorBrandt好吧,我已经交了代码..在此先感谢.. – Andromeda 2013-04-01 05:24:18

+0

被fmEmpl在应用程序主创造出来的?检查FmEmpl的值是否为NULL? – 2013-04-01 14:30:22

回答

2

最大的可能是你的数据模块没有一个有效的:

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

“访问冲突” 的消息在引发线指向您的fbEmpl表单的指针。

+0

我已经添加在dmData.cpp的顶部。“#包括‘uEmployee.h’线路已被处理指针安装在fmEmpl所有组件的头文件? – Andromeda 2013-04-01 05:27:54

+0

头文件只是帮助你的数据模块明白这是什么uEmployee你在哪里创建了你的表单(用fmEmpl = new ....)? – Riho 2013-04-01 07:19:29

+0

我从编译器菜单中选择File >> New >> Form-C++ Builder手动创建fmEmpl .. – Andromeda 2013-04-01 07:25:45

0

最后,基于this article,我必须解决这个问题..我没注意到dmData是fmEmpl之前,所以它会引发任何“访问冲突”错误消息时,我尝试访问fmEmpl创建。

我做检查简单的条件,如果fmEmpl创建或还没有。这是条件:

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

现在,我可以访问和直接从dmData更新sbEmpl。

谢谢。

+0

当@Riho是第一个正确的人时,你将自己的答案标记为正确,我在问题的评论部分提问。您没有有效的指针,导致错误。 – 2013-04-02 14:52:04

+0

@GregorBrandt好的,我已更正了我的标记..我没有真正注意到Riho的答案与我自己的答案有关。请取消您的减号。谢谢。 – Andromeda 2013-04-03 03:11:35

+0

无法删除,它已经23小时,现在被锁定,除非你编辑答案。 – 2013-04-03 14:45:36