[Delphi] TypeInfo verkrijgen voor een willekeurige class

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:02

Tomatoman

Fulltime prutser

Topicstarter
Ik heb zelfgeschreven TAction descendant, die TDBEditAction heet. Die class heeft een property ActionTarget (van het type TComponent), waarmee kan worden ingesteld dat de TDBEditAction zijn actie uitvoert op het ingestelde ActionTarget.

Nu weet TDBEditAction niet met alle TComponent descendants raad. ActionTarget mag daarom alleen een TCustomCombo, TCustomEdit of TCustomListBox (of een descendant daarvan) zijn. De toegestane classes zijn terug te vinden via de ActionTargetClasses property van TDBEditAction. ActionTargetClasses is een TClassList die de drie toegestane classes bevat. Dit werkt allemaal prima.

Nu het werkelijke probleem. In de Object Inspector kun je ActionTarget zoals gebruikelijk instellen via het dropdownlijstje, waarin alle TComponent descendants op het form worden opgesomd. Nu wil ik dit lijstje beperken tot alleen TCustomCombo, TCustomEdit en TCustomListBox descendants. Dan kun je niet bijvoorbeeld een TButton selecteren in het lijstje, die toch niet geaccepteerd wordt.

De oplossing leek me eenvoudig: een property editor schrijven voor de ActionTarget property. Hier is 'ie:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type
  TActionTargetProperty= class(TComponentProperty)
  public
    procedure GetValues(Proc: TGetStrProc); override;
  end;

...

procedure TActionTargetProperty.GetValues(Proc: TGetStrProc);
var
  ActionTargetClasses: TClassList;
  i: Integer;
  P: PTypeInfo;
begin
  { Only show the components that are type-compatible with the items in
    ActionTargetClasses }
  ActionTargetClasses := (GetComponent(0) as TDBEditAction).ActionTargetClasses;
  for i := 0 to ActionTargetClasses.Count - 1 do
  begin
    P := TypeInfo((ActionTargetClasses[i]));     // Geeft een compiler error!
    Designer.GetComponentNames(GetTypeData(P), Proc);
  end;
end;

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(TComponent), TDBEditAction, 'ActionTarget',
    TActionTargetProperty);
end;
Het probleem zet hem in regel 20. De Delphi compiler meldt: "TYPEINFO standard function expects a type identifier". Als ik de regel vervang door bijvoorbeeld
Delphi:
20
    P := TypeInfo(TCustomEdit);

accepteert de compiler het wel. Hoe krijg ik dit toch voor elkaar, zonder in GetValues de toegestane classes hard te coderen?

[ Voor 3% gewijzigd door Tomatoman op 09-08-2005 14:04 ]

Een goede grap mag vrienden kosten.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:02

Tomatoman

Fulltime prutser

Topicstarter
Door een stom toeval kwam ik de oplossing tegen in de TypInfo unit. Daar staat
Delphi:
1
2
3
4
function GetPropList(AObject: TObject; out PropList: PPropList): Integer;
begin
  Result := GetPropList(PTypeInfo(AObject.ClassInfo), PropList);
end;
Een simpele typecast van de class property ClassInfo naar PTypeInfo blijkt dus genoeg. De oplossing voor mijn probleem:
Delphi:
20
    P := PTypeInfo(ActionTargetClasses[i].ClassInfo);

Works like a charm 8)

Een goede grap mag vrienden kosten.