線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2123
推到 Plurk!
推到 Facebook!

DBEdit如何讓Datetime時間為00:00:00顯示出來?

答題得分者是:GrandRURU
pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-11-05 11:50:01 IP:211.75.xxx.xxx 未訂閱
請問大家

資料表中有一個型態為DateTime的欄位, 有二筆如下的資料, 第一筆在DBEdit只顯示2003/03/03, 第二筆顯示為正常
2003/03/03 00:00:00
2014/06/17 17:00:00

請問有遇到類似經驗的前輩, 怎麼讓第一筆正常顯示為2003/03/03 00:00:00
謝謝撥空指導

附件是測試的小程式

環境Delphi7
附加檔案:563ad1e99fc97_DBEdit.zip
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-11-05 13:26:58 IP:59.120.xxx.xxx 未訂閱
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
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-11-05 14:12:14 IP:211.75.xxx.xxx 未訂閱
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
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-11-05 15:27:51 IP:59.120.xxx.xxx 未訂閱
剛試了一下,在 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
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-11-05 16:53:56 IP:211.75.xxx.xxx 未訂閱
謝謝你提供協助

用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.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-11-05 17:16:23 IP:220.136.xxx.xxx 未訂閱
我不知道你使用的版本為何,
在Delphi年代, 只要在 on create 一開始加入應該可以直接改變系統格式

// 設定日期格式
LongTimeFormat:= 'HH:mm:ss';
ShortDateFormat:='yyyy/MM/dd';
DateSeparator:='/';
bestlong
站務副站長


發表:125
回覆:734
積分:506
註冊:2002-10-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-11-05 17:40:43 IP:210.242.xxx.xxx 訂閱
請將顯示格式設定在 ClientDataSet1 的 Date1 欄位的 DisplayFormat 屬性
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
tick228
中階會員


發表:1
回覆:28
積分:55
註冊:2003-11-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2015-11-05 18:59:58 IP:175.96.xxx.xxx 訂閱
要變更 Field 的 Property, 需於 Dataset Open 後, 變更才有作用.

請於 Dataset.AfterOpen Event 加入此行試試

TDateTimeField(DBEdit.Field).DisplayFormat := 'yyyy/MM/dd hh:mm:ss';
pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2015-11-06 09:18:45 IP:211.75.xxx.xxx 未訂閱
謝謝大家的回覆,

不過上述幾個方式, 依然只有手動按鈕去設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
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2015-11-06 10:22:06 IP:59.120.xxx.xxx 未訂閱
那如果利用 TDataSourceDataChange 來觸發這個指令,是否可以做到呢?

===================引 用 pedro 文 章===================
謝謝大家的回覆,

不過上述幾個方式, 依然只有手動按鈕去設DisplayFormat有效

...43...
pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2015-11-06 11:25:49 IP:211.75.xxx.xxx 未訂閱
在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
站務副站長


發表:125
回覆:734
積分:506
註冊:2002-10-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2015-11-09 11:33:39 IP:210.242.xxx.xxx 訂閱
我在 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
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2015-11-10 10:55:08 IP:211.75.xxx.xxx 未訂閱
Hi bestlong,

我測的情況也是這樣, 不曉得是不是只有DBEdit才會這樣?
另外用DBMemo也會套用格式
===================引 用 bestlong 文 章===================
我在 D5 D7 兩個環境,僅單純設定欄位的 DisplayFormat 屬性

用 DBEdit 顯示就沒有套用格式,但 DBGrid 顯示就有套用,然後在 DBGrid 移動資料指標 DBEdit 才開始套用格式
若用 DBText 顯示就有套用格式化
另外用 EhLib 的 DBEdit 元件測試顯示也有套用
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2015-11-10 16:10:21 IP:59.120.xxx.xxx 未訂閱
我想這絕對是萬年bug!
===================引 用 pedro 文 章===================
Hi bestlong,

我測的情況也是這樣, 不曉得是不是只有DBEdit才會這樣?
另外用DBMemo也會套用格式
===================引 用 bestlong 文 章===================
我在 D5 D7 兩個環境,僅單純設定欄位的 DisplayFormat 屬性

用 DBEdit 顯示就沒有套用格式,但 DBGrid 顯示就有套用,然後在 DBGrid 移動資料指標 DBEdit 才開始套用格式
若用 DBText 顯示就有套用格式化
另外用 EhLib 的 DBEdit 元件測試顯示也有套用
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#15 引用回覆 回覆 發表時間:2015-11-10 22:28:07 IP:118.169.xxx.xxx 未訂閱
那就自己繼承TDBEdit, 一個新的TxDBEdit 把 format 功能加進來吧!
dkjfso
一般會員


發表:3
回覆:21
積分:4
註冊:2005-09-11

發送簡訊給我
#16 引用回覆 回覆 發表時間:2016-02-26 14:48:54 IP:203.68.xxx.xxx 訂閱
追了一下D7的DB.pas源碼
procedure TDateTimeField.GetText(var Text: string; DisplayText: Boolean);
var
F: string;
D: TDateTime;
begin
if GetValue(D) then
begin
if DisplayText and (FDisplayFormat <> '') then
F := FDisplayFormat
else
case DataType of
ftDate: F := ShortDateFormat;
ftTime: F := LongTimeFormat;
end;
DateTimeToString(Text, F, D);
end else
Text := '';
end;


第1點是DataType它是ftDateTime,所以F沒東西時,DateTimeToString出來就變那樣

第2是如果
TDateTimeField(DBEdit1.DataSource.DataSet.Fields[0]).DisplayFormat := 'yyyy/MM/dd hh:mm:ss';
寫在FormOnCreate裡
在雖有FDisplayFormat 的情況下
顯示時看Call Stack Window是由
TDBEdit.DataChange呼叫TField.GetEditText呼叫TDateTimeField.GetText('', false); //第二個參數為false,所以也不會跑F := FDisplayFormat這一句
而按了Button來執行DisplayFormat的情況下
看到Call Stack Window是由
TDBEdit.DataChange呼叫TField.GetDisplayText呼叫 TDateTimeField.GetText('', true); //第二個參數為true,所以就會跑F := FDisplayFormat這一句
於是問題應該在TDBEdit.DataChange的流程中
在DBCtrls.pas 中的
procedure TDBEdit.DataChange(Sender: TObject);
其中
if FFocused and FDataLink.CanModify then
Text := FDataLink.Field.Text
else
begin
EditText := FDataLink.Field.DisplayText;
if FDataLink.Editing and FDataLink.FModified then
Modified := True;
end;
發現當 FFocused 的時候,它是會取Text,不會取DisplayText
這也就說明了為什麼按了按鈕當下,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, 註解 無‧
系統時間:2017-11-20 12:04:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!