如何实现类似Code Insight 的功能.(200分)

  • 主题发起人 主题发起人 nuke
  • 开始时间 开始时间
N

nuke

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi4.0中如果您输入一个".",系统就会搜索并显示一个列表框
里面是相关的类.
我想做一个类似的功能,请问如何得知当前光标所在位置的坐标
(相对与屏幕和相对于父窗口)以提供显示列表框的位置.

还有如何得知当前光标所在位置的字符(字符所在行有中文的话用返回
行列坐标再从string读字符的方法就会出现字符长度问题,如何解决)


请专家坐谈指点啦!!!

:)

200分呀!!!



 
您说的好像和钩子和屏幕抓词有关.
为什么不看看已答问题呢......
<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=10650">这里</a> <a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=62502">这里</a> <a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=97530">还有这里</a>
另外,得知当前光标所在位置的坐标(相对与屏幕和相对于父窗口)
可以看<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=95229">这里</a>. (假设您用RichEdit)
 
不要用屏幕抓词这么复杂的东西.你要实现的东西肯定在一特定的输入控件中,

你只要不停的记录用户在该控件中的输入内容, 再进行判断不是很简单吗?
 
记得有个控件可以实现的,有 SOURCE,我看过,去找一下,
 
我想这是编辑器的功能,正如Borland C++的编辑器一样。
在BC的IDE 中若输入一个BC不认识的字符,则会以红色反显
出来。
Delphi也一样:
1)首先,判断你是否输入了“。”,若不是,继续。若是则:
2)判断“。”前面的字符串(以空格为界)是否是一个“类”,
若不是,继续。若是则:
3)查找该类的所有方法及属性,并创建一个LIST 显示出来。

我想这与屏幕取词毫无关系。屏幕取词是屏幕上先有词,而且
位置不确定。而Code Sight则相反,它是先控制了用户输入的
位置,也掌握了用户输入的内容(用户输入什么,IDE第一个
截取到),所以要在什么位置显示LIST及显示什么类的方法属性
当然很简单了。




 

木4:问题可能不那么简单,还需要分析有关语法,判断类型...
 
我的意思主要是想获得richedit中当前光标所在位置相对于
父窗口和屏幕的象素坐标以供显示一个含ListBox的窗口用.
不是屏幕取词.

对于返回光标('光标'指的是文本插入光标)所在位置的字符串,
我原来是这么解决的,就是用返回的X行Y列坐标去读richedit的
字符串数组,但返回的Y列坐标当此行中出现了汉字就不准了!

请问各位高手如何解决.

一鞠躬!!!!!



 
1.GetCaretPos()可以吗?好象是protected,不过可以继承一个新类的.

2.不太清除您的意思.有汉字时具体情况是怎样的?是不是在汉语版
Windows上把汉字当一个字符了?还是光标位置可能在一个汉字中
间?第一种情况就应该从X行0列开始分析,第二种情况可以先判断
光标下的字符是否是汉字的第一个字节.当然从0列开始分析是最
保险的.
 
1.你不就是想知道"."前的字符串满!,
用户输入的你记下来就行了.遇到空格就清空.
2.你已知道当前的坐标,也可知道RichEdit的Width,
Height.俩者相减,
 
关键就是在如何得到当前插入光标坐标呀!
这个解决了,其他的也不是难事.

我曾试过用GetCaretPos()和clienttoscreen()可是失败了呀!

有谁能试成功(只要能在当前文本插入光标处显示一个小窗口)
200分完全奉送!!!!
 
怎么了!
没人会啦???
只要贴出原代码,200分完全奉送呀!
 
GetCaretPos();
ClinetToScreen();

现在应该没有问题了.
 
我试过了,但是不成呀!
您能不能具体把您的程序写出来造福大众呢?
:)
 
对不起,少写可两个字符.应该是:
::GetCaretPos();
::ClientToScreen();
我试过了,可以的.

<h2>unit1.cpp:</h2>

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::REMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(Button!=mbRight)
return;
POINT p;
if(GetCaretPos(&amp;p)==false)
return;

if(::ClientToScreen(RE->Handle,&amp;p)==false)
return;
PopTest->Popup(p.x,p.y);
}
//---------------------------------------------------------------------------

<h2>unit1.h:</h2>

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TRichEdit *RE;
TPopupMenu *PopTest;
TMenuItem *Test1;
void __fastcall REMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

<h2>unit1.dfm:</h2>

object Form1: TForm1
Left = 192
Top = 112
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object RE: TRichEdit
Left = 16
Top = 12
Width = 425
Height = 281
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Lines.Strings = (
'#include "Unit1.h"'

'//--------------------------------------------------------------' +
'-----'
'--------'
'#pragma package(smart_init)'
'#pragma resource "*.dfm"'
'TForm1 *Form1;'

'//--------------------------------------------------------------' +
'-----'
'--------'
'__fastcall TForm1::TForm1(TComponent* Owner)'
' : TForm(Owner)'
'{'
'}'

'//--------------------------------------------------------------' +
'-----'
'--------'

'void __fastcall TForm1::REMouseDown(TObject *Sender, TMouseButto' +
'n '
'Button,'
' TShiftState Shift, int X, int Y)'
'{'
' POINT p;'
' if(GetCaretPos(&amp;p)==false)'
' return;'
''
' if(::ClientToScreen(RE->Handle,&amp;p)==false)'
' return;'
' PopTest->Popup(p.x,p.y);'
'}')
ParentFont = False
TabOrder = 0
OnMouseDown = REMouseDown
end
object PopTest: TPopupMenu
Left = 472
Top = 140
object Test1: TMenuItem
Caption = 'Test'
end
end
end
 
哇塞!
是C++原程序也!
不过也一样.
加分加分啦!
 
c++的我看不懂!
请问能不能把delphi的源程序发给我!
谢谢!


madoya@sina.com
 

Similar threads

后退
顶部