AW: Menu funktionalität ohne MainMenu
Danke für die Antworten...
HotKey nach dem Motto STRG+F2 sind kein Thema sondern eher z.B. Alt+A Wenn ich in "Meinem Menu" Alt-A drin stehen habe, soll das natürlich nur ausgelöst werden, wenn nicht ein anderes (MDI-Child) Fenster nicht auch ALT+A benutzt um zum Beinspiel einen Button "@Aufrufen" aus zu lösen. Ich muss also wissen ob der Accelerator schon "verbraucht" ist. |
AW: Menu funktionalität ohne MainMenu
Zitat:
Bei einem MDI-Form ist das ActiveFormHandle immer das Form...?!? |
AW: Menu funktionalität ohne MainMenu
Das wäre vielleicht ein Ansatz, als Basis habe ich ein mit der "MDI-Anwendung" erstelltes Standardprojekt verwendet. Umgebogen wird Strg+V. Ist ein MDI-Child aktiv, wird der Tastendruck wieder an dieses per PostMessage weitergeleitet.
Delphi-Quellcode:
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } const VK_V = $56; // "V" var idVK_V : Integer; procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; // Implementation procedure TMainForm.FormCreate(Sender: TObject); const MOD_CONTROL = 2; begin idVK_V := GlobalAddAtom('Control+V'); RegisterHotKey(Handle, idVK_V, MOD_CONTROL, VK_V); end; procedure TMainForm.FormDestroy(Sender: TObject); begin UnregisterHotKey(Handle, idVK_V); GlobalDeleteAtom(idVK_V); end; procedure TMainForm.WMHotKey(var Msg: TWMHotKey); begin if Msg.HotKey = idVK_V then begin if ActiveMDIChild <> nil then begin PostMessage(ActiveMDIChild.Handle, WM_KEYDOWN, VK_CONTROL, 0); PostMessage(ActiveMDIChild.Handle, WM_KEYDOWN, VK_V, 0); PostMessage(ActiveMDIChild.Handle, WM_KEYUP, VK_CONTROL, 0); PostMessage(ActiveMDIChild.Handle, WM_KEYUP, VK_V, 0); end else Showmessage('Strg+V'); end; end; |
AW: Menu funktionalität ohne MainMenu
Zitat:
@Mavarick: Was meinst du dazu? |
AW: Menu funktionalität ohne MainMenu
Zitat:
Was ist ein ein Child Fenster einen La&bel mit Focus Control auf ein TEdit hat... Kommt der Alt+B noch durch? Was fatal wäre! [Edit] Jo und so ist es auch... Eine ActionList klaut alle Tasten... @Union Aufwendig.. Muss ich mir auch näher anschauen... [EDIT] Leider falsche Reigenfolge.. bzw.. Selbst wenn ein MDI-Child active ist aber die Taste "nicht gebrauchen" kann... Wird diese ja ans Menu weitergeleitet... |
AW: Menu funktionalität ohne MainMenu
Zitat:
MfG Dalai |
AW: Menu funktionalität ohne MainMenu
Zitat:
|
AW: Menu funktionalität ohne MainMenu
Zitat:
|
AW: Menu funktionalität ohne MainMenu
Und wieso alle offnen MDIChilds durchsuchen? Das TForm.ActiveMDIChild sollte da doch genügen.
Man kann natürlich auch Funktionen über ein Interface zur Verfügung stellen:
Delphi-Quellcode:
und dann ganz simpel abfragen
IPrintable = interface
[{GUID}] function CanPrint : Boolean; procedure DoPrint; end;
Delphi-Quellcode:
procedure TMainForm.PrintActionExecute(Sender:TObject);
var LPrintable : IPrintable; begin if Supports( ActiveMDIChild, IPrintable, LPrintable ) then LPrintable.DoPrint; end; procedure TMainForm.PrintActionExecute(Sender:TObject); var LPrintable : IPrintable; begin TAction( Sender ).Enabled := Supports( ActiveMDIChild, IPrintable, LPrintable ) and LPrintable.CanPrint; end; |
AW: Menu funktionalität ohne MainMenu
Eine weitere Alternative ist das Versenden einer Nachricht
Delphi-Quellcode:
die von der Action verschickt wird
unit UserCommand;
interface uses System.Messaging; type {$SCOPEDENUMS ON} TUserCommand = ( Print, Save, SaveAs ); TUserCommandMessage = class( TMessage ) private FCommand: TUserCommand; FIsQuery: Boolean; FHandled: Boolean; public constructor Create( ACommand : TUserCommand; AIsQuery : Boolean = False ); property Command: TUserCommand read FCommand; property IsQuery: Boolean read FIsQuery; property Handled: Boolean read FHandled write FHandled; end; implementation { TUserCommandMessage } constructor TUserCommandMessage.Create(ACommand: TUserCommand; AIsQuery: Boolean); begin inherited Create; FCommand := ACommand; FIsQuery := AIsQuery; FHandled := False; end; end.
Delphi-Quellcode:
und von den Empfängern entsprechend behandelt wird
procedure TMainForm.FilePrint1Execute( Sender: TObject );
begin TMessageManager.DefaultManager.SendMessage( Self, TUserCommandMessage.Create( TUserCommand.Print ), True ); end; procedure TMainForm.FilePrint1Update( Sender: TObject ); var LCmd: TUserCommandMessage; begin LCmd := TUserCommandMessage.Create( TUserCommand.Print, True ); try TMessageManager.DefaultManager.SendMessage( Self, LCmd, False ); TAction( Sender ).Enabled := LCmd.Handled; finally LCmd.Free; end; end;
Delphi-Quellcode:
Das geht dann ohne Interfaces ... :)
procedure TMDIChild.AfterConstruction;
begin inherited; TMessageManager.DefaultManager.SubscribeToMessage( TUserCommandMessage, HandleUserCommand ); end; procedure TMDIChild.BeforeDestruction; begin TMessageManager.DefaultManager.UnSubscribe( TUserCommandMessage, HandleUserCommand ); inherited; end; procedure TMDIChild.HandleUserCommand( const Sender: TObject; const M: TMessage ); var LCmd: TUserCommandMessage absolute M; begin if not Self.Active then Exit; case LCmd.Command of TUserCommand.Print: if LCmd.IsQuery then LCmd.Handled := ( Memo1.Text <> '' ); else // Dokument drucken TUserCommand.Save: ; TUserCommand.SaveAs: ; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 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