![]() |
Plugin mit Events über Interfaces
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
habe mich an diesem ![]() Ich benutze zwar nicht die Delphi eigenen TMainMenu Komponenten, sondern die von DevExpress, an sich spielt es aber keine große Rolle. Auszug aus der uApiMainMenu.pas
Delphi-Quellcode:
Interface:
procedure TIMenuItem.MenuItemOnClick(Sender: TObject); // OnClick Event wenn auf das
var // visuelle TMenuItem sprich DevExpress TMenuItem geklickt wird MenuItem: TIMenuItem; begin MenuItem := TIMenuItem.Create(Sender as TdxBarItem); try if (@FNotifyEvent <> nil) then FNotifyEvent.OnNotify(MenuItem); // hier kommt die Zugriffsverletzung finally MenuItem.Free; end; end;
Delphi-Quellcode:
PlugIn:
type
INotifyEvent = interface(IUnknown) ['{EE9407DD-2337-4DFC-BC35-A40C4FA0A1A7}'] procedure OnNotify(const Sender: IUnknown); stdcall; end;
Delphi-Quellcode:
Im Anhang habe ich nochmal den kompletten Code, der die Interfaces implementiert.
type
TNotifyMethod = procedure(const Sender: IUnknown) of object; TINotifyEvent = class(TInterfacedObject, INotifyEvent) private FOnNotify: TNotifyMethod; public property OnNotifyHandler: TNotifyMethod read FOnNotify write FOnNotify; procedure OnNotify(const Sender: IUnknown); stdcall; end; TMirrorSort = class(TAppPlugIn) private // FNotifyEvent:TINotifyEvent; procedure OnClick(const Sender: IUnknown); public function GetName: WideString; override; safecall; function Start(const AAppController: IAppController): Boolean; override; stdcall; procedure Stop; override; stdcall; end; var FAppController: IAppController; FNewMenuItem: IMenuItem; FNotifyEvent: TINotifyEvent; implementation {$R *.dfm} procedure TINotifyEvent.OnNotify; begin // würde es klappen müsste er beim onklick zuerst hier rein springen if (@FOnNotify <> nil) then FOnNotify(Sender); end; procedure TMirrorSort.OnClick; begin // dannach diesen Code ausführen ShowMessage('OnClickFunktioniert ;)'); end; function TMirrorSort.Start; // plugin wurde geladen und aktiviert begin FAppController := AAppController; // bekommt hiermit ein Zugriff auf die Hauptanwendung FNotifyEvent := TINotifyEvent.Create; FNotifyEvent.OnNotifyHandler := OnClick; with FAppController.MainMenu.GetMenuItems.GetItem(3) do FNewMenuItem := InsertMenuItem(GetMenuItems.GetCount, 'MirrorSort', 'This sorts', 'name', 0, 0, FNotifyEvent); Result := True; end; procedure TMirrorSort.Stop; // hiernach wird das plugin entladen begin FAppController.MainMenu.GetMenuItems.GetItem(3).GetMenuItems.RemoveItem(FNewMenuItem); FNotifyEvent := nil; end; EDIT: Problem lag/liegt nicht an diesem Code-Stück... Der Wrapper ist falsch konzipiert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz