咱们讨论个有点难度的技术问题吧

classfactory 2001-01-01 10:40:00

分数不多可以慢慢加,相信有兴趣的人不会介意。

在诸如Visual C++、Visual Basic等开发工具中,都有智能提示这一功能,就是当你键入xxx.的时候,软件弹出一个列表,提示你可选的属性或方法。我一直想知道如何这一功能(纯兴趣,非商业目的),但是一直未有大的突破。问题主要有两个:

1、如何在最短的时间里正确判断对象类型并将结果添入列表框?我试过,就算不管语法分析的时间,单是列表框(Owner-Draw,为了画出那些图标)填充就很费时。如果内容超过1000项,时延将比较明显。另外,语言分析我也不太懂,毕竟咱不是计算机专业的呀。:)

2、列表数据该如何存储和组织?这是影响效率的另一个关键。比如Visual C++ MFC有很多类,而象CWnd就有n个成员函数,这些数据在硬盘文件里该怎样组织?该什么时候读入内存?在内存中如何组织?

各位网友有兴趣的随便跟个贴子,让这个贴子被更多的人看看。欢迎各位有水平的专家讨论!为中国软件加油!

...全文
1629 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
classfactory 2001-01-05
  • 打赏
  • 举报
回复

在VC中,*.NCB文件是用于支持类信息视图的,有没有人有关于它的格式的资料呀?也许我可以参考。

classfactory 2001-01-05
  • 打赏
  • 举报
回复
guan zhu
classfactory 2001-01-05
  • 打赏
  • 举报
回复

我的部分设计:

class CTipItem
{
DWORD m_dwType; // 提示类型,如属性、方法
CString m_strTip; // 提示内容
CString m_strComment; // 提示注释(可选)
};

typedef CArray<CTipItem, CTipItem&> CBaseTipArray // 提示数组

class CTipArray : public CBaseTipArray // 增加按字母排序的功能(使用插入排序)
{
...
};

CTipArray负责将结果记录集进行排序、存储。CTipListCtrl负责显示结果。它在显示时,根据可视范围从CTipArray取得字符串显示输出。

class CTipListCtrl : public CWnd
{
CTipArray m_arrTip;
...
};

比较费时的操作在于插入时的内存分配和排序功能。欢迎大家对我的设计提意见。

classfactory 2001-01-05
  • 打赏
  • 举报
回复

看来是没人再回了。那准备给分吧。天,现在没几分了。等等吧。僧多粥少。

classfactory 2001-01-05
  • 打赏
  • 举报
回复
f
Ray_czh 2001-01-05
  • 打赏
  • 举报
回复
生成一个新类,就往NCB文件中加入新的类信息。然后程序根据NCB去查,
每次我自动完成功能损坏的时候,我就把NCB干掉,就可以了。
classfactory 2001-01-05
  • 打赏
  • 举报
回复
f
Catamount 2001-01-04
  • 打赏
  • 举报
回复
I am Testing
classfactory 2001-01-04
  • 打赏
  • 举报
回复

To bzshow:

谢谢!真是个好东西。可惜是用Java写的(正准备学习),而且没有设计文档。鬼才看的懂呢。我要是能达到编译器的处理速度该多好,呵呵。 :)

honey505 2001-01-04
  • 打赏
  • 举报
回复
以前做数据库录入界面程序曾经用过,但是那时是每当用户录入一个新字(中文)时,就显示数据
库中相同的下一条记录字段全文,(没有显示列表). 数据库中有6000-8000条记录,一般可以达到
随录随显的感觉,延时0.01-0.1秒. 是用的Delphi,DBF,Filter...
classfactory 2001-01-04
  • 打赏
  • 举报
回复
ji xu
classfactory 2001-01-04
  • 打赏
  • 举报
回复

To _bobo:

你说的一点没错,我想能参与这个问题讨论的人经过思考都会想到这一点。我们的问题在于两点:

1、类(或者说是对象)是分为两类的:预订义的和用户派生的。对于预订义的比较简单,用数据库(自己设计的或使用现有数据库)组织、存储即可。而对于派生的子类提示,肯定是要放在工程配置文件里的,这些信息一方面要用于刷新工程目录(象vc那样),一方面又要用于提示信息的提取,所以其数据结构设计将非常重要——即在硬盘文件中如何组织,读入内存后又如何组织,等等——这决定了软件的效率、可扩充性等。vc的提示信息有时出不来,但删除配置文件后重新打开就恢复,就是如上原因(个人看法)。

2、是否显示提示信息必须经过较严格的语法判断。并不是所有的pView->都是正确的。当然这不可能和编译器做的一样,但是至少不能太傻吧。

欢迎大家继续讨论。open source, open idea!

舟中夜起 2001-01-04
  • 打赏
  • 举报
回复
同意kovaschi,我的感觉是所有提示的东东以做成了数据库,例如CWnd,在提示时,根据CWnd的成员函数的多少处理滑动条的宽窄,然后显示一屏(10项),之后开线程,把CWnd所有项调入内存。同时根据操作来显示各项,如果所用项以调如内存,就用内存中的项,如没有,从数据库读,不知大家注意没有,出来ListBox后,所选项的黄色的tip是比较慢的。
_bobo 2001-01-04
  • 打赏
  • 举报
回复
这个问题不是很难的,如果用编译原理方法做的话是比较好的。如果不熟悉编译原理大家可
参照以下的思路去做。
1、对于定义的变量写在一张表里。如 CView *pView; 可把pView的类型存放在一张变量表里
,从这个变量表我们可获知pView 的特征。
2、在碰到"."或"->"的关键性字符时获取在此之前输入的字符,比如当输入"pView->"时,可获取字符串是"pView"。
3、从变量表里查询pView或取它的特征,可知它是属于CView 类,然后把CView 类的方法和属性
以列表框的方式显示出来。

不知大家有什么高见。
breath 2001-01-04
  • 打赏
  • 举报
回复
把关键字都载入到内存如何
classfactory 2001-01-04
  • 打赏
  • 举报
回复
ji xu
classfactory 2001-01-03
  • 打赏
  • 举报
回复

提醒大家注意一点:在这里,并不是能不能实现的问题(就像我前面提到的那样),而是如何更好的实现它(模块化好、可扩展、可移植、效率高等)。动态提示应该是一项“轻量级”的功能,如果因为判断、分析、显示等处理而较长时间打断用户的操作的话就失去意义了。

事实上,我以前曾经用ListBox做过Demo(没有语法分析,只有填充数据过程),弹出CWnd的提示需要2秒左右。这中间你什么都不能干。我都受不了!

d_154569 2001-01-03
  • 打赏
  • 举报
回复
判断对象类型是编译系统的最基本的东东,我想这个就不用过多地解释了吧!
d_154569 2001-01-03
  • 打赏
  • 举报
回复
数据其实就是你的头文件中的函数、变量或类、结构等等的函数、变量。可能这中间有点语法分析就是你需要确定每个item到底是函数还是变量。
d_154569 2001-01-03
  • 打赏
  • 举报
回复
我对这个问题不是太熟悉,但想发表一点个人看法。vc肯定是动态查出来的,你在类的声明中声明一个变量,然后到实现中this指针一写,刚声明的变量就出来了,不需要任何中间操作。这中间肯定有语义分析,语法分析嘛就没有了。至于怎么画一个框,我的界面水平有限,不知道。
加载更多回复(38)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧