Delphi-PRAXiS
Seite 2 von 2     12   

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 Message innerhalb einer Klasse ??? (https://www.delphipraxis.net/42200-message-innerhalb-einer-klasse.html)

teebee 15. Mär 2005 19:22

Re: Message innerhalb einer Klasse ???
 
Diese Fehlemeldung kriegt man, wenn man zu früh auf das Handle zugreifen will. In Create hat man das noch nicht. (Weil der Parent noch keins hat, dessen Parent noch keins hat, usw.) Überschreibe mal CreateWnd und registriere den HotKey dort nach dem inherited.
Parent setzen nicht vergessen, wenn Du die Komponente selbst erzeugst.

Gruß, teebee

ustra 15. Mär 2005 19:44

Re: Message innerhalb einer Klasse ???
 
Habe jetzt
Delphi-Quellcode:
procedure THotKey.CreateWnd;
begin
  inherited CreateWnd;
  iHotKeyID := GlobalAddAtom(PChar(sName));
  RegisterHotKey(self.handle, iHotKeyID, MOD_CONTROL, Ord(sKey[1]));
end;
eingefügt mit einem override hinter der Methodendeklaration:
Delphi-Quellcode:
procedure CreateWnd; override;
Trotzdem funzt es nicht. Habe die Codezeilen mit Haltepunkten versehen, aber die werden ignoriert.

teebee 15. Mär 2005 19:56

Re: Message innerhalb einer Klasse ???
 
Geht es nicht oder kommt die gleiche Fehlermeldung?

ustra 15. Mär 2005 20:05

Re: Message innerhalb einer Klasse ???
 
So,

ich habe es jetzt hinbekommen. Lag daran, dass ich zwei Variablen mit den WErten nicht richtig gespeichert hatte umd demzufolge die Registrierung fehl schlug. Danke für Deine Hilfe und den anderen.

teebee 15. Mär 2005 20:15

Re: Message innerhalb einer Klasse ???
 
Mir ist noch etwas aufgefallen:

1. Das Atom musst Du auch wieder löschen, wenn Du es nicht mehr brauchst.
2. CreateWnd kann während der Lebenszeit der Komponente mehrfach aufgerufen werden:
Mit Deinem jetzigen Code erhöhst Du den Referenzzähler für Dein Atom unkontrollierbar. Also am besten das GlobalAddAtom ins Create, ins Destroy ein GlobalDeleteAtom und im CreateWnd nur das RegisterHotkey, das schlägt ja bei einer Wiederholung eh fehl (oder Du baust noch ein Flag ein, das nur einen einmaligen Aufruf gestattet).

Gruß, teebee

generic 15. Mär 2005 20:16

Re: Message innerhalb einer Klasse ???
 
poste doch bitte nochmal die ganze lösung.

danke

ustra 16. Mär 2005 10:22

Re: Message innerhalb einer Klasse ???
 
Hier der Code, wie ich diesen momentan benutze:
Delphi-Quellcode:
unit UHotKey;

interface

uses messages, Windows, classes, controls;

const
  MOD_CONTROL = 2;
                     
type THotkeyEvent = procedure of object;
type THotKey = class (TWinControl)
  private
    FOnHotKey: THotkeyEvent;
    iHotkeyID: Integer;
    sName1, sKey1 : String;
    procedure SetOnHotKey(Value: THotkeyEvent);
  public
    constructor create(sName, sKey : String; AOwner : TComponent);
    destructor destroy;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;  
    procedure CreateWnd; override;
  published
      property onHotKeyEvent: THotKeyEvent read FOnHotKey write SetOnHotKey;

end;

implementation

{ THotKey }

//speichert die Werte
constructor THotKey.create(sName, sKey: String; AOwner : TComponent);
begin
  Inherited Create(AOwner);
  sName1 := sName;
  sKey1 := sKey;
end;

//Registriere Hotkey (nur in Verbindung STRG + Key)
procedure THotKey.CreateWnd;
begin
  inherited CreateWnd;
  iHotKeyID := GlobalAddAtom(PChar(sName1));
  RegisterHotKey(self.handle, iHotKeyID, MOD_CONTROL, Ord(sKey1[1]));
end;

//Deregistriert den HotKey
destructor THotKey.destroy;
begin
  UnRegisterHotKey(self.handle, iHotKeyID);    
  Inherited Destroy;
end;


//Beim Laden wird eine Methode zum Ereignis festgelegt
procedure THotKey.SetOnHotKey(Value: THotkeyEvent);
begin
  FOnHotKey := Value;
end;

//Message, die Nachricht bekommt, dass der HotKey gedrückt wurde und diese löst
//dann das Ereignis aus.
procedure THotKey.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = iHotkeyId
  then
    if Assigned(FOnHotKey)
    then FOnHotKey;
end;

end.

teebee 16. Mär 2005 12:30

Re: Message innerhalb einer Klasse ???
 
Schau Dir besser nochmal mein Posting von oben an...

Gruß, teebee

ustra 16. Mär 2005 13:42

Re: Message innerhalb einer Klasse ???
 
So, habe Deine Tipps beachtet und eingepflegt.

Besten Dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr.
Seite 2 von 2     12   

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