AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows Message in einer Klasse

Ein Thema von Bunke5 · begonnen am 15. Jun 2005 · letzter Beitrag vom 29. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
Bunke5

Registriert seit: 15. Jun 2005
Ort: Suhl
10 Beiträge
 
Delphi 6 Professional
 
#1

Windows Message in einer Klasse

  Alt 15. Jun 2005, 10:04
Hallo,

folgendes Problem, ich möchte die Windows Message "WM_INPUTLANGCHANGE" in einer Klasse bearbeiten. Aber irgendwo fehlt mir der richtige Ansatz.

Delphi-Quellcode:
type
  TSprache = class(TWinControl)
  private
  public
    constructor Create(AOwner: TComponent); override;
    procedure KeyboardChange(var Message: TMessage); message WM_INPUTLANGCHANGE;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Sprache: TSprache;
    //procedure KeyboardChange2(var Message: TMessage); message WM_INPUTLANGCHANGE;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TSprache.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

procedure TSprache.KeyboardChange(var Message: TMessage);
begin
  Showmessage('test');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Sprache := TSprache.Create(Form1);
end;

//procedure TForm1.KeyboardChange2(var Message: TMessage);
//begin
// Showmessage('test2');
//end;
Wenn ich die Windows Message in dem Form bearbeite (auskommentierter Quelltext) geht es, in einer Klasse nicht. Wenn ich dem Form nun einen Button hinzufüge geht es auch nicht mehr. Also muss ich doch einen Denkfehler machen .

Ziel ist es am Ende diese Windows Message in einer Komponente zu bearbeiten.

Bin für jede Hilfe dankbar, kann auch ein Beispiel oder Tutorial zu diesem Thema sein.

Gruß Bunke5
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#2

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 10:16
Vielleicht weil das Control die nachricht nicht kriegt?? Bzw die Form die nachricht abarbeitet und verschluckt?
Versuch mal in der Form die Msg abzufangen und leite sie dann mittels Broadcast() weiter.
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Bunke5

Registriert seit: 15. Jun 2005
Ort: Suhl
10 Beiträge
 
Delphi 6 Professional
 
#3

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 10:29
Erstmal Danke für die Idee, ich hatte auch schon eine ähnliche Idee.
Wenn ich die Nachricht im Form abfange und weiterleite geht es.

Delphi-Quellcode:
procedure wndproc(var Message: TMessage); override;

procedure TForm1.wndproc(var Message: TMessage);
begin
  if Message.Msg = WM_INPUTLANGCHANGE then Sprache.KeyboardChange(Message)
  else inherited wndproc(Message);
end;
Das klapp soweit auch ganz gut, aber sobald ich einen Button auf dem Formular habe geht es nicht mehr. Und ich kann doch nicht für jeden Button oder ähnliches die Behandlungsroutine überschreiben, da muss es doch noch einen anderen Weg geben?
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#4

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 10:34
Probier es doch mal bitte so:
Delphi-Quellcode:
type
  TSprache = class(TWinControl)
  private
  public
    constructor Create(AOwner: TComponent); override;
    procedure KeyboardChange(var Msg: TMessage); message WM_INPUTLANGCHANGE;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Sprache: TSprache;
    procedure KeyboardChange(var Msg: TMessage); message WM_INPUTLANGCHANGE;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TSprache.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

procedure TSprache.KeyboardChange(var Msg: TMessage);
begin
  Showmessage('test');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Sprache := TSprache.Create(Form1);
end;

procedure TForm1.KeyboardChange(var Msg: TMessage);
begin
  Broadcast(Msg);
end;
btw warum überschreibst du den constructor von TSprache wenn du ihn eh nicht brauchst??
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Bunke5

Registriert seit: 15. Jun 2005
Ort: Suhl
10 Beiträge
 
Delphi 6 Professional
 
#5

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 10:57
So geht es leider nicht, die Nachricht wird nicht an die Klasse weitergeleitet.
Mit den constructor hast du recht so bringt er gar nicht, aber normalerweise ist diese Klasse etwas komplexer sie lädt dynamisch dll's und da muss ich den constructor überschreiben, habe für die Anfrage nur alles aus meiner Sicht unnötige rausgelassen, den constructor hab ich wohl übersehen.
Aber das Problem scheint anderes zu liegen, es bekommt immer nur die "Delphi-Komponente" die den Focus hat die Windows Message und dafür brauch ich eine Lösung. Wie stelle ich sicher, das meine Klasse dieses immer mitbekommt?
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#6

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 11:24
Hmm eigentlich sollte es mit Broadcast gehen... keine ahnung wieso nicht
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 11:36
Hallo,

Form1.Broadcast(msg) versorgt alle Controls mit msg, die Form1 als Parent haben. An geeigneter Stelle sollte da irgendwann Sprache.Parent := Form1 stehen, dann kann das auch funktionieren.

Grüße vom marabu
  Mit Zitat antworten Zitat
Bunke5

Registriert seit: 15. Jun 2005
Ort: Suhl
10 Beiträge
 
Delphi 6 Professional
 
#8

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 11:58
He danke,
damit funktioniert es. Der Baustein hätte mir noch gefehlt.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Sprache := TSprache.Create(Form1);
  Sprache.Parent := Form1;
end;
Es geht dann auch ohne den Broadcast Aufruf. Ich dachte wenn ich den Owner angebe ist die Frage mit den Parent auch erledig, dumm von mir.
Jetzt bleibt immer noch das Problem, das wenn ich z.B einen Button auf das Formular setzt, die Windows Message an den Button geht und nicht an das Formular, wenn da jemand auch noch so eine gut Idee hat, wäre klasse.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 12:16
Baue Broadcast() wieder ein - sonst bekommt nur das fokusierte Control die Message.

marabu
  Mit Zitat antworten Zitat
Bunke5

Registriert seit: 15. Jun 2005
Ort: Suhl
10 Beiträge
 
Delphi 6 Professional
 
#10

Re: Windows Message in einer Klasse

  Alt 15. Jun 2005, 12:43
Danke für den Hinweise. Das wäre wieder so was wonach ich wahrscheinlich Stunden gesucht hätte.
Das Problem mit dem Button löst dies leider auch nicht. Versucht einfachmal in meinen Quelltext dem Form1 einen Button hinzu zufügen. Danach erhält der Button die Windows Message und nicht mehr das Form1. Ich hab das ganze mal mit den WinSight32 von Borland beobachtet. Die Message geht nur an den Button nicht mehr an das Form1. Und das ist das was ich nicht verstehe.
Anders herum scheint es logisch zu sein, wenn das Formular die Windows Message empfängt und es sie an seine Komponenten weiter, aber so...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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