| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2738 人关注过本帖
标题:SetAll 方法中的Value的值为什么有时要用引号括起来?
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1529
专家分:180
注 册:2006-6-3
结帖率:79.38%
收藏
已结贴  问题点数:20 回复次数:14 
SetAll 方法中的Value的值为什么有时要用引号括起来?
SetAll 方法中的Value的值为什么有时要用引号括起来?


Form1.Grid1.SetAll("ForeColor", RGB(0, 255, 0), "Header")

如下一句同样是色彩的值为什么要用“  
oGrd.SetAll("DynamicBackColor", ;
            "IIF(RECNO()%2=0,RGB(255,255,0), RGB(255,255,255))", "Column")
搜索更多相关主题的帖子: 色彩 
2011-12-24 12:55
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:7 
ForeColor 需要的是数值
DynamicBackColor 需要的是字符串
2011-12-24 13:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
SetAll()方法的行爲,它要做動作,是把第二個參數的結果賦給第一個參數的屬性,既然是要結果,那麽必須運算得到表達式的值。在你描紅的語句中,第二個參數是一個運算表達式,相當於一個完整的語句,把一條指令以字符串形式送入,SetAll()方法自己會把它提取為指令,先用宏執行了這個語句,再把運算得到的結果賦給第一個參數。第一個,RGB()函數本身已經是一個結果,無需再執行宏替換了,第二個,其實IIF()函數也是返回表達式,不用宏也可以的。

不過無論如何,在SetAll()方法的代碼實現中,都是以字符串形式接收第二個參數,宏替換得到結果後再處理的,第二個參數作函數指針處理。

授人以渔,不授人以鱼。
2011-12-24 13:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
VFP本質上是解釋型語言,無論你書寫的代碼如何,執行時,解釋器都會把你的代碼拆解成它分析得到的一系列擴展代碼。對SetAll()方法而言,就算你第一個語句的RGB()沒有用括號括住,VFP解釋器都給你加上去,然後送入SetAll()函數中,SetAll()函數按照規定對這個字符串再分析運算,求出結果。

像宏、()表達式求值這樣的VFP語法,都是如此,實際上最終調用EVALUATE()函數進行運算。如果用C#的語言來説,屬於反射機制,運行時再確定類型。這種動作,如教科書所言,使用宏指令就意味著速度有所降低,因爲它可能一直遞歸解析表達式。VFP、SQL的大量語句,都使用了這種機制,一般來説,用命令方式的都是這樣,比如SEEK "abc"要多一個動作,先把它轉爲SEEK("abc"),編譯後的代碼就是後者。

授人以渔,不授人以鱼。
2011-12-24 13:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
SetAll()方法,顧名思義,它要遍歷對象中所有子控件,一定是一個循環,每次迭代都執行一次把第二個參數賦給第一個的動作,當第二個參數不是死數而是要變化的時候,你自己想象一下那個循環體要怎麽處理,就知道了——第二個參數是函數,執行函數得到返回值就是往常的死數。

REPLACE ALL f1 WITH Deleted()
這條數據庫替換指令,要用每筆記錄的Deleted()結果來刷新字段f1,原理與上相同。平時REPLACE ALL f1 WITH "aaa",只不過"aaa"是死數,不是死數時,也能處理,VFP本身的設計就考慮到這種需求。事實上,Deleted()可以是任何自定義函數,不是非要把所有代碼都寫在一行的,換言之,你寫在一行,VFP實際執行時也是把這一大串文字視爲自定義函數(inline内聯了的函數);寫成自定義函數,VFP也是把函數代碼追加在指令後面,最終效果是一樣的。

[ 本帖最后由 TonyDeng 于 2011-12-24 13:52 编辑 ]

授人以渔,不授人以鱼。
2011-12-24 13:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看看use指令就知道了,USE students,students是數據表的名字,它鐵定是字符串,但在USE指令中,你寫不寫引號都一樣——事實上,計算機最終執行的是類如OpenTable("students")這樣的函數。用這個例子,回頭再看原先的問題,就很好理解了。

SetAll(),不妨看成SET ALL命令,與REPLACE ALL實是一回事。

VFP程序,雖然是解釋型語言,但它與dBASE不同之処,是不會直接執行PRG文件中的源代碼,而是執行編譯過的FXP文件的偽編譯代碼(其實現在最新的C/C++語言也是這種運行模式的了,早期編譯型語言和解釋型語言的差別,已經逐漸消失)。因此,不要被PRG所寫的短、少假象所迷惑,事實未必如PRG所寫那麽少代碼,被擴展開來的執行碼,可能是無法想象的。SQL語句一句頂數十句,你真以爲在PRG寫一句那麽簡單麽。

[ 本帖最后由 TonyDeng 于 2011-12-24 14:19 编辑 ]

授人以渔,不授人以鱼。
2011-12-24 14:02
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1529
专家分:180
注 册:2006-6-3
收藏
得分:0 
TonyDeng:


Form1.Grid1.SetAll("ForeColor", RGB(0, 255, 0
), "Header")&&&RGB(0, 255, 0)不用加“”



oGrd.SetAll("DynamicBackColor", "IIF(RECNO()%2=0,RGB(255,255,0), RGB(255,255,255))","Column")  &此句中为什么要加“ ”,返回值是字符型?

[ 本帖最后由 sylknb 于 2011-12-24 14:35 编辑 ]
2011-12-24 14:28
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:7 
个人的理解是:RGB(0, 255, 0) 是单纯表现数值的函数,可以直接按数值对待。不需加引号。iif 是字符串函数,此处可以表现出数值,但用于别处可能不表现数值),不能按数值对待。需要加引号。

[ 本帖最后由 qingfameng 于 2011-12-25 01:38 编辑 ]
2011-12-25 01:22
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:0 
回复 8楼 qingfameng
错误的想法,请见2楼和3楼
2011-12-25 10:07
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:0 
回复《软件服务》,期待简洁明了的函数使用规则解释,向高手学习一下。
2011-12-25 16:14
快速回复:SetAll 方法中的Value的值为什么有时要用引号括起来?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022198 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved