请问一下,如何做像Delphi一样的属性提示。 ( 积分: 100 )

  • 主题发起人 主题发起人 willing66
  • 开始时间 开始时间
W

willing66

Unregistered / Unconfirmed
GUEST, unregistred user!
请问一下,如何做像Delphi一样的属性提示。
就像我们在Delphi中编程一样当输入完一个对象后,再输入一个“.”时,就是现在这个对象的属性和方法供我们选择,也可以手工输入,在输入时还会自动进行筛选跳到相应的位置。
最好能提供一个例子,没有例子指点一下方向也行。
 
请问一下,如何做像Delphi一样的属性提示。
就像我们在Delphi中编程一样当输入完一个对象后,再输入一个“.”时,就是现在这个对象的属性和方法供我们选择,也可以手工输入,在输入时还会自动进行筛选跳到相应的位置。
最好能提供一个例子,没有例子指点一下方向也行。
 
cnpack代码自己研究
 
能不能说详细点,这代码在哪有?
 
我写过一个了类似的控件
 
你说的是Code Insight,可以到网上找代码,一般可以另外建立一个Form,然后里面放一个Listbox或者ListView等控件,但是需要对你点的时候当前位置前面的那个单词进行分析,
GetCaretPos();
ClientToScreen();
这个两个函数,它的作用在指定位置弹出一个右键菜单,可以根据这个东西弹出一个非模态form,然后选择,
下面的链接供参考,代码是CB的,但是在Delphi里面差不多,我做了一定修改

http://www.delphibbs.com/delphibbs/dispq.asp?lid=105163

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
RE : TRichEdit;
PopTest:TPopupMenu ;
Test1 : TMenuItem ;
procedure REMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.REMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
P : TPoint;
begin
if Button <> mbRight then Exit;

if not GetCaretPos(P) then Exit;

if not Windows.ClientToScreen(RE.Handle, P) then Exit;

PopTest.Popup(p.x,p.y);
end;

end.

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 = []
ImeName = '中文 (简体) - 拼音加加3.11'
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(&p)==false)'
' return;'
''
' if(::ClientToScreen(RE->Handle,&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
 
我想说的是,我以前有这用GetCaretPos();有得到当前光标的的位置,但是,如果窗体一显示,原来的窗体的焦点就失去了,不能再接收输入了,而变成不是当前的窗体了,键盘就不响应了。
 
cnpack代码
哪里有?
能不能发一份给我,我的邮箱是:willing66@163.com
 
www.cnpack.org
自己下去
 
楼主的我碰到过一次

你设置控件的TControl.ControlState 里面减去csFocusing 就可以了,就不会失去焦点了,楼主可以测试一下
 
谢谢,我回去试试
 
Delphi的是代码感知,具体实现不清楚。
 
有没有什么办法看到Delphi中这部分代码呀
 
网上有很多三方的代码,cnpack就不错,关键还是代码的感知能力,比如一个. 后面的类型匹配等等
 
好的,我会好好去研究cnpack的代码,我现在已经下载到cnpack的源代码了。谢谢!
 
暂时先结帖吧,有还有问以后再问。谢谢大家的帮助!
 
多人接受答案了。
 
后退
顶部