小心使用可修改的常量。

2021-09-05 16:32:58 字數 1241 閱讀 5336

procedure tfdbform_editform_md.enabledatasetevent(aenalbed: boolean);

const

cdetailbeforeeditevent: tdatasetnotifyevent = nil;

cdetailbeforedeleteevent: tdatasetnotifyevent = nil;

begin

inherited;

if aenalbed then

begin

if not assigned(cdetailbeforeeditevent) then cdetailbeforeeditevent := ondetaildatasetbeforeedit;//

if not assigned(cdetailbeforedeleteevent) then cdetailbeforedeleteevent := ondetaildatasetbeforedelete;//

detaildataset.beforeedit := cdetailbeforeeditevent;

detaildataset.beforedelete := cdetailbeforedeleteevent;

detaildataset.beforeinsert := ondetaildatasetbeforeinsert;

end else

begin

detaildataset.beforeedit := nil;

detaildataset.beforedelete := nil;

detaildataset.beforeinsert := nil;

end;

end;

上述**似乎沒有什麼問題。

但是在窗體關閉再開啟之後就出現問題了

if not assigned(cdetailbeforeeditevent) then cdetailbeforeeditevent := ondetaildatasetbeforeedit;//

if not assigned(cdetailbeforedeleteevent) then cdetailbeforedeleteevent := ondetaildatasetbeforedelete;//

注意這兩句,在第一次被賦值以後,即使窗體關閉(free),再次開啟之後,因為cdetailbeforeeditevent 是常量,還記錄了前次的位址,但前次的位址中所指的事件已經銷毀了,所以會引發錯誤。

字串常量不可修改,陣列可修改的原因

一般情況下,想要獲得字串str kuai lai xiu gai wo 中的某個字元可以通過類似陣列方式獲得,str i 但是卻不可以通過str i xx 來修改。除非切割字串或者轉換為陣列。var str beijing str 0 hahaha console.log str console.l...

可重用設計 使用符號常量和parameter

可重用設計 使用符號常量和parameter 好的設計習慣會在hdl 中避免使用 魔鬼數字 而是盡量採用符號常量。verilog hdl中,使用關鍵字localparam宣告符號常量 4位全加器的verilog hdl描述 module adder carry hard lit input wire...

可修改的雜湊

如果在乙個字串中要找是否存在長度為n的回文串 可以manachar 但是更好打的方式是直接hash 可是,這個hash需要算o len 個長度為n的字串的hash值 如果暴力,已經到了o n 2 的級別 那麼考慮一下,如何簡化。計算hash的o n 是不能省的 那麼不難想到利用前面串的結果來巧算後面...