I saw this posting in the following groups:
microsoft.public.dotnet.faqs
microsoft.public.dotnet.framework
microsoft.public.dotnet.framework.interop
microsoft.public.dotnet.framework.windowsforms
microsoft.public.dotnet.framework.windowsforms.controls
microsoft.public.dotnet.languages.csharp
microsoft.public.dotnet.general
When you post a message to multiple groups, please post all of
them at once. That way, if someone in one group provides a
solution, the solution will be posted to all of the groups.
Also, if someone in another group is working on a solution,
they will know it has been solved, and they can work on helping
somebody else.
Thanks,
Robin S.
---------------------------------
[quoted text, click to view] "Tugrul HELVACI" <king_of_delphi@hotmail.com> wrote in message
news:eZz$PX7FHHA.3668@TK2MSFTNGP02.phx.gbl...
>
> I'm using Delphi 2006 and I have a class defination like this:
>
> TPerson = class
> fPersonName : String;
> fPersonSurName : String;
> fPersonAge : Integer;
> published
> property PersonName : String read fPersonName write fPersonName;
> property PersonSurname : String read fPersonSurname write fPersonSurname;
> property PersonAge : Integer read fPersonAge write fPersonAge;
> end;
>
> and i want to display my class instance using PropertyGrid,so...
>
> var
> mPerson : TPerson;
> begin
> mPerson := TPerson.Create;
> mPerson.PersonName := 'Tugrul';
> mPerson.PersonSurname := 'HELVACI';
> mPerson.PersonAge := 31;
> PropertyGrid1.SelectedObject := mPerson;
> end;
>
> at the above code i can see my class instance in the property grid.
> But i want to change property display names in the propertygrid component.
> Because of these, i was searching on the net and i found
> PropertyDescriptor abstract class
> and ICustomTypeConverter interface.
>
> i implemented theese classes following:
>
> TArrayOfAttribute = array of Attribute;
> TMyDescriptor = class(PropertyDescriptor)
> private
> base : PropertyDescriptor;
> fName: String;
>
> function GetName : String;
> function GetDisplayName : String;
> function GetIsReadOnly : Boolean;
> function GetComponentType : &Type;
> function GetPropertyType : &Type;
>
> function GetCustomNames(baseName : String) : String; // my custom names
> getter function
> public
> constructor Create(baseP : PropertyDescriptor; filter :
> TArrayOfAttribute); overload; virtual;
> constructor Create(baseP : PropertyDescriptor); overload; virtual;
>
> function CanResetValue(comp : TObject) : Boolean;
> function GetValue(comp : TObject) : TObject;
>
> procedure ResetValue(comp : TObject);
> procedure SetValue(comp : TObject; Value : TObject);
> function ShouldSerializeValue(comp : TObject) : Boolean;
>
>
> property Name : String read GetName;
> property DisplayName : String read GetDisplayName;
> property IsReadOnly : Boolean read GetIsReadOnly;
> property ComponentType : &Type read GetComponentType;
> property PropertyType : &Type read GetPropertyType;
> end;
>
> TMyClass = class(TInterfacedObject, ICustomTypeDescriptor)
> public
> function GetProperties(filter : TArrayOfAttribute) :
> PropertyDescriptorCollection; overload;
> function GetAttributes : AttributeCollection;
> function GetClassName : String;
> function GetComponentName : String;
> function GetConverter : TypeConverter;
> function GetDefaultEvent : EventDescriptor;
>
> function GetEvents(attributes : TArrayOfAttribute) :
> EventDescriptorCollection; overload;
> function GetEvents : EventDescriptorCollection; overload;
> function GetDefaultProperty : PropertyDescriptor;
>
> function GetProperties : PropertyDescriptorCollection; overload;
> function GetEditor(editorBaseType : System.Type) : TObject;
> function GetPropertyOwner(pd : PropertyDescriptor) : TObject;
> end;
>
>
> and my new TPerson class is:
> TPerson = class(TMyClass)
> fPersonName : String;
> fPersonSurName : String;
> fPersonAge : Integer;
> published
> property PersonName : String read fPersonName write fPersonName;
> property PersonSurname : String read fPersonSurname write
> fPersonSurname;
> property PersonAge : Integer read fPersonAge write fPersonAge;
> end;
>
> **************** IMPLEMENTATIONS BELOW *********************************
> { TMyDescriptor }
>
> function TMyDescriptor.CanResetValue(comp: TObject): Boolean;
> begin
> Result := base.CanResetValue(comp);
> end;
>
>
> constructor TMyDescriptor.Create(baseP: PropertyDescriptor;
> filter: TArrayOfAttribute);
> begin
> inherited Create(baseP, filter);
> Self.base := baseP;
> end;
>
> constructor TMyDescriptor.Create(baseP: PropertyDescriptor);
> begin
> inherited Create(baseP);
> Self.base := baseP;
> end;
>
> function TMyDescriptor.GetComponentType: &Type;
> begin
> Result := base.ComponentType;
> end;
>
> function TMyDescriptor.GetDisplayName: String;
> begin
> Result := GetCustomNames(base.Name);
> end;
>
> function TMyDescriptor.Getir(baseName : String): String;
> begin
> if baseName = 'PersonName' then Result := 'Names of the Personel';
> if baseName = 'PersonSurname' then Result := 'Surname of the personel';
> if baseName = 'PersonAge' then Result := 'Age of the personel';
> end;
>
> function TMyDescriptor.GetIsReadOnly: Boolean;
> begin
> Result := base.IsReadOnly;
> end;
>
> function TMyDescriptor.GetName: String;
> begin
> Result := base.Name;
> end;
>
>
> function TMyDescriptor.GetPropertyType: &Type;
> begin
> Result := base.PropertyType;
> end;
>
> function TMyDescriptor.GetValue(comp: TObject): TObject;
> begin
> Result := base.GetValue(comp);
> end;
>
>
> procedure TMyDescriptor.ResetValue(comp: TObject);
> begin
> base.ResetValue(comp);
> end;
>
> procedure TMyDescriptor.SetValue(comp, Value: TObject);
> begin
> base.SetValue(comp, value);
> end;
>
> function TMyDescriptor.ShouldSerializeValue(comp: TObject): Boolean;
> begin
> Result := base.ShouldSerializeValue(comp);
> end;
>
> { TMyClass }
>
> function TMyClass.GetProperties(
> filter: TArrayOfAttribute): PropertyDescriptorCollection;
> var
> baseProps : PropertyDescriptorCollection;
> newProps : array of PropertyDescriptor;
> iCounter : Integer;
> oldname,
> newname : String;
> begin
> baseProps := TypeDescriptor.GetProperties(GetType(), filter);
>
> SetLength(newProps, baseProps.Count);
>
> for iCounter := 0 to baseProps.Count do
> begin
> newProps[iCounter] := TMyDescriptor.Create(baseProps[iCounter],
> filter); // An error occured : E2402 constructing instance of abstract
> class..
> oldname := PropertyDescriptor(baseProps[iCounter]).DisplayName;
> newName := TMyDescriptor(newProps[iCounter]).DisplayName;
> end;
>
> Result := PropertyDescriptorCollection.Create(newProps);
> end;
>
I'm using Delphi 2006 and I have a class defination like this:
TPerson = class
fPersonName : String;
fPersonSurName : String;
fPersonAge : Integer;
published
property PersonName : String read fPersonName write fPersonName;
property PersonSurname : String read fPersonSurname write fPersonSurname;
property PersonAge : Integer read fPersonAge write fPersonAge;
end;
and i want to display my class instance using PropertyGrid,so...
var
mPerson : TPerson;
begin
mPerson := TPerson.Create;
mPerson.PersonName := 'Tugrul';
mPerson.PersonSurname := 'HELVACI';
mPerson.PersonAge := 31;
PropertyGrid1.SelectedObject := mPerson;
end;
at the above code i can see my class instance in the property grid.
But i want to change property display names in the propertygrid component.
Because of these, i was searching on the net and i found PropertyDescriptor
abstract class
and ICustomTypeConverter interface.
i implemented theese classes following:
TArrayOfAttribute = array of Attribute;
TMyDescriptor = class(PropertyDescriptor)
private
base : PropertyDescriptor;
fName: String;
function GetName : String;
function GetDisplayName : String;
function GetIsReadOnly : Boolean;
function GetComponentType : &Type;
function GetPropertyType : &Type;
function GetCustomNames(baseName : String) : String; // my custom names
getter function
public
constructor Create(baseP : PropertyDescriptor; filter :
TArrayOfAttribute); overload; virtual;
constructor Create(baseP : PropertyDescriptor); overload; virtual;
function CanResetValue(comp : TObject) : Boolean;
function GetValue(comp : TObject) : TObject;
procedure ResetValue(comp : TObject);
procedure SetValue(comp : TObject; Value : TObject);
function ShouldSerializeValue(comp : TObject) : Boolean;
property Name : String read GetName;
property DisplayName : String read GetDisplayName;
property IsReadOnly : Boolean read GetIsReadOnly;
property ComponentType : &Type read GetComponentType;
property PropertyType : &Type read GetPropertyType;
end;
TMyClass = class(TInterfacedObject, ICustomTypeDescriptor)
public
function GetProperties(filter : TArrayOfAttribute) :
PropertyDescriptorCollection; overload;
function GetAttributes : AttributeCollection;
function GetClassName : String;
function GetComponentName : String;
function GetConverter : TypeConverter;
function GetDefaultEvent : EventDescriptor;
function GetEvents(attributes : TArrayOfAttribute) :
EventDescriptorCollection; overload;
function GetEvents : EventDescriptorCollection; overload;
function GetDefaultProperty : PropertyDescriptor;
function GetProperties : PropertyDescriptorCollection; overload;
function GetEditor(editorBaseType : System.Type) : TObject;
function GetPropertyOwner(pd : PropertyDescriptor) : TObject;
end;
and my new TPerson class is:
TPerson = class(TMyClass)
fPersonName : String;
fPersonSurName : String;
fPersonAge : Integer;
published
property PersonName : String read fPersonName write fPersonName;
property PersonSurname : String read fPersonSurname write fPersonSurname;
property PersonAge : Integer read fPersonAge write fPersonAge;
end;
**************** IMPLEMENTATIONS BELOW *********************************
{ TMyDescriptor }
function TMyDescriptor.CanResetValue(comp: TObject): Boolean;
begin
Result := base.CanResetValue(comp);
end;
constructor TMyDescriptor.Create(baseP: PropertyDescriptor;
filter: TArrayOfAttribute);
begin
inherited Create(baseP, filter);
Self.base := baseP;
end;
constructor TMyDescriptor.Create(baseP: PropertyDescriptor);
begin
inherited Create(baseP);
Self.base := baseP;
end;
function TMyDescriptor.GetComponentType: &Type;
begin
Result := base.ComponentType;
end;
function TMyDescriptor.GetDisplayName: String;
begin
Result := GetCustomNames(base.Name);
end;
function TMyDescriptor.Getir(baseName : String): String;
begin
if baseName = 'PersonName' then Result := 'Names of the Personel';
if baseName = 'PersonSurname' then Result := 'Surname of the personel';
if baseName = 'PersonAge' then Result := 'Age of the personel';
end;
function TMyDescriptor.GetIsReadOnly: Boolean;
begin
Result := base.IsReadOnly;
end;
function TMyDescriptor.GetName: String;
begin
Result := base.Name;
end;
function TMyDescriptor.GetPropertyType: &Type;
begin
Result := base.PropertyType;
end;
function TMyDescriptor.GetValue(comp: TObject): TObject;
begin
Result := base.GetValue(comp);
end;
procedure TMyDescriptor.ResetValue(comp: TObject);
begin
base.ResetValue(comp);
end;
procedure TMyDescriptor.SetValue(comp, Value: TObject);
begin
base.SetValue(comp, value);
end;
function TMyDescriptor.ShouldSerializeValue(comp: TObject): Boolean;
begin
Result := base.ShouldSerializeValue(comp);
end;
{ TMyClass }
function TMyClass.GetProperties(
filter: TArrayOfAttribute): PropertyDescriptorCollection;
var
baseProps : PropertyDescriptorCollection;
newProps : array of PropertyDescriptor;
iCounter : Integer;
oldname,
newname : String;
begin
baseProps := TypeDescriptor.GetProperties(GetType(), filter);
SetLength(newProps, baseProps.Count);
for iCounter := 0 to baseProps.Count do
begin
newProps[iCounter] := TMyDescriptor.Create(baseProps[iCounter], filter);
// An error occured : E2402 constructing instance of abstract class..
oldname := PropertyDescriptor(baseProps[iCounter]).DisplayName;
newName := TMyDescriptor(newProps[iCounter]).DisplayName;
end;
Result := PropertyDescriptorCollection.Create(newProps);
end;
function TMyClass.GetAttributes: AttributeCollection;
begin
Result := TypeDescriptor.GetAttributes(Self, true);
end;
function TMyClass.GetClassName: String;
begin
Result := TypeDescriptor.GetClassName(Self, true);
end;
function TMyClass.GetComponentName: String;
begin
Result := TypeDescriptor.GetComponentName(Self, true);
end;
function TMyClass.GetConverter: TypeConverter;
begin
Result := TypeDescriptor.GetConverter(Self, true);
end;
function TMyClass.GetDefaultEvent: EventDescriptor;
begin
Result := TypeDescriptor.GetDefaultEvent(Self, true);
end;
function TMyClass.GetDefaultProperty: PropertyDescriptor;
begin
Result := TypeDescriptor.GetDefaultProperty(Self, true);
end;
function TMyClass.GetEditor(editorBaseType: System.Type): TObject;
begin
Result := TypeDescriptor.GetEditor(Self, editorBaseType, true);
end;
function TMyClass.GetEvents: EventDescriptorCollection;
begin
Result := TypeDescriptor.GetEvents(Self, true);
end;
function TMyClass.GetEvents(
attributes: TArrayOfAttribute): EventDescriptorCollection;
begin
Have you any idea for my question ?
[quoted text, click to view] "RobinS" <RobinS@NoSpam.yah.none> wrote in message
news:E_-dndtmnbaB_unYnZ2dnUVZ_t2dnZ2d@comcast.com...
>I saw this posting in the following groups:
>
> microsoft.public.dotnet.faqs
> microsoft.public.dotnet.framework
> microsoft.public.dotnet.framework.interop
> microsoft.public.dotnet.framework.windowsforms
> microsoft.public.dotnet.framework.windowsforms.controls
> microsoft.public.dotnet.languages.csharp
> microsoft.public.dotnet.general
>
> When you post a message to multiple groups, please post all of
> them at once. That way, if someone in one group provides a
> solution, the solution will be posted to all of the groups.
> Also, if someone in another group is working on a solution,
> they will know it has been solved, and they can work on helping
> somebody else.
>
> Thanks,
> Robin S.
> ---------------------------------
> "Tugrul HELVACI" <king_of_delphi@hotmail.com> wrote in message
> news:eZz$PX7FHHA.3668@TK2MSFTNGP02.phx.gbl...
>>
>> I'm using Delphi 2006 and I have a class defination like this:
>>
>> TPerson = class
>> fPersonName : String;
>> fPersonSurName : String;
>> fPersonAge : Integer;
>> published
>> property PersonName : String read fPersonName write fPersonName;
>> property PersonSurname : String read fPersonSurname write
>> fPersonSurname;
>> property PersonAge : Integer read fPersonAge write fPersonAge;
>> end;
>>
>> and i want to display my class instance using PropertyGrid,so...
>>
>> var
>> mPerson : TPerson;
>> begin
>> mPerson := TPerson.Create;
>> mPerson.PersonName := 'Tugrul';
>> mPerson.PersonSurname := 'HELVACI';
>> mPerson.PersonAge := 31;
>> PropertyGrid1.SelectedObject := mPerson;
>> end;
>>
>> at the above code i can see my class instance in the property grid.
>> But i want to change property display names in the propertygrid
>> component.
>> Because of these, i was searching on the net and i found
>> PropertyDescriptor abstract class
>> and ICustomTypeConverter interface.
>>
>> i implemented theese classes following:
>>
>> TArrayOfAttribute = array of Attribute;
>> TMyDescriptor = class(PropertyDescriptor)
>> private
>> base : PropertyDescriptor;
>> fName: String;
>>
>> function GetName : String;
>> function GetDisplayName : String;
>> function GetIsReadOnly : Boolean;
>> function GetComponentType : &Type;
>> function GetPropertyType : &Type;
>>
>> function GetCustomNames(baseName : String) : String; // my custom
>> names getter function
>> public
>> constructor Create(baseP : PropertyDescriptor; filter :
>> TArrayOfAttribute); overload; virtual;
>> constructor Create(baseP : PropertyDescriptor); overload; virtual;
>>
>> function CanResetValue(comp : TObject) : Boolean;
>> function GetValue(comp : TObject) : TObject;
>>
>> procedure ResetValue(comp : TObject);
>> procedure SetValue(comp : TObject; Value : TObject);
>> function ShouldSerializeValue(comp : TObject) : Boolean;
>>
>>
>> property Name : String read GetName;
>> property DisplayName : String read GetDisplayName;
>> property IsReadOnly : Boolean read GetIsReadOnly;
>> property ComponentType : &Type read GetComponentType;
>> property PropertyType : &Type read GetPropertyType;
>> end;
>>
>> TMyClass = class(TInterfacedObject, ICustomTypeDescriptor)
>> public
>> function GetProperties(filter : TArrayOfAttribute) :
>> PropertyDescriptorCollection; overload;
>> function GetAttributes : AttributeCollection;
>> function GetClassName : String;
>> function GetComponentName : String;
>> function GetConverter : TypeConverter;
>> function GetDefaultEvent : EventDescriptor;
>>
>> function GetEvents(attributes : TArrayOfAttribute) :
>> EventDescriptorCollection; overload;
>> function GetEvents : EventDescriptorCollection; overload;
>> function GetDefaultProperty : PropertyDescriptor;
>>
>> function GetProperties : PropertyDescriptorCollection; overload;
>> function GetEditor(editorBaseType : System.Type) : TObject;
>> function GetPropertyOwner(pd : PropertyDescriptor) : TObject;
>> end;
>>
>>
>> and my new TPerson class is:
>> TPerson = class(TMyClass)
>> fPersonName : String;
>> fPersonSurName : String;
>> fPersonAge : Integer;
>> published
>> property PersonName : String read fPersonName write fPersonName;
>> property PersonSurname : String read fPersonSurname write
>> fPersonSurname;
>> property PersonAge : Integer read fPersonAge write fPersonAge;
>> end;
>>
>> **************** IMPLEMENTATIONS BELOW *********************************
>> { TMyDescriptor }
>>
>> function TMyDescriptor.CanResetValue(comp: TObject): Boolean;
>> begin
>> Result := base.CanResetValue(comp);
>> end;
>>
>>
>> constructor TMyDescriptor.Create(baseP: PropertyDescriptor;
>> filter: TArrayOfAttribute);
>> begin
>> inherited Create(baseP, filter);
>> Self.base := baseP;
>> end;
>>
>> constructor TMyDescriptor.Create(baseP: PropertyDescriptor);
>> begin
>> inherited Create(baseP);
>> Self.base := baseP;
>> end;
>>
>> function TMyDescriptor.GetComponentType: &Type;
>> begin
>> Result := base.ComponentType;
>> end;
>>
>> function TMyDescriptor.GetDisplayName: String;
>> begin
>> Result := GetCustomNames(base.Name);
>> end;
>>
>> function TMyDescriptor.Getir(baseName : String): String;
>> begin
>> if baseName = 'PersonName' then Result := 'Names of the Personel';
>> if baseName = 'PersonSurname' then Result := 'Surname of the personel';
>> if baseName = 'PersonAge' then Result := 'Age of the personel';
>> end;
>>
>> function TMyDescriptor.GetIsReadOnly: Boolean;
>> begin
>> Result := base.IsReadOnly;
>> end;
>>
>> function TMyDescriptor.GetName: String;
>> begin
>> Result := base.Name;
>> end;
>>
>>
>> function TMyDescriptor.GetPropertyType: &Type;
>> begin
>> Result := base.PropertyType;
>> end;
>>
>> function TMyDescriptor.GetValue(comp: TObject): TObject;
>> begin
>> Result := base.GetValue(comp);
>> end;
>>
>>
>> procedure TMyDescriptor.ResetValue(comp: TObject);
>> begin
>> base.ResetValue(comp);
>> end;
>>
>> procedure TMyDescriptor.SetValue(comp, Value: TObject);
>> begin
>> base.SetValue(comp, value);
>> end;
>>
>> function TMyDescriptor.ShouldSerializeValue(comp: TObject): Boolean;
>> begin
>> Result := base.ShouldSerializeValue(comp);
>> end;
>>
>> { TMyClass }
>>
>> function TMyClass.GetProperties(
>> filter: TArrayOfAttribute): PropertyDescriptorCollection;
>> var
>> baseProps : PropertyDescriptorCollection;
>> newProps : array of PropertyDescriptor;
>> iCounter : Integer;
>> oldname,
>> newname : String;
>> begin
>> baseProps := TypeDescriptor.GetProperties(GetType(), filter);
>>
>> SetLength(newProps, baseProps.Count);
>>
>> for iCounter := 0 to baseProps.Count do
>> begin
Don't see what you're looking for? Try a search.