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:
accepteert de compiler het wel. Hoe krijg ik dit toch voor elkaar, zonder in GetValues de toegestane classes hard te coderen?
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:
Het probleem zet hem in regel 20. De Delphi compiler meldt: "TYPEINFO standard function expects a type identifier". Als ik de regel vervang door bijvoorbeeld1
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; |
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.