| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4388 人关注过本帖, 1 人收藏
标题:XP计算器?
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
VFP默认浮点数显示小数点后2位,这个计算器有浮点数,所以需要设置小数点的显示位数。SET指令都是全局性的。
ON ERROR在帮助中有,那是现成的示范代码。
VFP编辑器只是一个自身写成的程序,变色是根据设定的词库机械搜索而来,不代表那必然是关键字。
VFP有继承了早期FoxBase一个不好的特性,就是关键字可以省略到4个字符,不用理会这种东西。

授人以渔,不授人以鱼。
2012-09-19 19:37
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 61楼 TonyDeng
哈哈 谢谢老大的指点明白了好多东西啊
我参照你的程序写了个界面 等会发上来你看看怎么样

梅尚程荀
马谭杨奚







                                                       
2012-09-19 20:05
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
先上图 还没有些事件代码 也没添加菜单 不过我添加了括号 如果以后想写带括号的就照这个模板搞了
图片附件: 游客没有浏览图片的权限,请 登录注册


再上代码。。。
程序代码:
clear all

public ga_Keys[30]
ga_Keys[1]  = CREATEOBJECT("Key_t", "MC", "MC")
ga_Keys[7]  = CREATEOBJECT("Key_t", "MR", "MR")
ga_Keys[13]  = CREATEOBJECT("Key_t", "MS", "MS")
ga_Keys[19]  = CREATEOBJECT("Key_t", "M1", "M+")
ga_Keys[25]  = CREATEOBJECT("Key_t", "M2", "M-")
ga_Keys[2] = CREATEOBJECT("Key_t", "(", "(")
ga_Keys[3] = CREATEOBJECT("Key_t", ")", ")")
ga_Keys[4]  = CREATEOBJECT("Key_t", "BS", "←")
ga_Keys[5]  = CREATEOBJECT("Key_t", "C1", "CE")
ga_Keys[6]  = CREATEOBJECT("Key_t", "C2", "C")
ga_Keys[8] = CREATEOBJECT("Key_t", "7", "7")
ga_Keys[9] = CREATEOBJECT("Key_t", "8", "8")
ga_Keys[10] = CREATEOBJECT("Key_t", "9", "9")
ga_Keys[11] = CREATEOBJECT("Key_t", "/", "/")
ga_Keys[12] = CREATEOBJECT("Key_t", "sqrt", "√")
ga_Keys[14] = CREATEOBJECT("Key_t", "4", "4")
ga_Keys[15] = CREATEOBJECT("Key_t", "5", "5")
ga_Keys[16] = CREATEOBJECT("Key_t", "6", "6")
ga_Keys[17] = CREATEOBJECT("Key_t", "*", "*")
ga_Keys[18] = CREATEOBJECT("Key_t", "%", "%")
ga_Keys[20] = CREATEOBJECT("Key_t", "1", "1")
ga_Keys[21] = CREATEOBJECT("Key_t", "2", "2")
ga_Keys[22] = CREATEOBJECT("Key_t", "3", "3")
ga_Keys[23] = CREATEOBJECT("Key_t", "-", "-")
ga_Keys[24] = CREATEOBJECT("Key_t", "inverse", "1/x")
ga_Keys[26] = CREATEOBJECT("Key_t", "0", "0")
ga_Keys[27]  = CREATEOBJECT("Key_t", "sign", "+/-")
ga_Keys[28] = CREATEOBJECT("Key_t", ".", ".")
ga_Keys[29] = CREATEOBJECT("Key_t", "+", "+")
ga_Keys[30] = CREATEOBJECT("Key_t", "=", "=")

public gc_Expression, gc_Result
gc_Expression = ""
gc_Result = ""

set decimals to 4
on error do errHandler with Error(), Message(), Message(1), Program(), Lineno()
Main()
on error

clear all
return

procedure errHandler(merror, mess, mess1, mprog, mlineno)
          MessageBox(Str(mlineno) + "表达式错误:" + mess)
endproc


procedure Main()
       local lo_MainForm
       lo_MainForm = NewObject("C_Form")
       lo_MainForm.show
       read events
endproc    

define class Key_t as Custom
       ID = ""
       Caption = ""
      
       procedure Init(tc_ID, tc_Caption)
            with This
                 .ID = tc_ID
                 .Caption = tc_Caption
            endwith
       endproc
enddefine

Define Class C_Button as CommandButton
       Width = 50
       Height = 50
       *FontName = "Terminal"
       Themes = 0
       FontSize = 20
      
       *- 键名属性
        Key = ""
       
        Procedure Init(t_Key)
              With This
                   .Key = t_Key
                   .Caption = .Key.Caption
              EndWith
        EndProc
EndDefine

define class C_Form as Form
       MaxButton = .F.
       Caption = "    计算器"
       Icon = 'D:\VFP\ico\rr.ico'
       AutoCenter = .T.
      
       add object C_display as Container with Width = 350, Height = 50,;
                                 BorderWidth = 2
       add object C_btnGroup as Container with Width = ThisForm.C_display.Width, Height = 300,;
                                 BorderWidth = 0
            
       procedure C_display.Init
          with This
            .SpecialEffect = 1
            .AddObject("mem_dpy", "Container")  && mem_dpy 的意思是memory_display
            .mem_dpy.Top = 5
            .mem_dpy.Left = 5
            .mem_dpy.Width = 40
            .mem_dpy.Height = 40
            .mem_dpy.SpecialEffect = 1
           
            .AddObject("epn_dpy", "Label")    && epn_dpy 的意思是expression_display
            .epn_dpy.Top = .mem_dpy.Top
            .epn_dpy.Left = .mem_dpy.Left * 2 + .mem_dpy.Width
            .epn_dpy.Width = .Width - .mem_dpy.Width - .mem_dpy.Left * 2
            .epn_dpy.Height = .Height/2 - .mem_dpy.Top
            *.epn_dpy.BackColor = Rgb(0, 0, 255)
        
            .AddObject("rst_dpy", "Label")   && rst_dpy 的意思是result_display
            .rst_dpy.Top = .Height/2
            .rst_dpy.Left = .epn_dpy.Left
            .rst_dpy.Width =  .epn_dpy.Width
            .rst_dpy.Height = .epn_dpy.Height
            *.rst_dpy.BackColor = Rgb(255, 0, 0)
           
            .SetAll("Visible", .T.)
            .SetAll("Caption", "0.")
            .SetAll("Alignment", 1)
            .SetAll("BorderWidth", 2)
            .SetAll("FontSize", 14)
          endwith
       endproc
      
       Procedure C_btnGroup.Init
             Local lc_KeyName
             Local ln_Space
             Local ln_Index, ln_Top, ln_Left
             ln_Top = 0
             ln_Left = 0
             ln_Space = 10
             For ln_Index = 1 to Alen(ga_Keys, 0)
                  lc_KeyName = "Key_" + Padl(ln_Index, 2, '0')
                 This.AddObject(lc_KeyName, "C_Button", ga_Keys[ln_Index])
                 With This.&lc_KeyName
                      If  InList(ln_Index, 7, 13, 19, 25)
                          ln_Top = ln_Top + .Height + ln_Space
                          ln_Left = 0
                      EndIf
                      If InList(ln_Index, 8, 9, 10, 14, 15, 16, 20, 21, 22,;
                                26, 27, 28, 12, 18, 24)
                             .ForeColor = Rgb(0, 0, 255)
                      Else
                             .ForeColor = Rgb(255, 0, 0)      
                      EndIf
                      .Top = ln_Top
                      .Left = ln_Left
                      .Visible = .T.
                      .Themes = 0 
                      ln_Left = ln_Left + .Width + ln_Space                                      
                 EndWith
             Next
       EndProc
      
       procedure Init
            with This
            .C_display.Top = 35
            .C_display.Left = 10
            .C_btnGroup.Top = .C_display.Top + .C_display.Height + 10
            .C_btnGroup.Left = .C_display.Left
            .Width = .C_display.Width + 20
            .Height = .C_btnGroup.Top + .C_btnGroup.Height
            endwith
       endproc                    

procedure destroy
     clear events
endproc

enddefine     
  



[ 本帖最后由 有容就大 于 2012-9-19 20:12 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-09-19 20:08
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
回复 63楼 有容就大
还有自己的风格吗
界面布局完成了
计算功能?

[ 本帖最后由 bccn201203 于 2012-9-19 20:24 编辑 ]
2012-09-19 20:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
居然知道怎么自由增删按钮!
用VFP的宏替换(&)运算,带括号是不成问题的。这只是界面的练习,以后如何处理运算,就是搞算法的问题了,但这样隔离的逻辑,算法怎么变都不会影响界面部分。
有一定的心得,就可以回头想一想,用C/C++写同样的东西,需要实现什么,就很明确了——模仿出同样的功能模块!

授人以渔,不授人以鱼。
2012-09-19 20:17
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 64楼 bccn201203
临摹啊 不想要自己的风格啦

梅尚程荀
马谭杨奚







                                                       
2012-09-19 20:18
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 65楼 TonyDeng
谢谢老大鼓励啊 嘿嘿
你的意思是VFP里的宏替换能比较简单的实现带括号运算 而逆波兰算法要复杂的多 是吗?
C/C++要复杂的多啊

梅尚程荀
马谭杨奚







                                                       
2012-09-19 20:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你试试写个复杂的表达式,放在字符串str中,在命令窗口? &str看看结果。只要那表达式语法没有错误,VFP就能算出结果。

授人以渔,不授人以鱼。
2012-09-19 20:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C/C++正常的用法,是在诸如VFP提供的东西有所不足时,用来调整的。比如有些需求,像修改文件属性之类,VFP的功能不足,就可以调用API来实现(VFP可以直接使用Win32 API库函数),或者用C/C++写个DLL模块供调用。完全用C/C++来写应用软件,是不现实的,也不必要,不要把精力花费在那些地方,除非你铁心仅使用那么一种编程语言。

C/C++不是说不能做,但花费的时间和精力绝对比其他的高级编程工具多得多,除非你事先下大功夫积累了一套完善的工具。不过,C/C++的发展也比你快得多,像现在VS2012那样,C++11已经可以做到跟你现在使用VFP一样的模式了,它比VFP强得多,但你现在学到的东西,可以搬到那里用。说句不好听的,微软花十年时间发展.NET,不过是要用C/C++/C#之类实现VFP的加强版而已。

授人以渔,不授人以鱼。
2012-09-19 20:34
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用TonyDeng在2012-9-19 20:23:16的发言:

你试试写个复杂的表达式,放在字符串str中,在命令窗口? &str看看结果。只要那表达式语法没有错误,VFP就能算出结果。

试了下 还真是 那复杂的逆波兰算法就被VFP这么轻松的搞定了 真是不敢想象啊

梅尚程荀
马谭杨奚







                                                       
2012-09-19 20:36
快速回复:XP计算器?
数据加载中...
 
   



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

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