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

DateTimePicker 使用上的問題

尚未結案
kate0921
一般會員


發表:14
回覆:19
積分:6
註冊:2004-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-27 14:20:47 IP:203.66.xxx.xxx 未訂閱
1.我想從查詢我所輸入的單筆編號的資料,我是用 Edit 及 BitBtn 來做,那應該怎麼表示呢? 2.我設計的介面有 start_date 及 end_date,但結束時間是未來式,所以新增資料時要為空白,以後結束時再修改填入,但我在新增時它就會自動帶出了耶!請問前輩們該怎麼辦? 時間元件我是用 DateTimePicker .... 謝謝幫忙!! procedure TForm1.DateTimePicker1Change(Sender: TObject); begin ClientDataSet1.FieldByName('start_date').AsDateTime := DateTimePicker1.Date; ClientDataSet1.FieldByName('end_date').AsDateTime := DateTimePicker2.Date; end;
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-27 14:35:24 IP:211.23.xxx.xxx 未訂閱
以查詢方面來說: 您可以考慮下列方式 CLIENTDATASET.Filtered := fALSE; CLIENTDATASET.FILTER := '欄位名稱 =''' EDIT1.TEXT ''''; CLIENTDATASET.FILTERED := TRUE; 在日期來說,因為您將修改動作放在ONCHANGE裡所以只要您更正START_DATE時,也會隨之變動,建議您將 ClientDataSet1.FieldByName('end_date').AsDateTime := DateTimePicker2.Date; 放至TForm1.DateTimePicker2Change裡,或者您可否說明你所要實現的功能面。 讀萬卷書~不如來K.TOP走一遭
kate0921
一般會員


發表:14
回覆:19
積分:6
註冊:2004-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-27 15:44:20 IP:203.66.xxx.xxx 未訂閱
CLIENTDATASET.Filtered := fALSE; CLIENTDATASET.FILTER := '欄位名稱 =''' EDIT1.TEXT ''''; CLIENTDATASET.FILTERED := TRUE; 單獨使用過濾一個欄位沒問題 但若我有三個不同的想過濾查詢呢? 查其他的時又該怎將之前查的消除,才不會變成二個修件查詢,我這三個共用同一個 BitBin 來按下查詢. ====================================================================== 當我游標指到 DBGrid 其中一欄時,我的其他 DBEdit 會顯示和資料一樣的內容,但如何將 DateTimePicker 也可以游標移到哪就顯示那裡的資料? 現在都是固定顯示當天日期 ====================================================================== 我想要 end_date 在新增資料時,先以空白顯示因為結束時間不知為何時 只有在修改資料時才可以輸入資料,謝謝前輩!!
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-27 16:06:08 IP:211.23.xxx.xxx 未訂閱
1.有下列建議,直接利用COMMANDTEXT中下SQL語法作查詢,或為利用FILTER或SETRANGE或LOCATE等方式來獲取您的資料。 2.您可在CLIENTDATASET的AFTERSCROLL中中設定 DateTimePicker1.DATE := CLIENTDATASET.FIELDVALUES['DATE1']; 3.抱歉,DateTimePicker1的用法我不甚熟,有另一提議,您可採用MASKEDIT元件設為日期格式,應可符合您的需求。 讀萬卷書~不如來K.TOP走一遭
kate0921
一般會員


發表:14
回覆:19
積分:6
註冊:2004-07-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-27 16:51:57 IP:203.66.xxx.xxx 未訂閱
第二個問題我試了~ procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet); begin DateTimePicker1.DateTime := ClientDataSet1.FieldByName('start_date').AsDateTime; end; 但游漂指了DateTimePicker 上還是不會顯示 DBGrid 的資料 是不是 DBGrid 還要設定些什麼呢?
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-27 20:56:53 IP:218.163.xxx.xxx 未訂閱
我想問題應該在您所設定的事件是要您有資料筆數變動是才會發生的,所以您可以試試指向任何一筆資料看該元件是否會跟著變動才對,這個應該才是您所需要的功能。 讀萬卷書~不如來K.TOP走一遭
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-27 23:26:09 IP:61.229.xxx.xxx 未訂閱
hi,Kate0921: 1.關於查詢的部分,如果你是用TClientDataSet來讀取資料的,而你要查詢的欄位有一個以上或者查詢的條件比較複雜,又不想以下SQL指令的方式來做的話,利用TClientDataSet.OnFilterRecord事件及TClientDataSet.Filtered屬性搭配來"過濾"出符合條件的資料.先在onFilterRecord事件裡寫過濾的程,如下: 
procedure TForm1.ClientDataSet1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  Accept:=(DataSet.FieldByName('start_date').AsDateTime:=DateTimePicker1.DateTime) and
          (DataSet.FieldByName('end_date').AsDateTime:=DateTimePicker1.DateTime);
end; 
Accept指的是該筆資料是否要被過濾出來,而Dataset是指呼叫過濾的DataSet,也就是您的ClientDataset1. 寫好後,只要設定ClientDataSet1.Filtered:=True即可過濾出符合條件的資料.注意的事,過濾後資料其實還在,只是TClientDataSet把資料隱藏起而已,再下一次ClientDataSet1.Filtered:=False即可復原. 2.關於你第二點的問題我不大明瞭,可否再詳述一下.如果你的意思是說,在新增資料時,end_date是空白的,但在新增時因為是用TDateTimePicker,所以一定會有值在TClientDataSet裡的話,那麼可以用TField.Value來做,如下: ClientDataSet1.FieldByName('end_date').Value:=NULL 或者我誤會你的意思的話,請再說明一次.
kate0921
一般會員


發表:14
回覆:19
積分:6
註冊:2004-07-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-30 11:53:17 IP:203.66.xxx.xxx 未訂閱
不好意思,好心的前輩們,再麻煩一下囉!! 1.這是有關於新增資料部份: 請問~~我希望 NO 一開始是從 000001 開始遞增,那 I 一開始我是不是應該先給個初始值 000000 呢? procedure TForm1.BitBtn1Click(Sender: TObject); //新增資料 var I : Integer; var J, K : String; begin ClientDataSet1.Append; CIMDataBridge2.Close; CIMDataBridge2.Open; DBEdit3.Enabled := True; DBEdit4.Enabled := True; DBEdit5.Enabled := True; DBEdit9.Enabled := True; DBComboBox1.Enabled := True; DBComboBox2.Enabled := True; DBComboBox3.Enabled := True; DBComboBox4.Enabled := True; J := ClientDataSet2.FieldByName('NO').AsString; J := IntToStr(StrToInt(J) 1); For I:= 1 to 6 - Length(J) do begin K := K '0'; end; J := K J; DBEdit8.Text := J; DBEdit8.Enabled := False; MessageDlg(' 新增資料完成請按 "確定" !!', mtInformation, [mbOk], 0); end; 2.這是我在日期選擇上的控制: 請問~~我在新增資料時只希望可以新增開始日,因為必需完成之後才可輸入結束日,那要怎樣才能在新增時即使選擇結束日也不會有值可以輸入,而要在修改時才可以呢? procedure TForm1.DateTimePicker1Change(Sender: TObject); begin ClientDataSet1.FieldByName('START_DAY').AsDateTime := DateTimePicker1.Date; end; procedure TForm1.DateTimePicker2Change(Sender: TObject); begin ClientDataSet1.FieldByName('END_DAY').AsDateTime := DateTimePicker2.Date; end; 3.我的游標指到 DBGrid 為什麼其他的 DBEdit 都可以顯示出資料,但只有 DataTimePicker 不會顯示出 DBGrid 裡的資料呢?
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-30 12:46:31 IP:211.23.xxx.xxx 未訂閱
1.建議可直接使用 FORMATFLOAT('000000',CLIENTDATASET.RECORDCOUNT 1) 2. IF CLIENTDATASET.STATE = dsEDIT THEN ClientDataSet1.FieldByName('END_DAY').AsDateTime := DateTimePicker2.Date 3.因為 DateTimePicker 為一般元件,所以資料庫在資料變動時,無法與之同步變動取得資料,但這部份之功能您可利用像CLIENTDATASET的AFTERSCROLL類的事件來作,應可達到您的需求。 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-30 13:07:06 IP:210.65.xxx.xxx 未訂閱
Hi kate0921,    1.考慮多人使用狀況,建議將取得 NO 的程式碼寫於 BefortInsert 事件
procedure TForm1.ClientDataSet1BeforeInsert(DataSet: TDataSet);
var
  max_no : Integer;
begin
  ClientDataSet2.Close;
  ClientDataSet2.CommandText := 'select max(no) as max_no from yourtable';
  ClientDataSet2.Open;
  if ClientDataSet2.IsEmpty then
    max_no := 0
  else
    max_no := ClientDataSet2.FieldByName('No').AsInteger;
  ClientDataSet1.FieldByName('No').AsString := FormatFloat('000000',max_no)
end;
2.按下新增按鈕時,將 DateTimePicker2 Disable,Edit 時才 Enable 起來
procedure TForm1.Button1Click(Sender: TObject);
begin
  DateTimePicker2.Enabled := False;
  DateTime_SetFormat(DateTimePicker2.Handle, 'gg');
  ClientDataSet1.Append;
  .....
end;
或是判定 ClientDataSet1 的狀態決定是否將值塞入
procedure TForm1.DateTimePicker2Change(Sender: TObject);
begin
  if ClientDataSet1.State = dsEdit then
    ClientDataSet1.FieldByName('END_DAY').AsDateTime := DateTimePicker2.Date;
end;
3.TDateTimePicker 非資料感知元件需自行將值塞入,請參考: http://delphi.ktop.com.tw/topic.php?topic_id=23976 發表人 -
------
Fishman
kate0921
一般會員


發表:14
回覆:19
積分:6
註冊:2004-07-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-30 16:20:17 IP:203.66.xxx.xxx 未訂閱
前輩您們好!! 3.TDateTimePicker 非資料感知元件需自行將值塞入 不好意思~我參考了也用了裡面提供的方式 但還是無法顯示我想要的,不知哪裡出問題 //要 TDateTimePicker 顯示空白不知道可不可以? 可以的話, 方式如下: uses CommCtrl; begin DateTime_SetFormat(DateTimePicker1.Handle, 'gg'); end;//此段是我找提供的方式
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-30 17:01:53 IP:210.65.xxx.xxx 未訂閱
Hi kate0921,    在 AfterScroll 事件加入以下程式碼:
procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet);
begin
  if VarIsNull(ClientDataSet1.FieldByName('START_DAY').Value) then
    DateTime_SetFormat(DateTimePicker1.Handle, 'gg')
  else
    begin
      DateTime_SetFormat(DateTimePicker1.Handle,'yyyy/MM/dd');
      DateTimePicker1.DateTime := ClientDataSet1.FieldByName('START_DAY').AsDateTime;
    end;
  if VarIsNull(ClientDataSet1.FieldByName('END_DAY').Value) then
    DateTime_SetFormat(DateTimePicker2.Handle, 'gg')
  else
    begin
      DateTime_SetFormat(DateTimePicker2.Handle,'yyyy/MM/dd');
      DateTimePicker2.DateTime := ClientDataSet1.FieldByName('END_DAY').AsDateTime;
    end;
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
kate0921
一般會員


發表:14
回覆:19
積分:6
註冊:2004-07-07

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-30 17:31:41 IP:203.66.xxx.xxx 未訂閱
請問 DateTime_SetFormat 是不是一個 function 呢? 若不是我又應該怎麼做?謝謝!!
kate0921
一般會員


發表:14
回覆:19
積分:6
註冊:2004-07-07

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-08-30 17:46:38 IP:203.66.xxx.xxx 未訂閱
我真是豬頭 < > 只要加入 > ~~ 要到哪天我才能和你們一樣呢? ~~< >
系統時間:2024-06-29 23:48:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!