第一種語法 - SET FILTER TO test()
- 只要Fox能找到函數就完全沒問題。例如。如果函數駐留在foo.prg
中,則可能需要執行SET PROCEDURE TO foo ADDITIVE
。
但是,當瀏覽器打開遊標時,該函數將被頻繁地調用,因爲Fox需要調用過濾器來查找'活動'記錄是什麼 - 即那些通過過濾器表達式的記錄。你可以看到這一點,如果你執行以下命令:如果你想達到一定的副作用,只要當前記錄的更改,然後它可以爲宗旨更好地濫用SET RELATION
strto("debugout alias(), recno()", "foo.prg")
set proc to foo addi
acti wind debug
sele 0
use sys(2005) shar noup agai
brow last nowa
set filt to foo()
,因爲它永遠只能被調用的當前記錄。
顯然,SET RELATION
需要一些目標遊標,因此用於該技巧的函數通常會接收一個索引表達式作爲其第一個參數,並在做了一些有趣的事情之後將其傳遞(即RETURN
it)。 Fox經常對關係表達式進行評估,這意味着最好是緩存鍵值,並且只有在鍵值發生變化時才執行副作用。
我一直在使用這個工作數十年,現在讓福克斯開始顯示與當前表中的鍵相關的圖像(我們做了很多處方表單處理)。如果需要,熱鍵會實例化全局圖像管理器,並設置當前工作區的關係(如果需要,可以使用虛擬接收器光標),從那時起,無論當前的記錄如何,我總能看到圖像。第二次按下熱鍵解除了整個shebang。簡單,高效,血腥方便。
話雖如此,我認爲有效的(AB)濾波器和關係式的使用副作用非常少之間很遠......
PS:如果你有一個函數返回一個表達式你想作爲一個過濾器使用,那麼你必須趕上一個變量表達式,這樣就可以使用什麼文檔調用宏替換:
local cExpr
cExpr = test()
set filter to &cExpr
如果您使用
set filter to evaluate(test()) && usually a bad idea!
那麼每次Fox需要評估過濾時,過濾器表達式都會被重新計算,這是非常常見的情況。
如果您使用
local cExpr
cExpr = test()
set filter to evaluate(m.cExpr) && often not a good idea!
則變量不會一次執行離開局部範圍內可用。通過爲表達式使用全局變量可以避免這個問題,但是將表達式編譯到過濾器(通過宏替換)會更有效。這種差異變得非常顯着,有非順勢記錄計數表...
只是不要移動函數中的記錄指針。 –
我在很多很多年的應用程序中都沒有使用過濾器。你想在這裏完成什麼?可能有更好的方法。 –