2014-05-20 53 views
3

我有一個相當奇怪的問題,我有哪些問題找到文檔。我有一個使用Delphi內置的TDBMemo組件的Delphi程序,因爲組件需要從數據庫中的字段中提取數據。用戶還必須能夠編輯這些信息,即將信息添加到組件的字段。文字輸入至該字段可見且不會消失;然而,那是不是我的問題。德爾福XE:TDBMemo文本消失

該表單爲用戶提供了從列表中發佈預定義評論的選項,該列表可以通過TBitButton觸發的彈出窗口等效訪問;但是,一旦將所選文本添加到TDBMemo並且用戶在任何地方單擊,則添加的值將消失 - 再次,不是鍵入的文本。

下面是分配的代碼:

var NoteString: String; 
if DBMemo1.Text <> '' then 
begin 
    NoteString := frmSelectNoteCodeView.GetTextfromField + ' - ' + User.ID 
     + ' on ' + FormatDateTime('mm/dd/yyyy', Now); 
    DBMemo1.Text := dbedComments.Text + #13#10 + NoteString; 
end; 

這是有意一個代碼片段(如果該字段是空白,該值剛分配)。我發佈了這段代碼片段,因爲我認爲這是問題所在,即TDBMemo不能使用常規分配?

這是事情:沒有事件處理用戶點擊。關於爲什麼發佈文字消失的任何想法?

+6

TDBMemo組件是一個數據感知控件,意味着它從連接的數據集字段獲取它顯示的數據。你正在努力做一個最終的嘗試。在你的情況下,我會做的是將數據集置於編輯模式,然後將想要的文本分配給備註從其獲取數據的字段。完成後,調用Dataset.Post,或將數據集保持在編輯模式,並提示用戶完成編輯並將編輯發佈到數據集。 – MartynA

+0

@MartynA您應該發佈一個答案:o) –

回答

7

正如我在我的評論中所說的,TDBMemo是一個數據感知控件,意味着它被設置爲顯示數據集中相關字段的文本;你不能只爲它的文本屬性填充一個值,因爲任何時候TDBMemo被告知自己刷新(通過它的TDatalink),它會從字段中檢索文本,覆蓋你認爲分配給它的任何東西。

我會做這樣的事情

var 
    ADataSet : TDataSet; 
begin 
    ADataSet := DBMemo1.DataSource.DataSet; //just to reduce typing 
    if not (ADataSet.State in [dsInsert, dsEdit) then 
    ADataSet.Edit; 
ADataSet.FieldByName(DBMemo1.FieldName).AsString := 'your text goes here'; 
ADataSet.Post; 
end; 

或者你可以把它留給用戶來電來郵。

如果.Post處於finally塊,可能會更好。

順便說一句,你的問題來自Delphi的db-aware框架嚴格控制db顯示控件的屏幕顯示。一般來說,這會與您試圖直接改變這些控件顯示的內容對抗;如果要更改數據集數據,請更改它,而不是關聯的控件顯示的內容。

+0

發佈後是否需要關閉'ADataSet' 'ADataSet.Close'? – Thomas

+1

取決於您使用的數據庫後端。如果它是客戶端服務器(例如Sql Server),那麼不是,因爲您可以依靠服務器將更改提交到數據庫。但是,如果它是基於文件的數據庫(用戶直接寫入數據庫文件),那麼關閉數據集會增加實際寫入數據庫文件的更改機會。無論如何,無論您的數據庫是基於客戶端服務器還是基於文件的數據庫,最好在您使用完數據集後關閉數據集。畢竟,如果你一直在做它的I/O,你不會打開一個文件。 – MartynA