Einzelnen Beitrag anzeigen

Bernhard Michel

Registriert seit: 2. Apr 2007
2 Beiträge
 
#1

im PropertyEditor Mehtode mittels MehtodenNamen finden

  Alt 26. Feb 2008, 09:34
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;
  Mit Zitat antworten Zitat