Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
為了防止我正要修改的那一筆資料被他人lock住我用了exception 如下
try table1.edit except on **** do showmessage('table1 is locked') end;
我在 ****中應該加入什麼exception instance呢?
另外 要如何判斷某一個error的 exception instance 是什麼呢?
提供張兄您另一個作法, 因為 edit 後該記錄就鎖定了, 別的user再想編輯時就會有例外訊息, 所以我在 edit 指令之前, 會先呼叫以下的偵測函數看看是不是鎖著, 然後才讓 Table 進入 dsEdit 狀態.
uses .., DB, DBTables, DBConsts, DbiTypes, DbiProcs; ... function IsLocked(ATable: TTable): boolean; var RecordProps: RECProps; wResult: DBIResult; begin Result := True; with ATable do begin if State = dsInactive then DBError(SDataSetClosed); UpdateCursorPos; wResult := DbiGetRecord(Handle, dbiWriteLock, nil, @RecordProps); if wResult = DBIERR_NONE then begin DbiRelRecordLock(Handle, False); Result := False; end; end; end;
抱歉!我對Database是個門外漢,能不能問個問題? 如這邊雖然有判斷Data是否被鎖住了,但是否programmer 只能利用polling的方式一直去check它?還是我可以在 DataSource的OnStateChange掛上處理的funtion去處理它, 讓Database主動通知programmer做適當的回應?
用 DataSource 的 OnStateChange 恐怕已經來不及了; Table 的BeforeEdit, BeforeDelete 這兩個事件, 應該是不錯的偵測窗口.
如果是中文應用組件, 由於訊息已經是中文的了, 不去攔截例外訊息或者不事先偵測, 相信也沒有什麼問題的吧. :p
procedure TForm1.Table1BeforeEdit(DataSet: TDataSet); begin if IsLocked(Table1) then // 如果記錄已被鎖定 begin // 顯示一段提示訊息 MsgBox('記錄被其他使用者鎖定', '網路訊息', 48); // 安靜中止 SysUtils.Abort; end; end;
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |