| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 1975 人关注过本帖
标题:话说,VFP有无可用/好用/易用的“Markdown编辑框”控件?
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:435
专家分:360
注 册:2013-10-4
收藏
得分:0 
以下是引用wcx_cc在2025-7-18 13:43:47的发言:

word 嵌入表单内,速度不如edit 快,他也有弊端,就是需要整篇存盘,占磁盘空间比较大,所以适合电脑内存,和服务器硬盘都比较大的情况,使用者感觉不到有延迟,卡顿现象。
在自己做的软件中,重要的篇幅大的文述部分都是word的,篇幅小的任然保留了edit,使用多年,这一方面用户无不良反馈。


初步测试嵌入 word 的表单,发现似乎 word 很不稳定。我系统安装的是Office 2016,已一路自动升级到了Office 2021。一旦嵌入的 word 失去焦点(比如,点击表单以外的区域,甚至是点击 word 以外的表单内的其他控件或空白区域),word 文字工作区就会一片灰白;原来输入到 word 的文字,都变得不再可见;点击VFP之外区域,整个表单干脆全消失不见,虽然仍停留后台未被销毁(退出VFP时,这表单会一闪而过,意味着它仍像僵尸一样残存于系统内存),但已不可见,不可选中了。如何解决?这问题我也问了 DeepSeek ,它倒是给出了一堆方案,就是感觉比较繁琐,还没来得及试。

只是想啊:

倘若 word 嵌入表单,就是这种衰样表现的话,恐怕此种方式,无多少实用价值!太脆弱,也太易出错啦!
前天 21:59
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:435
专家分:360
注 册:2013-10-4
收藏
得分:0 
以下是引用cssnet在2025-7-18 21:59:44的发言:
一旦嵌入的 word 失去焦点(比如,点击表单以外的区域,甚至是点击 word 以外的表单内的其他控件或空白区域),word 文字工作区就会一片灰白;原来输入到 word 的文字,都变得不再可见……


针对此问题,DeepSeek 给出的方案,真的很有意思,哈哈哈哈!也算得上是脑洞大开!不知哪位天才想出来的!——

方法3:内存位图缓存(最稳定方案)
* -------------------------
* 声明API
DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
DECLARE INTEGER CreateCompatibleBitmap IN gdi32 INTEGER hdc, INTEGER nWidth, INTEGER nHeight
DECLARE INTEGER BitBlt IN gdi32 ;
    INTEGER hDestDC, INTEGER x, INTEGER y, INTEGER nWidth, INTEGER nHeight, ;
    INTEGER hSrcDC, INTEGER xSrc, INTEGER ySrc, INTEGER dwRop

* 在失去焦点时截屏保存
PROCEDURE oleWord.LostFocus
    LOCAL hDC, hBmp
    hDC = CreateCompatibleDC(0)
    hBmp = CreateCompatibleBitmap(hDC, THIS.Width, THIS.Height)
    = BitBlt(THISFORM.picCache.hDC, 0, 0, THIS.Width, THIS.Height, ;
             THIS.hDC, 0, 0, 0x00CC0020)  && SRCCOPY
    THISFORM.lNeedRedraw = .T.
ENDPROC

* 在Paint事件中恢复图像
PROCEDURE oleWord.Paint
    IF THISFORM.lNeedRedraw
        = BitBlt(THIS.hDC, 0, 0, THIS.Width, THIS.Height, ;
                 THISFORM.picCache.hDC, 0, 0, 0x00CC0020)
    ENDIF
ENDPROC

* 专业级效果:实现类似Visual Studio代码编辑器的"僵尸视图"效果
* -------------------------

想想,还真 TM 有可能会奏效咧!
昨天 15:33
wcx_cc
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:440
专家分:1385
注 册:2015-10-2
收藏
得分:0 
51楼说的情况,不知道是采用哪种方式运行?可能打开的方式或嵌入方法有不合适的?
昨天 17:19
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:435
专家分:360
注 册:2013-10-4
收藏
得分:0 
以下是引用wcx_cc在2025-7-19 17:19:16的发言:

51楼说的情况,不知道是采用哪种方式运行?可能打开的方式或嵌入方法有不合适的?


因为你50楼说的是“word 嵌入表单内”,就找了一段【嵌入】的代码来测试,如下。不知你平时用的何种方式嵌入 word 对象?能否列前边几句生成 word 对象的代码来看看?

oform1=NEWOBJECT("form1")
oform1.Show
RETURN
**************************************************
*-- Form:         form1 (e:\vfp\test\Test1.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*
DEFINE CLASS form1 AS form

    Top = 20
    Left = 20
    Height = 700
    Width = 1440
    ShowWindow = 2
    DoCreate = .T.
    AutoCenter = .T.
    Caption = "将word直接嵌入VFP表单中"
    Name = "Form1"

    PROCEDURE Init
        WITH THISFORM
            .ADDOBJECT('oWordDoc','OleControl','Word.Document')
            .oWordDoc.LEFT = 0
            .oWordDoc.TOP = 0
            .oWordDoc.HEIGHT = .HEIGHT
            .oWordDoc.WIDTH = .WIDTH
            .oWordDoc.VISIBLE =  .T.
            * 这一句比较古老,可能不是必须 .oWordDoc.DOVERB(0)
        ENDWITH
    ENDPROC

ENDDEFINE
*
*-- EndDefine: form1
**************************************************

昨天 17:42
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:435
专家分:360
注 册:2013-10-4
收藏
得分:0 
我知道,常规的作法是:

MyWord=CreateObject('Word.Application')
MyWord.Visible=.T.
MyWord.Documents.Add
……

只是那样一来,Word是一个独立窗口,若是最大化或者放在屏幕的某一个角落,那还好说;可若是放在屏幕正中间,四周被其他VFP原生控件所环绕——比如说,窗体布局像个“回”字,中间是word,四周是别人——那么,界面设计就极其困难了!我实在想不出有什么办法,能够协调好word窗口与其他VFP控件的布局关系。

故而,THISFORM.AddObject("oleWord", "OLEControl", "Word.Document"),这样子嵌入Word文档对象,是最最方便处理的方式。只是如此一来,Word瞬间变得好脆弱,好敏感,如同一只弱不禁风的小猫,一有风吹草动就消失无影踪。

呵呵。
昨晚 20:05
wcx_cc
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:440
专家分:1385
注 册:2015-10-2
收藏
得分:0 
a001.rar (3.79 MB)

是不是要这种效果? 纯VFP 的,没有任何第三方插件

[此贴子已经被作者于2025-7-19 22:23编辑过]

昨晚 22:17
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:435
专家分:360
注 册:2013-10-4
收藏
得分:0 
以下是引用wcx_cc在2025-7-19 22:17:07的发言:

是不是要这种效果? 纯VFP 的,没有任何第三方插件


很漂亮!留意到你右半边的 Word 未获得焦点时,文字并未消失,这间接证明了 DeepSeek 给出的方案有其可行性。
我虽不太乐意放置一个 Timer 去实时监测 Word 的焦点状况,只不过既然你能做出来,那就勉为其难也试试呗!
昨晚 22:40
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:435
专家分:360
注 册:2013-10-4
收藏
得分:0 
其实 DeepSeek 一开始给出的方案,就是用一个 Timer 间隔500毫秒实时监测 Word 的焦点,一旦失去焦点,便立刻抢夺焦点,并刷新Word对象的显示。当时我想都没想就拒绝了,事关,在我的表单上已有一个 Timer 间隔500毫秒正实时监测着别的控件,两个 Timer,我怕它们分赃不匀会干架!接着,DeepSeek 这才挖空心思,给出了另外一堆奇奇怪怪、脑洞大开的解决方案。其中,“屏幕截图方案”令我老人家叹为观止!

Timer 实时监测 Word 的焦点方案,还有一个必要前提:表单上没有其他文字输入控件。观察56楼,恰好他的表单上也没有其他TextBox或EditBox。因为若表单中还存在其他文字输入框的话,焦点抢夺将导致其他文字框控件无法做一个安静的美男子,无法顺畅地输入文字。

我试着协调一下,将两个 Timer 合而为一,或许就可以再试试 DeepSeek 最初给出的方案了。
2 小时前
wcx_cc
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:440
专家分:1385
注 册:2015-10-2
收藏
得分:0 
word页面显示,与焦点在哪里没有任何关系。没有timer处理。form内可以放入2个以上的word同时轮番输入,相互之间没有任何影响的。没有其他额外处理,完全等同于多个edite 同页面输入。
41 分钟前
快速回复:话说,VFP有无可用/好用/易用的“Markdown编辑框”控件?
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017319 second(s), 9 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved