| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1791 人关注过本帖, 1 人收藏
标题:做表?
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那样是学不到VFP的精髓的,也无法了解面向对象的编程思想。你现在需要的是向面向对象编程思想转型,借这么一个平台。VC和VB、VFP那种拖拖拉拉的创建程序方式,是面向对象编程刚问世时的方式,已被很多人指斥为无法深入理解编程精髓,从而有回归C/C++的倾向。但事实上VFP的强大,不是这种东西,而是它的理念比VC更先进,不光可以拖拖拉拉,本质上完全用代码就可以编制具有任何窗口控件元素的程序,当今的.NET编程,也是从这个方向发展出来的。VS2012的C++ 11版本,就是最后支持这种方式的C++版本,在C#和之后。

即使是现在.NET的WPF编程,也不要使用拖拉方式,而是自己直接写声明指令,观察即时界面的效果(VFP所缺正是无法看到即时效果,只能说是10年无更新之过),鼠标拖拉是辅助性的。如果你走向拖拉控件的编程,那么就是走偏了。又不是已成习惯,新学的就不要走上这条路。

[ 本帖最后由 TonyDeng 于 2012-9-13 22:47 编辑 ]

授人以渔,不授人以鱼。
2012-09-13 22:41
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 31楼 TonyDeng
这样啊 那时间要的更长了 毕竟很多函数没熟悉 模块的组合还是很生疏啊
老大能否给个相关的简单示例 我现在就是在拖拉控件(用的很爽的样子 原来是被你遗弃的东西)

[ 本帖最后由 有容就大 于 2012-9-13 22:51 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-09-13 22:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
先从创建基本的控件开始,窗体Form、文本框TextBox、命令按钮CommandButton、文本标签Label、下拉框ComboBox、列表框ListBox、表格Grid、图像Image等,是任何Windows编程的常用控件,都是基于Windows内核User.DLL的控件,在Windows环境下的行为是一样的,能够自由操控这些元素,那么你写什么语言的程序都可以组织好界面了,剩下的才是往这些控件绑定和处理数据。记住:编程是多层架构,界面元素和数据处理逻辑尽量分开。学会调度界面元素,是迈入Windows编程的第一步。

授人以渔,不授人以鱼。
2012-09-13 22:53
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 33楼 TonyDeng
学会调度界面元素,是迈入Windows编程的第一步。

这个怎么解 ? 你的意思是获取控件的返回值来驱动事件的产生和运行?

梅尚程荀
马谭杨奚







                                                       
2012-09-13 22:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面的代码,你放在一个.PRG中直接运行就可以了,最简单的东西:

程序代码:
CLEAR ALL
CLOSE DATABASES ALL
frmMain = CREATEOBJECT("C_Form")
frmMain.Show
READ EVENTS
CLEAR
RETURN 

DEFINE CLASS C_Form AS Form
    Caption = ""
    Width = 600
    Height = 400
    AutoCenter = .T.
   
    ADD OBJECT Button1 AS CommandButton WITH Caption = "需定位的文件", Width = 100, Height = 25
    ADD OBJECT Text1   AS TextBox       WITH Value = "", Height = 25

    ADD OBJECT List1 AS C_ShowFile NOINIT WITH Visible = .F.
   
    PROCEDURE Arrange
        WITH ThisForm.Button1
            .Top = 5
            .Left = 5
        ENDWITH
        WITH ThisForm.Text1
            .Top = ThisForm.Button1.Top
            .Left = ThisForm.Button1.Left + ThisForm.Button1.Width + 5
            .Width = ThisForm.Width - .Left - 5
        ENDWITH
        WITH ThisForm.List1
            .Top = ThisForm.Button1.Top + ThisForm.Button1.Height + 5
            .Left = 5
            .Height = ThisForm.Height - .Top - 5
            .Width = ThisForm.Width - .Left - 5
        ENDWITH
    ENDPROC
   
    PROCEDURE Activate
        ThisForm.Arrange
    ENDPROC
   
    PROCEDURE Resize
        ThisForm.Arrange
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
    PROCEDURE Button1.CLick
        WITH ThisForm
            .Text1.Value = GETFILE()
            .List1.Init(.Text1.Value)
            .List1.Visible = .T.
        ENDWITH
    ENDPROC
   
    PROCEDURE Text1.Valid
        IF !EMPTY(This.Value)
            WITH ThisForm.List1
                .Init(This.Value)
                .Visible = .T.
            ENDWITH
        ENDIF
    ENDPROC
   
ENDDEFINE 

DEFINE CLASS C_ShowFile AS ListBox

    PROCEDURE Init(tcFileName AS Character)
        LOCAL lcPath AS Character
        LOCAL laFiles[1,5]
        LOCAL lnIndex AS Integer
        LOCAL lnPos AS Integer
       
        IF (PCOUNT() > 0) .AND. (VARTYPE(tcFileName) == "C") .AND. !EMPTY(tcFileName)
            tcFileName = ALLTRIM(UPPER(tcFileName))
            IF FILE(tcFileName)
                lcPath = JUSTPATH(tcFileName)
                IF ADIR(laFiles, lcPath + "\*.*") > 0
                    WITH This
                        .Clear
                        .ColumnCount = 4
                        .ColumnWidths = "200,100,100,100"
                        FOR lnIndex = 1 TO ALEN(laFiles,1)
                            .AddListItem(laFiles[lnIndex,1], lnIndex, 1)
                            .AddListItem(TRANSFORM(laFiles[lnIndex,2], "999,999,999,999"), lnIndex, 2)
                            .AddListItem(DTOC(laFiles[lnIndex,3]), lnIndex, 3)
                            .AddListItem(laFiles[lnIndex,4], lnIndex, 4)
                            IF (lcPath + "\" + laFiles[lnIndex,1]) == tcFileName
                                lnPos = lnIndex
                            ENDIF
                        NEXT
                        .ListIndex = lnPos
                    ENDWITH
                ENDIF
            ELSE
                This.Clear
            ENDIF
        ENDIF
       
    ENDPROC
   
ENDDEFINE

其效果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2012-9-13 23:01 编辑 ]

授人以渔,不授人以鱼。
2012-09-13 22:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 34楼 有容就大
面向对象编程编程方式都是事件驱动的,不是什么返回值的问题。

授人以渔,不授人以鱼。
2012-09-13 23:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
35楼的程序,是当时坛上一个网友问的问题时为他写的。他主要是想在知道一个文件的文件名的时候,调出磁盘上文件夹的文件列表,同时把光标定位在这个已知的文件上,省去在数百上千个文件中肉眼查找的麻烦。

另外,你运行时留意一下,随便你拖拉窗体的边框,改变窗体的形状和大小,看控件的布局有没有失常?它们是随着窗体的变化而跟随变化的,这就是事件模型,窗体变,对象就马上有反应,我的控件事件代码中侦测到所需的变化,就能做出反应,不是像C那样要主动调用函数做动作。这种被动的方式,就是所谓的“回调”,与面向过程的编程正好相反。

[ 本帖最后由 TonyDeng 于 2012-9-13 23:09 编辑 ]

授人以渔,不授人以鱼。
2012-09-13 23:05
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 37楼 TonyDeng
恩 我打开了 看到效果了 确实眼界大开

梅尚程荀
马谭杨奚







                                                       
2012-09-13 23:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你拖一个TextBox控件到表单,其实就对应于我代码中一句ADD OBJECT指令,这就是拖拉模型向你隐藏了的真实动作。如果你不了解这个本质,就永远不知道怎么才能在程序运行时动态添加或删除若干事先不知道的控件到表单上。

授人以渔,不授人以鱼。
2012-09-13 23:11
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 39楼 TonyDeng
主程序就这小段吗
CLEAR ALL
CLOSE DATABASES ALL
frmMain = CREATEOBJECT("C_Form")
frmMain.Show
READ EVENTS
CLEAR
RETURN

梅尚程荀
马谭杨奚







                                                       
2012-09-13 23:14
快速回复:做表?
数据加载中...
 
   



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

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