Autor Beitrag
optiman
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 20.12.04 10:51 
Hallo,

ich möchte einen sichtbaren, fokussierten Tab der Klasse TTabControl durch Druck auf die Taste Entfernen (VK_DELETE) verschwinden lassen.
Leider kann TTabControl auf Tastatureingaben nicht reagieren (TCustomTabControl auch schon nicht, wohl aber TWinControl).
Die Klasse soll nicht ableitet werden.
Auch soll die Eltern-Form nichts damit zu tun haben.
Gibt es trotzdem einen eleganten Weg?

Besten Dank.
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Mo 20.12.04 13:10 
rein theoretisch (tut mir leid, kann's gerade nicht nachschaun), hängt doch auch an dem Tabcontrol ne WndProc dran. Da hängst ne eigene rein und fängst den WM_KEYDOWN ab... weiteres im PSDK.

gruß
rochus

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
optiman Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 20.12.04 18:00 
Titel: Lösung
Bingo!
So geht das. Besten Dank.

In der Form braucht man eine Variable, um sich den original Messagehandler des TabControls zu merken.

ausblenden Delphi-Quelltext
1:
TabControlWindowProc: TWndMethod;					


In der FormActivate-Methode verbiegt man den Messagehandler des TabControls auf eine Methode der Form.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TMainForm.FormActivate(Sender: TObject);
begin
   ... 
   TabControlWindowProc := MyTabControl.WindowProc;
   MyTabControl.WindowProc := TMainForm.TabControlSubClassWndProc;


Der neue Messagehandler fischt seine Meldungen raus und ruft dann den originalen Handler.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TMainForm.TabControlSubClassWndProc(var Message: TMessage);
begin
  if Message.Msg = WM_KEYDOWN then
  begin
     showmessage('WM_KEYDOWN');
  end
  else
    TabControlWindowProc(Message);
end;


So scheint das zu funktionieren. Noch mal besten Dank.

OptiMan

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Mo 20.12.04 18:10 
nochmal rein theoretisch:

wenn du das unabhängig von der form machen willst, kannst du auch hergehen und dir ne eigene TTabControl schreiben, in der du die WndProc selber überschreibst:

PSEUDO
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure WindowProc(var Message:TMessage);
begin
   case Message.Msg of
      WM_KEYDOWN :
         begin
            ShowMessage('WM_KEYDOWN');
         end;
      else
         inherited WindowProc(Message);
   end;
end;


gruß
rochus

PS: nutz bei der WindowProc lieber case, das ist übersichtlicher, wenn du mal anfängst, noch mehr messages abzufangen.

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean