如何在运行时创建属性编辑器并使用?(100分)

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

wgqsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,
创建属性编辑器时,它的创建参数不知道怎么填!
TPropertyEditor.Create(ADesigner: IDesigner; PropCount: Integer);
这个 IDesigner 设计者怎么半, 还有属性个数怎么办?

顺便问一下: GetComponentProperties 这个函数怎么用, 什么功能?
 
到www.2ccc.com下个属性编辑器来看看,就知道了
 
作个属性编辑器,我还是比较熟悉的!但是在 Delphi IDE 中运行的属性编辑器,是不需要程序员来创建的,是由 IDE 来创建的,但 Delphi 又没给出源代码, 我需要的是,如何在我的程序中,既运行时的程序,而不是设计时运行的程序,中创建属性编辑器!
 
看看这个,是不是这样的啊,我用的是cxVerticalGrid,用作自定义查询,动态创建条件选项,可以根据配置创建不同类型的编辑字段,如字符串、日期、combobox、checkcombobox等等,这个控件功能很强大。
地址:http://www.thehomesoft.com/1.bmp
 
好像DEVPRESS这套控件里有一个Inspector 什么的控件,可以编辑,全称记不住了.
 
to wolfding:你所说的cxVerticalGrid是什么控件,怎么到网上没搜到?
 
就是大名鼎鼎的devexpress系列控件里的一员,在所有的能下载delphi控件的地方都可以找得到。
 
to wolfding:是数据感知的吗?我怎么只用过cxGrid?
 
cxVerticalGrid不是数据感知的,有一个数据感知的叫cxDBVerticalGrid,至于你为什么只用过cxGrid,呵呵,这个问题我就没法回答了:)
把我写的这段代码贴上吧,它的编辑格有很多类型,我只用了三种:
procedure TClasQuery.SetOptionGrid(Grid: TcxVerticalGrid);
var
i, j : Integer;
QueryOption : TQueryOptionList;
AOption : TQueryOption;
ARow : TcxEditorRow;
DataType, ObjKind : Char;
List : TSimpleObjList;
begin
Grid.ClearRows;
QueryOption := FQuerySet.OptionList;
for i := 0 to QueryOption.Count - 1 do
begin
AOption := QueryOption.QueryOptions;
ARow := TcxEditorRow(Grid.Add(TcxEditorRow));
ARow.Properties.Caption := AOption.StringByName['title'];
ARow.Tag := Integer(AOption);
DataType := (AOption.StringByName['data_type'] + ' ')[1];
ObjKind := (AOption.StringByName['obj_kind'] + ' ')[1];
// 根据DataType设置数据类型
case DataType of
'0' : ARow.Properties.DataBinding.ValueType := 'String';
'1' : ARow.Properties.DataBinding.ValueType := 'Integer';
'2' : ARow.Properties.DataBinding.ValueType := 'DateTime';
'3' : ARow.Properties.DataBinding.ValueType := 'DateTime';
'4' : ARow.Properties.DataBinding.ValueType := 'DateTime';
'5' : ARow.Properties.DataBinding.ValueType := 'DateTime';
'6' : ARow.Properties.DataBinding.ValueType := 'Currency';
'7' : ARow.Properties.DataBinding.ValueType := 'Boolean';
else
raise
Exception.Create('条件 <' + AOption.StringByName['title'] + '> 未设置数据类型');
end;

// 如果有对象,则根据是否可以多选,把该行设置为ComboBox和CheckComboBox
if (ObjKind <> '0') then
begin
// 根据对象类型配置,定位要用的对象
List := GetListObj(ObjKind, '0', AOption.FieldByName['dict_entry']);

ARow.Properties.DataBinding.Data := List;
if (AOption.StringByName['multi_select'] = '1') then
begin
ARow.Properties.EditPropertiesClass := TcxCheckComboBoxProperties;
with TcxCheckComboBoxProperties(ARow.Properties.EditProperties) do
begin
EmptySelectionText := '<无限制>';
EditValueFormat := cvfInteger;
for j := 0 to List.Count - 1 do
begin
with Items.Add do
begin
Description := List.Objs[j].StringByName[AOption.StringByName['display_segment']];
//ShortDescription := List.Objs[j].StringByName[AOption.StringByName['value_segment']];
Tag := Integer(List.Objs[j]);
end;
end;
end;
end
else
begin
ARow.Properties.EditPropertiesClass := TcxComboBoxProperties;
with TcxComboBoxProperties(ARow.Properties.EditProperties) do
begin
DropDownListStyle := lsFixedList;
for j := 0 to List.Count - 1 do
Items.AddObject(List.Objs[j].StringByName[AOption.StringByName['display_segment']],
List.Objs[j]);
end;
end;
end;
end;
end;
 
这是哪个控件集的?比如ExpressQuantumGrid Suite v5.0,我用的就是这个控件集。
 
两个问题你都可以看看这里:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2423144
 
也想知道.
 
Inspector是那个控件的,咱也研究一下。
 
我看了一下 DevExpress 里的 Inspector 控件,他也不是用的 Delphi 里的属性编辑器,全是自己作的属性编辑器,我想利用 Delphi 里的现成的属性编辑器,可就是不知道怎么创建!
 
不知道楼住想做什么东西,需要用到propertyEditor
不妨看看这个 http://www.delphibbs.com/delphibbs/dispq.asp?lid=3315314
[:D]
 
---------------------------------------------------------------
我看了一下 DevExpress 里的 Inspector 控件,他也不是用的 Delphi 里的属性编辑器,全是自己作的属性编辑器,我想利用 Delphi 里的现成的属性编辑器,可就是不知道怎么创建!
---------------------------------------------------------------
等你创建了,估计台湾也回归了。。。
网上有很多类似的控件,如鼎鼎大名的Dream controls,或者上面那位仁兄提到的,都可以。
 
我想搂主是打算用代码来枚举一个对象的所有属性,然后对这些属性进行编辑,最后修改掉原来的对象的属性值,我转贴一个被我以前证实过的一个可行的帖子,希望对你有帮助

{注:代码来源于 macro cantu 的 《Delphi 3 高级开发指南》 第4章 运行时类型消息,略有更改}


unit Unit1;

interface

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

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1 : TForm1;

implementation

uses
TypInfo;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
pProps : PPropList;
nTotalProps, nProps, I : Longint;
begin
nTotalProps := GetTypeData(ClassInfo).PropCount; //读取 VMT 中的类型消息
GetMem(pProps, SizeOf(PPropInfo) * nTotalProps); //分配类型接收缓冲
try
nProps := GetPropList(ClassInfo,
[tkEnumeration], pProps); //获取 VMT 中枚举型属性表, 第二个参数是一个 TTypeKind,Pascal 类型表

for I := 0 to nProps - 1 do
ComboBox1.Items.Add(pProps.Name); //获取每个枚举型类型名
finally
FreeMem(pProps, SizeOf(PPropInfo) * nTotalProps);
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
PropName : string;
PropInfo : PPropInfo;
ptd : PTypeData;
I : Longint;
PropValue : Longint;
begin
if Combobox1.Text <> '' then
PropName := ComboBox1.Text else Exit;

ListBox1.Items.Clear;
PropInfo := GetPropInfo(ClassInfo, PropName);
ptd := GetTypeData(PropInfo.PropType^); //获取选取项的类型消息
for I := ptd.MinValue to ptd.MaxValue do
ListBox1.Items.Add(GetEnumName(PropInfo.PropType^, I));
//上面这一段获取类型名:在结构 TTypeData 中,对于 枚举项,保存了一个
//NameList: ShortStringBase 表,看来是保存枚举项的名称的。
PropValue := GetOrdProp(Self, PropInfo);
ListBox1.ItemIndex := ptd.MinValue + PropValue;
end;

end.

结束。
 
没错!我是想实现运行时修改对象的属性!其他的我都实现了,包括自己定义一系列的属性编辑器!并实现了用自己作的属性编辑器来编辑大部分的属性,可是我现在就是想知道 Delphi 中定义的属性编辑器到底怎么样在运行时创建!
 

Similar threads

后退
顶部