全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2706
推到 Plurk!
推到 Facebook!

請大大們提供OnValidate的撰寫方向

尚未結案
chiag
一般會員


發表:14
回覆:38
積分:10
註冊:2002-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-25 17:30:34 IP:218.164.xxx.xxx 未訂閱
請教各位大大, 小弟嘗試以Package的方式規劃架構,將子功能各個獨立一個bpl檔, DataModule也獨立成一個bpl檔,但也uses在子功能的bpl檔內, 在參考了站內大大們的發表後,仍在功力太淺的情況下,不知如何撰寫code, 因此,想請教大大們,讓如何才能達到 TForm1.Query1NOValidate()這行指令的效果, 但是,不是用Query元件,而是用ClientDataSet元件. 謝謝!! 新手上路!!加油中...
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-28 10:21:42 IP:218.163.xxx.xxx 未訂閱
下面這段程式, 在 Detail Table (IdenChild) 的 Parent_PK 欄, 檢查填入之值, 若於 Master Table (Parent) 不存在相關資料, 則發佈錯誤訊息 :    
procedure TForm1.IdenChildParent_PKValidate(Sender: TField);
begin
  if Sender.AsString <> '' then
  with TQuery.Create(Self) do begin // 新建一查詢元件
    try
      DatabaseName := IdenChild.DatabaseName; // 指定新建之查詢資料庫
      SQL.Add('select count(*) from Parent where Parent_PK ='#39 
              Sender.AsString #39);
      Open;
      if Fields[0].AsInteger <> 1 then
        raise Exception.Create('Parent_PK 值,於Parent檔中無相關資料!');
    finally
      Close; // 關閉並釋放新建之查詢元件
      Free;
    end;
  end;
end;
發表人 - Mickey 於 2003/04/28 10:44:19 發表人 - Mickey 於 2003/04/28 10:46:15
chiag
一般會員


發表:14
回覆:38
積分:10
註冊:2002-10-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-28 10:46:39 IP:218.164.xxx.xxx 未訂閱
感謝Mickey大大的回應, 您所提供的方式,小弟受教了, but, 在package的方式中,無法如此使用, 因為無法撰寫Field的OnValidate事件, so.... 新手上路!!加油中...
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-28 11:11:29 IP:218.163.xxx.xxx 未訂閱
procedure TForm1.MyIdenChildParent_PKValidate(Sender: TField);
begin
  if Sender.AsString <> '' then
  with TQuery.Create(nil) do begin // 新建一查詢元件
    try
      DatabaseName := TDBDataSEt(Sender.DataSet).DatabaseName; // 指定新建之查詢資料庫
      SQL.Add('select count(*) from Parent where Parent_PK ='#39+
              Sender.AsString+#39);
      Open;
      if Fields[0].AsInteger <> 1 then
        raise Exception.Create('Parent_PK 值,於Parent檔中無相關資料!');
    finally
      Close; // 關閉並釋放新建之查詢元件
      Free;
    end;
  end;
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  Query1.FieldByName('Parent_PK').OnValidate := MyIdenChildParent_PKValidate; // assign OnValidate
end;    
chiag
一般會員


發表:14
回覆:38
積分:10
註冊:2002-10-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-28 11:58:19 IP:218.164.xxx.xxx 未訂閱
請教Mickey大大, 您所提供的方法, 是不是也可說是直接assign一個Function 或 procedure給onValidate, 但一定透過新建一個query來查詢嗎? 我是說假設assign的procedure內, 直接ShowMessage( 'testValidate' ); 則當在Field中按下Enter鍵時, 就會Show了, 對嗎 新手上路!!加油中...
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-28 12:43:19 IP:218.163.xxx.xxx 未訂閱
引言: 是不是也可說是直接assign一個Function 或 procedure給onValidate,
是的, 但應是一個與 OnValidate "同型" 的 procedure.
引言: 但一定透過新建一個query來查詢嗎?
不一定新建一個query來查詢, 因我不知你 OnValidate 之檢查需求, 回應之 Sample 只是 Demo Master-Detail 的關聯性而已.
引言: 我是說假設assign的procedure內, 直接ShowMessage( 'testValidate' ); 則當在Field中按下Enter鍵時, 就會Show了, 對嗎 < face="Verdana, Arial, Helvetica"> 對 <>< face="Verdana, Arial, Helvetica">引言: 新手上路!!加油中...
你的問題, 不像新手喔 補充說明,完整一點的方式( class="code"> type TForm1 = class(TForm) ... private UserOnValidate : TFieldNotifyEvent; procedure MyIdenChildParent_PKValidate(Sender: TField); ... procedure TForm1.MyIdenChildParent_PKValidate(Sender: TField); begin ... UserOnValidate(Sender); // Call User OnValidate Event end; procedure TForm1.FormCreate(Sender: TObject); begin UserOnValidate := ClientDataSet1.FieldByName('Parent_PK').OnValidate; // Save User Defined Procedure to UserOnValidate. ClientDataSet1.FieldByName('Parent_PK').OnValidate := MyIdenChildParent_PKValidate; end;
chiag
一般會員


發表:14
回覆:38
積分:10
註冊:2002-10-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-28 12:52:56 IP:218.164.xxx.xxx 未訂閱
感謝Mickey大大的指導!! 我是Delphi的新手!! 接觸時間不到一年, so.... 新手上路!!加油中...
系統時間:2024-11-23 12:44:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!