注册 登录
编程论坛 VFP论坛

分享五,分割条控件

laowan001 发布于 2021-12-15 09:58, 6242 次点击
自己用的分割条控件,分享出来,大家指正
说明在附件的demo里

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-12-16 11:44编辑过]

50 回复
#2
厨师王德榜2021-12-15 12:05
感谢分享,vfp本身没有分割条控件,在做界面时显得不够灵活.
除了这个,有上下分割的控件否
#3
laowan0012021-12-15 13:21
回复 2楼 厨师王德榜
抱歉,没做上下分割条,如果需要的话,可自行修改,道理都是一样的
实际应用中,有些表字段较多,查看的时候受控件宽度限制,所以做了这个,目前还没感觉上下分割有太大的需求
#4
schtg2021-12-15 19:53
学习,谢谢!
#5
sostemp2021-12-16 08:25
回复 3楼 laowan001
打不开DEMO,还差类文件
#6
laowan0012021-12-16 08:43
回复 5楼 sostemp
把错误信息发上来,差的是哪个类文件?
#7
sych2021-12-16 10:51
只有本站会员才能查看附件,请 登录
#8
吹水佬2021-12-16 11:26
回复 7楼 sych
路径问题
试试将文件当前路径设置为默认路径
#9
sych2021-12-16 11:42
好的
#10
sych2021-12-16 11:44
好像不是路径问题,没有这个文件
#11
laowan0012021-12-16 11:45
抱歉是我用了私有控件,楼顶附件已更新
这里也放一下新附件
只有本站会员才能查看附件,请 登录
#12
sych2021-12-16 14:17
很好用
#13
sych2021-12-16 14:18
私有控件好用了也可以发上来吧
#14
laowan0012021-12-16 14:35
回复 13楼 sych
好的
#15
独木星空2021-12-17 07:02
回复 楼主 laowan001
谢谢!laowan001先生的分享。
#16
jiazhefish2021-12-17 08:48
感谢楼主,非常好用
#17
laowan0012021-12-17 09:42
回复 16楼 jiazhefish
#18
cssnet2021-12-17 17:40
感谢无私分享!
抱歉,这个控件我压根就没必要去试!不过我可以提一个挺极端的问题,来“刁难”楼主:
您试试,左边放一个Richtextbox(或别的什么ActiveX控件),右边再放一个Richtextbox(或别的什么ActiveX控件),然后用您精心设计的这一个“分割条”控件去分割它们。
——我敢打赌,您一定会挺失落的!

#19
xinjie2021-12-17 18:25
以下是引用cssnet在2021-12-17 17:40:01的发言:

感谢无私分享!
抱歉,这个控件我压根就没必要去试!不过我可以提一个挺极端的问题,来“刁难”楼主:
您试试,左边放一个Richtextbox(或别的什么ActiveX控件),右边再放一个Richtextbox(或别的什么ActiveX控件),然后用您精心设计的这一个“分割条”控件去分割它们。
——我敢打赌,您一定会挺失落的!

好像。。不是好像,是一定。。我是一个被你嘲讽藐视的人。
但是。。如果肚里有货,不是应该在论坛这种无私奉献的地方展示自己的心得而不是用这种高高在上的态度来看别人的技术缺陷?

不用回复。你不值得我和你在技术上有什么交流。

PS. “若能将原帖附件上传过来,让我们也沾光跟着学习一下子精妙的WinApi调用,那敢情也是极好的”
哈哈哈哈哈哈哈哈哈

[此贴子已经被作者于2021-12-17 18:28编辑过]

#20
xinjie2021-12-17 18:32
以下是引用laowan001在2021-12-15 09:58:16的发言:

自己用的分割条控件,分享出来,大家指正
说明在附件的demo里

对不起!我对你的无私奉献表示钦佩。我对我在这里搅了你的帖子的言论表示道歉。
#21
kangss2021-12-17 19:45
以下是引用laowan001在2021-12-15 09:58:16的发言:

自己用的分割条控件,分享出来,大家指正
说明在附件的demo里

十分感谢分享源码!做的很好。

如果两边控件数量多,不够用了,可以这样:
this.dividex1.controlright1 = this.grid1
this.dividex1.controlright2 = this.grid2
不用“controlright1”“controlright2”2个属性,用一个“controlright”,赋值时:“this.grid1|this.grid2|this.grid3”

类“dividex.Refresh”中
m._控件数 = GETWORDCOUNT(ALLTRIM(THIS.controlright), "|")
    FOR m._i = 1 TO m._控件数
        m._控件名 = GETWORDNUM(ALLTRIM(THIS.controlright), m._i, "|")

这样左右可以放很多控件了。以后做类似不确定控件数量的、日后有可能增加控件数量的模块儿时,尽量不要限制,做成循环。
#22
吹水佬2021-12-17 20:23
以下是引用laowan001在2021-12-15 13:21:37的发言:

抱歉,没做上下分割条,如果需要的话,可自行修改,道理都是一样的
实际应用中,有些表字段较多,查看的时候受控件宽度限制,所以做了这个,目前还没感觉上下分割有太大的需求

感谢分享
思路很好,有左右必会有上下。从无到有,从粗到精,编程本来就是这样,无需太在乎左右上下的目光。
我就当分割容器用,只处理被分割的容器,其他放在容器里任由发挥。
#23
吹水佬2021-12-17 20:30
以下是引用cssnet在2021-12-17 17:40:01的发言:

感谢无私分享!
抱歉,这个控件我压根就没必要去试!不过我可以提一个挺极端的问题,来“刁难”楼主:
您试试,左边放一个Richtextbox(或别的什么ActiveX控件),右边再放一个Richtextbox(或别的什么ActiveX控件),然后用您精心设计的这一个“分割条”控件去分割它们。
——我敢打赌,您一定会挺失落的!

所谓的分割只是调整控件的大小位置,ActiveX控件也应该无问题
#24
cssnet2021-12-17 20:48
以下是引用吹水佬在2021-12-17 20:30:25的发言:
所谓的分割只是调整控件的大小位置,ActiveX控件也应该无问题


因我们好多年前做过“分割条”控件,故而对于它的局限性有一些切身体会与了解。
其实并非“刁难”——本来就特意打了双引号,纯属开个小小玩笑,一认真你就输啦!——VFP的物件,是压不住ActiveX控件的;企图在ActiveX控件上方拖动分割条,你会发觉,只要一拖就被ActiveX控件遮挡住了。
文字表述半天,真没必要;其实你随便试一下就清楚啦。
#25
laowan0012021-12-17 21:09
回复 18楼 cssnet
既然“压根就没必要去试”,那又何来感谢呢?!压根就没必要感谢,您说是吧?!

我做的东东并不完美,只想用着方便就好,不能用的地方不用就是了,因为,如果不做这个控件,连现在能用的地方都没的用了
其实,我是喜欢与别人争论一些技术问题,各抒己见,百家争鸣,最后殊途同归,共同提高,挺好的。

这个控件用了很久,一直很满意,从来没有“失落”过,让您失望了,真是对不住
#26
laowan0012021-12-17 21:23
回复 21楼 kangss
感谢提示,非常好的思路,按您的提示确实可以不受限制了。

从实际应用角度来说,屏幕大小是有限的,左右两侧放的控件其实也是有限的,如果一侧上下控件多了,一个个小窄条,个人感觉并不美观,目前我的应用中多数都是每侧只有一到两个控件,个别有多于两个的时候,我会在其中一个受控的控件上的resize里把多出来的联动起来,其实也可以在控件中增加第3个或更多个,只是太少用到,就没做改动。

再次感谢提示!
#27
cssnet2021-12-17 21:29
其实仅仅是提醒你试一下ActiveX控件而已。
想多了,年轻人。
不妨拿你的话回赠你:

你试都没试,无必要动怒。

事实上,“分割条”控件,我们一直未能找到完美的解决方案。
能想到的可能有效的方法是:

做一个无标题栏、无一切内容的光秃秃的“瘦长条表单”,拿它来取代你现在精心设计的“分割条”控件。
因为置顶的表单,才有机会压住ActiveX控件。

然而,真要具体实现起来,有些麻烦,主要是:
这个所谓的this.LeftObj和this.RightObj,与mySpliter1自身,并不处在同一容器内,而必然是分属于两个不同的表单,引用起来就有些啰里啰嗦的。
#28
laowan0012021-12-17 21:53
回复 27楼 cssnet
应该是我没说清楚,能用的地方就用,不能用的地方不用就是了
我不指望一个控件完美解决问题,水果刀切肉确实不太行
ActiveX不行就不行了,也没必要废掉用着挺好的控件
#29
cssnet2021-12-17 22:07
以下是引用laowan001在2021-12-17 21:53:21的发言:

应该是我没说清楚,能用的地方就用,不能用的地方不用就是了
我不指望一个控件完美解决问题,水果刀切肉确实不太行
ActiveX不行就不行了,也没必要废掉用着挺好的控件


没有没有,应该是我没说清楚。我应该这样子说的:

太棒啦!我试了VFP自带的各种控件,分割条都能完美地运作!大哥哥,太厉害啦!
有一个小问题:大哥哥,我想请教一下,为什么当我用您这完美的分割条,左右两边各放一个richtextbox时,拖动分割条,显示会有些不正常?
再一次谢谢大哥哥!
您是最棒的!
======================
不过,这话又说回来——这唠叨了半天,浪费了一堆的无谓口水,其实你还是未能屈尊亲自试一试你的分割条对于ActiveX控件的表现。
这从你的回帖可看得出来。
其实,遇ActiveX控件,你的分割条并非不可用,只不过在拖动时,无法像平时那样,显示出一根长条棒棒而已。
呵呵呵呵。
#30
吹水佬2021-12-17 23:28
以下是引用cssnet在2021-12-17 20:48:08的发言:



因我们好多年前做过“分割条”控件,故而对于它的局限性有一些切身体会与了解。
其实并非“刁难”——本来就特意打了双引号,纯属开个小小玩笑,一认真你就输啦!——VFP的物件,是压不住ActiveX控件的;企图在ActiveX控件上方拖动分割条,你会发觉,只要一拖就被ActiveX控件遮挡住了。
文字表述半天,真没必要;其实你随便试一下就清楚啦。

粗粗地试了一下,感觉如果要求不高还是可行的。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

程序代码:
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 As Form
    Height = 500
    Width  = 900
    lnX = 0
    ADD OBJECT RT As Olecontrol WITH OleClass="RICHTEXT.RichtextCtrl.1",Top=10,Left=10,Width=200,Height=400
    ADD OBJECT LN as line WITH top=10,left=211,width=0,height=400,borderstyle=3,mousepointer=9
    ADD OBJECT WB As Olecontrol WITH OleClass="Shell.Explorer.2",Top=10,Left=213,Width=680,Height=400

    PROCEDURE Init
        this.lnX = this.ln.left
        this.rt.text = "RichtextCtrl"
        this.WB.Silent = 1
        thisform.WB.navigate2("https://bbs.bccn.net")
    ENDPROC
   
    PROCEDURE LN.mousemove(nButton, nShift, nXCoord, nYCoord)
        IF (nButton == 1)
            xx = nXCoord - thisform.lnX
            rtWidth = thisform.rt.Width + xx
            wbLeft = thisform.wb.Left + xx
            wbWidth = thisform.wb.Width - xx
            IF (rtWidth > 20) AND (wbWidth > 20)
                thisform.lnX = nXCoord
                thisform.rt.Width = rtWidth
                this.Left = nXCoord
                thisform.wb.Left  = wbLeft
                thisform.wb.Width = wbWidth
            ENDIF
        ENDIF
    ENDPROC
ENDDEFINE
#31
shenlancwz2021-12-18 09:05
不美观,不大实用。
#32
独木星空2021-12-18 09:36
回复 31楼 shenlancwz
我们要学会创造,学会试验,动机和过程才是重中之重,结果并不重要,从无到有,就是奇迹。
#33
吹水佬2021-12-18 09:48
修改了一下,虽然不算是完美,但感觉用来应对ActiveX控件分割的问题应该可行。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

程序代码:
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 As Form
    Height = 500
    Width  = 900
    ADD OBJECT RT As Olecontrol WITH OleClass="RICHTEXT.RichtextCtrl.1",Top=10,Left=10,Width=200,Height=400
    ADD OBJECT LN as line WITH top=10,left=212,width=0,height=400,BorderWidth=1,BorderStyle=3,MousePointer=9
    ADD OBJECT WB As Olecontrol WITH OleClass="Shell.Explorer.2",Top=10,Left=215,Width=680,Height=400

    PROCEDURE Init
        this.rt.text = "RichtextCtrl"
        this.WB.Silent = 1
        thisform.WB.navigate2("https://bbs.bccn.net")
    ENDPROC
   
    PROCEDURE LN.MouseEnter(nButton, nShift, nXCoord, nYCoord)
        this.BorderWidth = 2
    ENDPROC  
     
    PROCEDURE LN.MouseLeave(nButton, nShift, nXCoord, nYCoord)
        this.BorderWidth = 1
    ENDPROC   

    PROCEDURE LN.MouseMove(nButton, nShift, nXCoord, nYCoord)
        IF (nButton == 1)
            IF !BETWEEN(nXCoord, thisform.rt.Left+1, thisform.wb.Left+thisform.wb.Width-3)
                RETURN
            ENDIF
            thisform.LockScreen = .T.
            xx = nXCoord - this.Left
            this.Left = nXCoord
            thisform.rt.Width = thisform.rt.Width + xx
            thisform.wb.Left  = thisform.wb.Left  + xx
            thisform.wb.Width = thisform.wb.Width - xx
            thisform.LockScreen = .F.
        ENDIF
    ENDPROC
ENDDEFINE
#34
吹水佬2021-12-18 09:55
以下是引用shenlancwz在2021-12-18 09:05:16的发言:

不美观,不大实用。

“美观”就有点抽象,不好说,各花入各眼。
“实用”就不能脱离实际,能解决实际问题就好,可以不断学习改善。
#35
kangss2021-12-18 13:14
以下是引用shenlancwz在2021-12-18 09:05:16的发言:

不美观,不大实用。


只有本站会员才能查看附件,请 登录


想好看简单,里面放上图片

[此贴子已经被作者于2021-12-18 13:18编辑过]

#36
laowan0012021-12-18 17:00
只有本站会员才能查看附件,请 登录
#37
laowan0012021-12-18 17:08
简单处理显示效果,可以涂上颜色
.init 里
this.BackStyle = 1    && 不透明
this.BackColor = RGB(X,Y,Z)    && 选一个你喜欢的颜色


[此贴子已经被作者于2021-12-18 17:11编辑过]

#38
schtg2021-12-18 17:32
大侠们,学习啦,谢谢!
#39
吹水佬2021-12-18 18:02
回复 36楼 laowan001
操作未见异常,这样的效果可以了。
#40
laowan0012021-12-18 18:04
回复 39楼 吹水佬
OK
#41
laowan0012021-12-18 18:10
提示:控件如果放在表单的一个容器里(如:Pageframe,Container等)的时候,左右移动可能会出现计算值非法,原因是mousemove中是按thisform.width计算的位置,这样会出现负值,可以把thisform.width 换成 this.parent.width
#42
cssnet2021-12-19 05:47
以下是引用吹水佬在2021-12-18 18:02:48的发言:
操作未见异常,这样的效果可以了。


这效果确实是超出预期!哈哈!真的很美妙!
不过你仍然低估了ActiveX控件的复杂性。
仔细观察各类应用软件,“分割条”控件一般有两种实现模式:
“贪婪模式”和“非贪婪模式”。
所谓“贪婪模式”,就是你现在采用的方法,将位置、大小的计算与改变,放在MouseMove事件当中;
而比较稳妥的“非贪婪模式”,则是将位置、大小的计算与改变,放在MouseUp事件事件当中。
二者的区别是:MouseMove模式要时刻不停地刷新表单显示,而MouseUp模式只刷新表单一次。

试考虑一下拖动分割条的整个“生存活动周期”:
它始于MouseDown,终于MouseUp;中间过程无论如何拖动,对于所涉及控件的最终位置、大小结果,其实是无意义的。
我不知你是否看明白了我的意思。
在MouseMove事件当中不停地刷新ActiveX控件,这其实类似于数据库的“独占式锁定”:
因ActiveX控件不同于VFP内部控件,它在你拖动过程中,可能无法同步地执行其内部事件的任何代码,尤其是一些耗时的代码,而不得不全世界卡顿下来,一定要等待你拖动完成了,才能继续运作。
此外,还有“分割条”嵌套的问题。
假设表单中有2根左右“分割条”,1根上下“分割条”:
左右两根,表单被分成“左中右”三块;上下1根,将“中”上下切割——整个表单相当于划分为大写的“H”几大区块。
你是无法简单地指望.LockScreen就能处理好这几大块区域刷新的,因在MouseMove模式下,每一小块都迫切需要.LockScreen,才能显示得漂漂亮亮的,而.LockScreen,只有一次宝贵的机会。
我不知你是否看明白了我的意思。
呵呵呵呵。
#43
easyppt2021-12-19 16:19
对付 ActiveX 一般设置: _vfp.AutoYield = .F.   可行不?

#44
吹水佬2021-12-20 01:11
回复 42楼 cssnet
不是说了提供的代码不完美吗?
其实不需是否看得明白的文字,只是期待看到更完美的代码。
本人习惯用代码表达思想,并且是可测试运行的代码,极少用文字长篇大论。
#45
吹水佬2021-12-20 01:23
纯属个人感觉来说,更喜欢这种拉窗帘的效果。
传统的所谓拖动感觉似搬动
#46
easyppt2021-12-20 09:37
吹版 非常平易近人,面对问题,都是直接给出代码,真的非常敬佩!!

楼主也很热心,非常热心的分享!!



[此贴子已经被作者于2021-12-20 09:39编辑过]

#47
cssnet2021-12-20 10:17
以下是引用easyppt在2021-12-19 16:19:35的发言:

对付 ActiveX 一般设置: _vfp.AutoYield = .F.   可行不?


只要表单上放置了若干ActiveX控件,则_vfp.AutoYield = .F.是标配;若默认.t.的话,会随机抛出许多莫名其妙的bug,让人防不胜防、应接不暇。
之所以会用到ActiveX控件,是因为要在表单中显示东南亚字符,比方说泰文、印度文之类。
详见这一帖别人的代码(不要再揶揄我不贴代码啰,呵呵呵呵):
https://www.
#48
ping3624212022-06-18 00:37
回复 41楼 laowan001
当分割线放在页签里,并移动了分割线,在切换页签回来后,分割线的位置又恢复默认位置了,这是什么原理呢?
#49
laowan0012022-06-18 07:52
以下是引用ping362421在2022-6-18 00:37:54的发言:

当分割线放在页签里,并移动了分割线,在切换页签回来后,分割线的位置又恢复默认位置了,这是什么原理呢?

是不是 pageX.activate里初始了分割条?如果是的话切换回来后就会重新初始化,所以会恢复到初始位置
#50
sam_jiang2022-06-18 09:17
楼主很用心
#51
aqyejun2022-06-20 14:38
1