2013-03-28 41 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