DBEdit如何讓Datetime時間為00:00:00顯示出來? |
答題得分者是:GrandRURU
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
請問大家
資料表中有一個型態為DateTime的欄位, 有二筆如下的資料, 第一筆在DBEdit只顯示2003/03/03, 第二筆顯示為正常 2003/03/03 00:00:00 2014/06/17 17:00:00 請問有遇到類似經驗的前輩, 怎麼讓第一筆正常顯示為2003/03/03 00:00:00 謝謝撥空指導 附件是測試的小程式 環境Delphi7 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
DBEdit 是依賴 TDateTimeField.DisplayFormat 做顯示的
所以應該要怎麼寫 TDateTimeField(DBEdit.DataSource.DataSet.FieldByName(DBEdit.FieldName)).DisplayFormat := 'yyyy/MM/dd hh:mm:ss'; 以上 ===================引 用 pedro 文 章=================== 請問大家 資料表中有一個型態為DateTime的欄位, 有二筆如下的資料, 第一筆在DBEdit只顯示2003/03/03, 第二筆顯示為正常 2003/03/03 00:00:00 2014/06/17 17:00:00 請問有遇到類似經驗的前輩, 怎麼讓第一筆正常顯示為2003/03/03 00:00:00 謝謝撥空指導 附件是測試的小程式 環境Delphi7 |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
Hi GrandRURU,
我有在欄位編輯器該欄位的DisplayFormat設成yyyy/MM/dd hh:mm:ss 或是在FormCreate裡設 TDateTimeField(DBEdit.DataSource.DataSet.FieldByName(DBEdit.FieldName)).DisplayFormat := 'yyyy/MM/dd hh:mm:ss'; 結果一樣, 還是出不來 ===================引 用 GrandRURU 文 章=================== DBEdit 是依賴 TDateTimeField.DisplayFormat 做顯示的 所以應該要怎麼寫 TDateTimeField(DBEdit.DataSource.DataSet.FieldByName(DBEdit.FieldName)).DisplayFormat := 'yyyy/MM/dd hh:mm:ss'; 以上 ===================引 用 pedro 文 章=================== 請問大家 資料表中有一個型態為DateTime的欄位, 有二筆如下的資料, 第一筆在DBEdit只顯示2003/03/03, 第二筆顯示為正常 2003/03/03 00:00:00 2014/06/17 17:00:00 請問有遇到類似經驗的前輩, 怎麼讓第一筆正常顯示為2003/03/03 00:00:00 謝謝撥空指導 附件是測試的小程式 環境Delphi7 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
剛試了一下,在 FormCreate, FormShow, FormActivate 使用這程式碼都會無效
不過如果是用 Button 人工去按,格式是會改變的 這其中到底發生什麼奇怪的事,我就不知道了 可能又是一個默默的 Bug 吧? 另一個作法可以試著使用 ShortDateFormat 來改變系統的時間顯示 ===================引 用 pedro 文 章=================== Hi GrandRURU, 我有在欄位編輯器該欄位的DisplayFormat設成yyyy/MM/dd hh:mm:ss 或是在FormCreate裡設 TDateTimeField(DBEdit.DataSource.DataSet.FieldByName(DBEdit.FieldName)).DisplayFormat := 'yyyy/MM/dd hh:mm:ss'; 結果一樣, 還是出不來 |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
謝謝你提供協助
用ShortDateTime方式第二筆會顯示成 2014/06/17 17:00:00 下午 05:00:00 Button1Click去更改是有效的, 確實太神奇了 這下子有學問了, 不知道有沒有其他人可解釋其中奧妙? [code delphi] procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(ShortDateFormat); ClientDataSet1.CreateDataSet; ClientDataSet1.AppendRecord([StrToDateTime('2003/03/03 00:00:00')]); ClientDataSet1.AppendRecord([StrToDateTime('2014/06/17 17:00:00')]); end; procedure TForm1.Button1Click(Sender: TObject); begin ClientDataSet1Date1.DisplayFormat:='yyyy/MM/dd hh:mm:ss'; end; procedure TForm1.Button2Click(Sender: TObject); begin ShortDateFormat:='yyyy/MM/dd hh:mm:ss'; end; [/code] ===================引 用 GrandRURU 文 章=================== 剛試了一下,在 FormCreate, FormShow, FormActivate 使用這程式碼都會無效 不過如果是用 Button 人工去按,格式是會改變的 這其中到底發生什麼奇怪的事,我就不知道了 可能又是一個默默的 Bug 吧? 另一個作法可以試著使用 ShortDateFormat 來改變系統的時間顯示 ===================引 用 pedro 文 章=================== Hi GrandRURU, 我有在欄位編輯器該欄位的DisplayFormat設成yyyy/MM/dd hh:mm:ss 或是在FormCreate裡設 TDateTimeField(DBEdit.DataSource.DataSet.FieldByName(DBEdit.FieldName)).DisplayFormat := 'yyyy/MM/dd hh:mm:ss'; 結果一樣, 還是出不來 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
|
tick228
高階會員 發表:1 回覆:47 積分:104 註冊:2003-11-03 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
謝謝大家的回覆,
不過上述幾個方式, 依然只有手動按鈕去設DisplayFormat有效 procedure TForm1.FormCreate(Sender: TObject); begin // ShowMessage(ShortDateFormat); LongTimeFormat:= 'HH:mm:ss'; ShortDateFormat:='yyyy/MM/dd'; DateSeparator:='/'; ClientDataSet1.CreateDataSet; ClientDataSet1.AppendRecord([StrToDateTime('2003/03/03 00:00:00')]); ClientDataSet1.AppendRecord([StrToDateTime('2014/06/17 17:00:00')]); end; procedure TForm1.ClientDataSet1AfterOpen(DataSet: TDataSet); begin TDateTimeField(DBEdit1.Field).DisplayFormat := 'yyyy/MM/dd hh:mm:ss'; end; procedure TForm1.Button1Click(Sender: TObject); begin //只有此行有效果 ClientDataSet1Date1.DisplayFormat:='yyyy/MM/dd hh:mm:ss'; end; |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
在DataChange依然無效
最後我試出在欄位的GetText用程式自定義轉換, 這種方式應該可行 procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin // 無效 ClientDataSet1Date1.DisplayFormat:='yyyy/MM/dd hh:mm:ss'; end; procedure TForm1.ClientDataSet1Date1GetText(Sender: TField; var Text: String; DisplayText: Boolean); begin //有效 Text:=FormatDateTime('yyyy/MM/dd hh:mm:ss',Sender.AsDateTime); end; ===================引 用 GrandRURU 文 章=================== 那如果利用 TDataSourceDataChange 來觸發這個指令,是否可以做到呢? ===================引 用 pedro 文 章=================== 謝謝大家的回覆, 不過上述幾個方式, 依然只有手動按鈕去設DisplayFormat有效 ...43... |
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
我在 D5 D7 兩個環境,僅單純設定欄位的 DisplayFormat 屬性
用 DBEdit 顯示就沒有套用格式,但 DBGrid 顯示就有套用,然後在 DBGrid 移動資料指標 DBEdit 才開始套用格式 若用 DBText 顯示就有套用格式化 另外用 EhLib 的 DBEdit 元件測試顯示也有套用
------
http://blog.bestlong.idv.tw/ http://www.bestlong.idv.tw/ http://delphi-ktop.bestlong.idv.tw/ |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
Hi bestlong,
我測的情況也是這樣, 不曉得是不是只有DBEdit才會這樣? 另外用DBMemo也會套用格式 ===================引 用 bestlong 文 章=================== 我在 D5 D7 兩個環境,僅單純設定欄位的 DisplayFormat 屬性 用 DBEdit 顯示就沒有套用格式,但 DBGrid 顯示就有套用,然後在 DBGrid 移動資料指標 DBEdit 才開始套用格式 若用 DBText 顯示就有套用格式化 另外用 EhLib 的 DBEdit 元件測試顯示也有套用 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
我想這絕對是萬年bug!
===================引 用 pedro 文 章=================== Hi bestlong, 我測的情況也是這樣, 不曉得是不是只有DBEdit才會這樣? 另外用DBMemo也會套用格式 ===================引 用 bestlong 文 章=================== 我在 D5 D7 兩個環境,僅單純設定欄位的 DisplayFormat 屬性 用 DBEdit 顯示就沒有套用格式,但 DBGrid 顯示就有套用,然後在 DBGrid 移動資料指標 DBEdit 才開始套用格式 若用 DBText 顯示就有套用格式化 另外用 EhLib 的 DBEdit 元件測試顯示也有套用 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
dkjfso
一般會員 發表:3 回覆:21 積分:4 註冊:2005-09-11 發送簡訊給我 |
追了一下D7的DB.pas源碼
TDateTimeField(DBEdit1.DataSource.DataSet.Fields[0]).DisplayFormat := 'yyyy/MM/dd hh:mm:ss';
寫在FormOnCreate裡在雖有FDisplayFormat 的情況下 顯示時看Call Stack Window是由 TDBEdit.DataChange呼叫TField.GetDisplayText呼叫 TDateTimeField.GetText('', true); //第二個參數為true,所以就會跑F := FDisplayFormat這一句
於是問題應該在TDBEdit.DataChange的流程中在DBCtrls.pas 中的 if FFocused and FDataLink.CanModify then
發現當 FFocused 的時候,它是會取Text,不會取DisplayTextText := FDataLink.Field.Text else begin EditText := FDataLink.Field.DisplayText; if FDataLink.Editing and FDataLink.FModified then Modified := True; end; 這也就說明了為什麼按了按鈕當下,FFocused 變成 false 就可以正常顯示DisplayText了 其實只要焦點不在TDBEdit上就都能正常顯示 TDateTimeField(DBEdit1.DataSource.DataSet.Fields[0]).DisplayFormat := 'yyyy/MM/dd hh:mm:ss';
這句寫在OnFormCreate也沒關係源碼這樣設計的考量是TDBEdit取得焦點時 有可能使用者要修改它的內容 所以要顯示回實際數據的樣貌 亦不完全是個bug
編輯記錄
dkjfso 重新編輯於 2016-02-26 15:43:18, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |