Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Event zur DesignTime benutzen (https://www.delphipraxis.net/110019-event-zur-designtime-benutzen.html)

arbu man 11. Mär 2008 18:10


Event zur DesignTime benutzen
 
Hallo,

ich möchte eine Komponente schreiben. Diese Komponente hat eine Collection. Jedes Item dieser Collection soll nun ein Event haben. Soweit klappt auch alles, wenn ich jedoch im OI dieses Event benutzen will erhalte ich folgende Meldung: "Für eine unbekannt Komponente kann keine Methode erstellt werden.". Was muss ich machen um Events nutzen zu können ?

mfg, Björn

mkinzler 11. Mär 2008 18:39

Re: Event zur DesignTime benutzen
 
Auf welchen Typ willst du den Event denn binden?

arbu man 11. Mär 2008 19:48

Re: Event zur DesignTime benutzen
 
Ich habe für das Event einen Eigenen Typ definiert:
Delphi-Quellcode:
  TExecuteFunction = procedure(Sender: TObject; const AParams: array of Variant;
      var ReturnValue: Variant) of object;
Das Event selbst ist eine einfache property:
Delphi-Quellcode:
  published
    ...
    property OnExecute: TExecuteFunction read FOnExecute write FOnExecute;
  end;

mkinzler 11. Mär 2008 20:16

Re: Event zur DesignTime benutzen
 
Und für welche Komponente?

bluesbear 11. Mär 2008 20:41

Re: Event zur DesignTime benutzen
 
Die Deklaration des Events scheint mir völlig OK, aber die Fehlermeldung ist sehr merkwürdig. Wieso ist die Komponente "unbekannt"? :gruebel:

arbu man 11. Mär 2008 21:00

Re: Event zur DesignTime benutzen
 
Also ich habe eine normale Komponente die halt eine Collection hat...
Delphi-Quellcode:
type
  TScriptFunctions = class;

  TScriptFunction = class(TCollectionItem)
  private
    FOwner: TScriptFunctions;
    FFunctionName: string;
    FOnExecute: TExecuteFunction;
    FOnAfterCall: TNotifyEvent;
    procedure SetOnAfterCall(const Value: TNotifyEvent);
  protected
    function GetDisplayName: string; override;
  public
    constructor Create(ACollection: TCollection); override;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
  published
    property FunctionName: string read FFunctionName write FFunctionName;
    property OnExecute: TExecuteFunction read FOnExecute write FOnExecute;
  end;

  { TScriptFunctions }

  TScriptFunctions = class(TCollection)
  private
    function GetItem(Index: Integer): TScriptFunction;
    procedure SetItem(Index: Integer; Value: TScriptFunction);
  public
    constructor Create;
    destructor Destroy; override;
    function Add: TScriptFunction;
    function CountFunctionName(const AFunctionName: string): integer;
    function FindFunctionName(const AFunctionName: string): TScriptFunction;
    procedure ListFunctionName(const AList: TStrings);
    property Items[Index: Integer]: TScriptFunction read GetItem write SetItem; default;
  end;

  TScriptEngine = class(TComponent)
  private
    FFunctions: TScriptFunctions;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Functions: TScriptFunctions read FFunctions;
  end;
Warum die Komponente unbekannt sein soll kann ich mir nicht erklären, ich ziehe die Komponente über die Palette auf die Form. Vielleicht könnte es daran liegen das die Klassen TScriptFunctions und TScriptFunction nirgentwo Registriert werden, wenn das überhaupt möglich ist diese zu registrieren.

arbu man 13. Mär 2008 13:41

Re: Event zur DesignTime benutzen
 
Schieb :duck:

bluesbear 13. Mär 2008 14:35

Re: Event zur DesignTime benutzen
 
Also ich würde sagen, Du musst Deiner TScriptEngine einen published event OnExecute verpassen, und die OnExecute der TScriptFunction->Objekte entsprechend durchreichen.
Das Du im OI überhaupt so weit kommst eine Fehlermeldung zu erhalten.. :gruebel:
Wird da etwa im OI das OnExecute der TScriptFunction angezeigt??? Das wär ja krass! :stupid:

arbu man 28. Mär 2008 20:01

Re: Event zur DesignTime benutzen
 
Ich hab es jetzt geschafft, der Fehler lag darin das die Collection von TCollection abgeleitet war. Damit man Events benutzen kann muss man die Collection von TOwnedCollection ableiten.

mfg, Björn


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz