Hallo,
habe einen PropertyEditor zur Erstellung einer EreignisbehandlungsRoutine geschrieben. Wenn man also im
OI auf "OnCheckInteger" (ähnlich wie z.B. OnFormCreate) clickt, wird eine Ereignisroutine erstellt und im Property "OnCheckInteger" eingetragen und die EingabeMarke an die neu erzeugte Routine gestellt. Folgender Code macht das schon einwandfrei.
jetzt möchte ich eine andere Mehtode in "OnCheckInteger" eingtagen. es wird mir eine Liste mit den passenden Methoden angeboten. ich wähle eine aus. in TPropertyEditro.SetValue muss nun aus dem Übergebenen Value:string die Mehtode mit diesem Namen gefunden werden; aber wie???
???? wie finde ich die Methode; der Name=value ist bekannt;
???? auch der Owner in der
Unit, in der die Mehtode steht ist bekannt;
???? es müsste so etwas sein wie Designer.MethodExists('MethodenName')
???? leider wird hier nur Boolean zurück gegeben und nicht die Mehtode;
???? p1 := TMyComponentOwnerAusUnit.MethodAddress(value); liefert nil
Delphi-Quellcode:
TAAAPrEdTDomainValue =
class(TPropertyEditor)
private
function GetAttributes: TPropertyAttributes;
override;
procedure GetValues(Proc: TGetStrProc) ;
override;
function GetValue:
string ;
override;
procedure SetValue(
const Value:
string) ;
override;
procedure Edit;
override;
end;
function TAAAPrEdTDomainValue.GetAttributes: TPropertyAttributes;
begin
//es soll eine AusWahlListge angezeigt werden; das funktioniert
if GetName = '
OnCheckInteger'
then Result := [paValueList]
end;
procedure TAAAPrEdTDomainValue.GetValues(Proc: TGetStrProc);
begin
//findet alle passenden Routinen und listet sie auf; geht auch
if GetName = '
OnCheckInteger'
then Designer.GetMethods(GetTypeData(GetPropType),Proc);
end;
function TAAAPrEdTDomainValue.GetValue:
string;
begin
//gibt den MethodenNamen der in "OnCheckInteger" eingetragenen Routine wieder; funktioniert
if GetName = '
OnCheckInteger'
then Result := Designer.GetMethodName(GetMethodValue);
end;
procedure TAAAPrEdTDomainValue.Edit;
begin
//erstellt eine Routine/Mehtode in der aktuellen Unit mit dem Namen 'MyCheckInteger' vom Typ GetPropType
//und wird in den ProdeurenZeiger TMyCollectionItem(GetComponent(0).OnCheckInteger eingetragen
//das funktioniert
if GetName = '
OnCheckInteger'
then begin
TMyCollectionItem(GetComponent(0).OnCheckInteger :=
TCheckInteger(Designer.CreateMethod
('
MyCheckInteger',GetTypeData(GetPropType)));
//die Eingabe Marke wird auf die Procedure/Methode "MyCheckInteger" gesetzt; das funktioniert
Designer.ShowMethod('
MyCheckInteger');
end;
end;
procedure TAAAPrEdTDomainValue.SetValue(
const Value:
string);
var p1:pointer;
begin
if GetName = '
OnCheckInteger'
then begin
TMyCollectionItem(GetComponent(0).OnCheckInteger :=
???? wie finde ich die Methode; der Name=value ist bekannt;
???? auch der Owner
in der
Unit,
in der die Mehtode steht ist bekannt;
???? es müsste so etwas sein wie Designer.MethodExists('
MethodenName')
???? leider wird hier nur Boolean zurück gegeben und nicht die Mehtode;
???? p1 := TMyComponentOwnerAusUnit.MethodAddress(value); liefert
nil
end;
end;