| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1468 人关注过本帖, 1 人收藏
标题:【介紹如何用代碼編寫表單】百錢買百雞
只看楼主 加入收藏
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
最开始,我也不知道窗体最终设计成多大尺寸,于是,我想应该有form的height和width

然后我又怕出现下图的错误,我想还应该有minHeight和minWidth,于是我定义了两个变量
formHeight=350
formWidth=375

以方便在设计超出预想时,快速调整。但刚才经过实验,发现设置了minHeight和minWidth就够了,他俩已经完成了他们四个的任务。所以这两个变量是多余的。
图片附件: 游客没有浏览图片的权限,请 登录注册

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-11-21 13:57
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
创建常规类的实例时,我没有直接定位到基类上,而是在中间又多创建了一个基类的子类
ADD OBJECT cmdExit as myCmd1 WITH top=formHeight-5-25,left=formWidth-5-85
而T版创建实例时,目标明确,手法干脆
ADD OBJECT cmdExit AS CommandButton WITH Caption = "退出", Height = 25, Width = 85

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-11-21 14:30
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
对于窗体控件随窗口大小调整而放大缩小的问题,我的思路是,先有大小和位置,等用户调整时再resize。
T版的思路是,先有控件和不随窗体大小改变的属性,并从show开始,就Activate(当然也就Arrange),当resize时,也AArrange。
这个程序还没完成,这样的条理,更适合后面的扩充。

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-11-21 14:49
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
&&CLOSE ALL
IF _VFP.StartMode=4
    QUIT
ENDIF

这样会好点:
IF _VFP.StartMode=4
    QUIT
ELSE
    CLOSE ALL
ENDIF
2015-11-21 15:38
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用不懂才问在2015-11-21 14:30:45的发言:

创建常规类的实例时,我没有直接定位到基类上,而是在中间又多创建了一个基类的子类
ADD OBJECT cmdExit as myCmd1 WITH top=formHeight-5-25,left=formWidth-5-85
而T版创建实例时,目标明确,手法干脆
ADD OBJECT cmdExit AS CommandButton WITH Caption = "退出", Height = 25, Width = 85

当编程到了一定深度后,你会发现 myCmd1 类存在的重要性。好多老手都喜欢自己封装类,就算是一个简单的只执行一条退出指令的按钮也要用自己封装的类 myCmdExit,这不能只从“手法干脆”去考虑问题,这是一种良好的编程手法,事物发展都不断在变,要给自己留一条后路。

[此贴子已经被作者于2015-11-21 15:56编辑过]

2015-11-21 15:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 11楼 不懂才问
原理是這樣:
程序代码:
    PROCEDURE Arrange
        LOCAL lnIndex
        
        WITH This.cmdExit
            .Top = ThisForm.Height - .Height - 5
            .Left = ThisForm.Width - .Width - 6
        ENDWITH 
        
        WITH This.pgfContent
            .Top = 5
            .Left = 5
            .Height = This.cmdExit.Top - 5
            .Width = This.Width - .Left - 5
            .Pages[1].Arrange
            .Pages[2].Arrange
        ENDWITH 
        
    ENDPROC 

這段Arrange方法,是類C_fm1的自定義方法。關鍵是什麽時候調用它!你可以看到,我在兩個事件中主動調用它,一是Activate,一是Resize。

Activate是表單(C_fm1繼承自Form,父類已經有Activate事件)被激活時觸發的,表單被Show出來時,會觸發Activate,表單被遮擋過又被切換到前端時,也會觸發Activate,之所以在這個時候主動調用Arrange,是因爲第一次呈現表單肯定需要控件佈局。

Resize是表單的形狀尺寸被調整時觸發,不管是用戶使用鼠標拖拉窗體邊框,還是點擊右上角最大化/恢復按鈕,衹要Width、Height値發生變化,都會觸發Resize事件,此時,就需要重新佈局。

把執行佈局的動作放置在這些時機中,自然可以不管用戶怎麽擺弄窗體,都可以自動佈局了,事實上你可以看到一邊拖拉邊框控件一邊隨著伸縮的效果,更精準的,甚至可以針對Width或Height的變化做獨立響應。動作在這個時候發生,表單的寬高値是實時的,當然沒問題了。但是這個設計肯定需要窗體有最小尺寸,否則連控件都擠不下,計算出負坐標必然出錯。類似這樣的增補,自己多運行測試程序,就可以了。關鍵是明白道理,我爲什麽要抽取出這麽一個Arrange功能,爲什麽要在那麽兩個事件中調用它。

[此贴子已经被作者于2015-11-21 21:48编辑过]


授人以渔,不授人以鱼。
2015-11-21 21:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 12楼 不懂才问
是否需要封裝(派生)類,由邏輯決定。本來是一個按鈕CommandButton,沒有什麽特殊的類行爲,就不需要多此一舉封裝子類,因爲原本的類已經夠用了,無非是屬性和具體應答行爲不同而已,設計類本來就是爲了應付不同屬性和行爲。衹有當一批對象有某種邏輯上的共性,需要抽象概念時,才需要封裝類。

這個示例中的C_Page1和C_Page2類,其實就是兩個組合出來的集成控件,封裝成一個類,方便創建,這樣書寫,是不至於代碼都擠在一個大類之中,好看易調試,也方便在需要時放到別的容器中。這個其實就是所謂的VCX。

授人以渔,不授人以鱼。
2015-11-21 21:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
另外,你可以看到,我的代碼中,很少引用外部控件的名稱,用了名稱的地方,局限在内部、下層的變量,避免直接寫外部、上層的變量名,有許多方法可以回避這樣的硬編碼,這是程序可擴展性和可維護性的要求。寫程序大量使用硬編碼,其實是大忌,除非別無他法,都不要這樣做,就算做了,也如骨鯁在喉,睡夢也要想著有朝一日把它改順當了。

[此贴子已经被作者于2015-11-21 21:38编辑过]


授人以渔,不授人以鱼。
2015-11-21 21:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
事實上,這個程序,可以擴展爲出題庫。兩個Page已經抽象出類,通過屬性設置,從題庫中顯示題目,就像之前有個人希望實現的那樣。

授人以渔,不授人以鱼。
2015-11-21 23:50
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 15楼 吹水佬
原来是这样  

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-11-22 08:19
快速回复:【介紹如何用代碼編寫表單】百錢買百雞
数据加载中...
 
   



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

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