打印本文 打印本文 关闭窗口 关闭窗口
Web Application 開 發 利 器 - WebSnap(三)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2959  更新时间:2009/4/23 18:41:24  文章录入:mintao  责任编辑:mintao
p 上 按 右 鍵 選 擇 Add Command 選 項 來 新 增 一 個 Apply 按 紐

 

 

到 這 裡 為 止 我 們 已 經 完 成 了 一 個 編 修 資 料 的 網 頁 , 接 著 我 們 希 望 在 Grid 網 頁 每 筆 資 料 的 後 面 加 上 一 個 按 紐 連 結 到 這 個 編 修 的 網 頁 , 因 此 我 們 回 到 Grid Module 中 開 啟 Visual Page Designer 視 窗 , 在 AdapterGrid 元 件 上 按 右 鍵 選 擇 新 增 一 個 AdapterCommandColumn 元 件 。

 

 

完 成 之 後 你 應 該 可 以 看 到 在 每 筆 資 料 的 後 面 顯 示 許 多 的 按 紐 , 這 個 範 例 中 我 們 只 需 要 Edit 按 紐 就 可 以 了 , 請 在 AdapterCommandColumn 上 按 右 鍵 選 擇 新 增 一 個 Edit 按 紐 。

 

 

完 成 後 你 可 以 在 每 筆 資 料 的 最 後 一 欄 看 到 這 個 按 紐 , 同 時 你 也 可 以 使 用 視 窗 上 的 Move Up 按 紐 來 調 整 她 的 顯 示 位 置 。

 

 

然 後 我 們 要 設 定 當 使 用 者 按 下 這 個 按 紐 後 的 動 作 , 這 裡 我 們 只 需 要 她 連 往 Edit Page 就 可 以 了 , 我 們 可 以 利 用 設 定 PageName 特 性 值 來 達 到 這 個 目 的 。

 

 

我 們 希 望 能 夠 讓 使 用 者 在 編 修 網 頁 中 按 下 Apply 按 紐 後 , 自 動 回 到 Grid 網 頁 中 , 這 可 以 經 由 設 定 Apply 按 紐 的 PageName 特 性 值 為 Grid 來 完 成 。

OK! 大 功 告 成 , 接 著 執 行 程 式 來 看 看 我 們 的 成 果 吧 !

 

 

不 幸 的 是 , 當 你 修 改 了 資 料 後 按 下 Apply 按 紐 時 , 你 會 得 到 這 個 錯 誤 :

 

 

這 是 因 為 WebSnap 中 使 用 Variant 來 比 對 資 料 , 這 個 動 作 可 能 會 引 發 型 別 轉 換 上 的 例 外 , 而 我 們 是 在 Debuger 狀 態 下 執 行 程 式 , 因 此 例 外 就 被 DELPHI 所 攔 截 下 來 了 , 這 並 不 會 影 響 資 料 的 儲 存 動 作 , 因 為 WebSnap 中 完 整 的 處 理 了 這 個 例 外 , 當 型 別 轉 換 例 外 發 生 時 視 同 值 已 被 改 變 , 請 你 按 下 F9 讓 程 式 繼 續 執 行 就 可 以 了 。

 

在 網 頁 程 式 中 編 修 資 料 通 常 會 遇 到 一 些 困 難 , 例 如 資 料 的 預 先 驗 證 或 是 格 式 的 限 定 等 , 這 些 問 題 目 前 在 WebSnap 中 並 沒 有 太 多 的 支 援 , 例 如 沒 有 現 成 的 元 件 可 以 把 日 期 拆 成 三 個 輸 入 欄 位 , 也 不 能 夠 使 用 Client-side Script 來 驗 證 空 欄 位 。 雖 然 你 可 以 利 用 PageProducer 加 上 手 動 調 整 Script 來 達 到 這 個 效 果 , 但 這 還 是 不 夠 直 覺 。 這 些 問 題 我 會 在 後 面 的 章 節 中 提 出 一 些 解 決 方 法 。 現 在 讓 我 們 繼 續 加 強 我 們 的 範 例 程 式 , 我 們 希 望 能 讓 使 用 者 使 用 ComboBox 的 方 式 來 選 取 國 家 , 要 達 到 這 個 效 果 我 們 必 須 在 Data Module 中 加 入 一 個 Country 資 料 庫 , 接 著 在 Edit Module 加 入 一 個 TDataSetValueList 元 件 連 結 這 個 資 料 庫 。

 

 

接 著 我 們 要 設 定 在 DataSetAdapter 中 的 Country 欄 位 的 ValueList 特 性 值 。

 

 

完 成 後 開 啟 Visual Page Designer 就 可 以 看 到 Country 已 經 變 成 一 個 ComboBox 了 。

 

 

很 簡 單 不 是 嗎 ? 如 果 你 的 資 料 來 源 不 是 資 料 庫 的 話 , 那 你 可 以 把 TDataSetValueList 換 成 TStringsValueList , 這 樣 你 就 可 以 自 訂 ComboBox 中 的 Items 了 , WebSnap 中 有 許 多 的 HTML Control 可 以 選 擇 , 你 可 以 自 己 試 試 看 。

 

 3-3 、 資 料 搜 尋 及 錯 誤 處 理

 

在 結 束 這 一 章 之 前 , 讓 我 們 來 個 練 習 題 , 你 能 不 能 在 Grid 上 方 加 上 一 個 Edit 與 一 個 按 紐 , 讓 使 用 者 填 入 CustNo 後 按 下 那 個 按 紐 跳 往 Edit 網 頁 呢 ? 結 合 計 算 機 及 這 一 節 的 範 例 中 的 知 識 應 該 足 夠 你 完 成 這 個 工 作 了 。 至 於 搜 尋 資 料 的 部 份 我 們 可 以 使 用 兩 種 方 式 來 做 , 一 種 是 直 接 使 用 DataSet , 另 一 種 是 使 用 TDataSetAdapter 的 Locate Method , 我 建 議 你 使 用 後 者 :

 

procedure TGrid.QueryExecute(Sender: TObject; Params: TStrings);

var

  LocateParams:TLocateParams;

begin

  //use dataset

  //wdmData.Table1.Open;

  //wdmData.Table1.Locate(''''CustNo'''',AdaptEnterCustNo.ActionValue.Values[0],[]);

  //use dataset Adapter

  LocateParams:=dsAdaptCust.LocateParamsList.Add;

  LocateParams.AddParam(''''CustNo'''',AdaptEnterCustNo.ActionValue.Values[0]);

  LocateParams.AdapterName:=dsAdaptCust.Name;

  dsAdaptCust.Locate;

end;

 

那 當 使 用 者 輸 入 的 資 料 在 資 料 庫 中 找 不 到 時 要 如 何 處 理 呢 ? 你 有 兩 種 選 擇 , 一 種 是 直 接 引 發 一 個 例 外 , WebSnap 會 把 例 外 顯 示 在 網 頁 中 :

 

 if not dsAdaptCust.Locate then

   raise Exception.Create('''' 資 料 不 存 在 !'''');

 

另 外 一 種 方 法 是 設 定 Adapter.Errors 特 性 值 來 標 示 失 敗 , 再 設 定 ActionButton 中 的 ErrorPageName 導 向 特 定 的 網 頁 :

 

if not dsAdaptCust.Locate then

   Adapter1.Errors.AddError('''' 資 料 不 存 在 '''');

 

在 檔 案 中 的 範 例 程 式 內 實 作 了 這 兩 種 方 法 , 你 可 以 按 照 你 的 需 求 來 選 擇 。

  

3-4 AdapterErrorList 元 件

 

 我 們 也 可 以 利 用 AdapterErrorList 元 件 來 顯 示 錯 誤 資 訊 給 使 用 者 , 請 在 這 個 Page Module 中 開 啟 Visual Page Designer , 並 在 AdapterForm1 中 加 入 一 個 AdapterErrorList 元 件 :

 

 

接 著 使 用 Move Up 按 紐 將 這 個 元 件 移 到 AdapterForm 的 最 上 層 :

 

然 後 設 定 她 的 Adapter 為 Adapter1 。

 

 

接 著 我 們 就 可 以 來 測 試 一 下 結 果 了 , 在 做 測 試 之 前 , 請 將 Query Action 的 OnExecute 事 件 程 式 修 改 成 下 面 的 樣 子 :

 

procedure TGrid.QueryExecute(Sender: TObject; Params: TStrings);

var

  LocateParams:TLocateParams;

begin

  //use dataset

{  wdmData.Table1.Open;

  wdmData.Table1.Locate(''''CustNo'''',AdaptEnterCustNo.ActionValue.Values[0],[]) then}  //use dataset Adapter

  LocateParams:=dsaCust.LocateParamsList.Add;

  LocateParams.AddParam(''''CustNo'''',AdaptEnterCustNo.ActionValue.Values[0]);

  LocateParams.AdapterName:=dsaCust.Name;

  //use exception

{  if not dsaCust.Locate then

     raise Exception.Create('''' 資 料 不 存 在 !'''');}

  //use errorlist

  if not dsaCust.Locate then

     Adapter1.Errors.AddError('''' 資 料 不 存 在 !'''');

end;

 

當 你 輸 入 一 個 不 正 確 的 值 後 , 你 會 得 到 下 面 這 個 顯 示 畫 面 。

 

 

如 果 你 希 望 由 另 一 個 網 頁 來 顯 示 錯 誤 的 話 , 你 可 以 設 定 這 個 Action 的 ErrorPageName 成 為 該 Error Page 的 名 稱 , 並 且 在 Error Page 網 頁 中 加 入 AdapterForm-AdapterErrorList , 接 著 設 定 AdapterErrorList 為 Adapter1 即 可 。

  

3-5 WebSnap 中 的 網 頁 重 導 功 能

 

這 一 節 我 們 討 論 了 如 何 在 WebSnap 中 處 理 資 料 庫 , 如 何 以 CSS 改 變 網 頁 的 外 觀 , 及 如 何 處 理 錯 誤 與 操 作 TDataSetAdapter 。 你 應 該 注 意 到 我 使 用 了 兩 個 不 同 的 TDataSetAdapter 來 連 結 同 一 個 DataSet , 這 樣 做 的 目 的 是 我 們 以 後 還 可 以 將 Edit 網 頁 修 改 成 不 單 單 只 有 Apply 功 能 的 完 整 編 修 網 頁 。 如 果 你 的 目 的 只 是 要 讓 使 用 者 只 使 用 Apply 功 能 的 話 , 那 你 可 以 將 TDataSetAdapter 放 至 在 WebDataModule 中 或 是 Grid Page Module 中 , 並 在 Edit Module 的 BeforeDispatcher 事 件 中 判 別 使 用 者 是 直 接 進 入 這 個 網 頁 或 是 經 由 Grid Page Module 中 的 Action 進 入 的 。 如 果 是 直 接 進 入 的 話 , 將 使 用 者 導 回 Grid 網 頁 :

 

uses WebReq, WebCntxt, WebFact, Variants, udmData,AdaptReq,SiteComp;

function Edit: TEdit;

 begin

      

上一页  [1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口