Toon posts:

[Delphi] OnKeyDown

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
In mijn applicatie heb ik een TComboBox met een OnKeyDown event. Dit zou de enter key af moeten vangen maar voordat deze in de OnKeyDown komt word deze al ergens afgevangen en ik kan het niet vinden.

Nu vroeg ik me af zijn er tools waarmee ik mijn applicatie op kan starten via Delphi of los en die mij dan kunnen vertellen wat de "Enter" key afvangt....?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 04:01

Tomatoman

Fulltime prutser

Als je even in de source code had gekeken, had je gezien dat in TCustomCombo.WndProc een stukje speciale processing zit voor de entertoets. Daar kun je ook zien dat je door KeyPreview van het TForm waar de TComboBox op staat op true te zetten, je de code in de OnKeyPress of OnKeyDown van het form kunt afvangen.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Ik kan niet in de source kijken ik heb Delphi Standard. Ik ga de componenten maar afzoeken het is gewoon vaag dat nergens de enter toets werkt die word door iets afgevangen maar wat.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 04:01

Tomatoman

Fulltime prutser

Verwijderd schreef op vrijdag 11 maart 2005 @ 17:49:
Ik kan niet in de source kijken ik heb Delphi Standard.
OK, dat verklaart een hoop :). Hier een code snippet, die je inzicht geeft in wat er achter de schermen gebeurt:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
procedure TCustomCombo.ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
  ComboProc: Pointer);
var
  Point: TPoint;
  Form: TCustomForm;
begin
  try
    with Message do
    begin
      case Msg of
        ...
        WM_KEYDOWN, WM_SYSKEYDOWN:
          if (ComboWnd <> FListHandle) and DoKeyDown(TWMKey(Message)) then
            Exit;
        WM_CHAR:
          begin
            if DoKeyPress(TWMKey(Message)) then Exit;
            if ((TWMKey(Message).CharCode = VK_RETURN) or
              (TWMKey(Message).CharCode = VK_ESCAPE)) and DroppedDown then
            begin
              DroppedDown := False;
              Exit;
            end;
          end;
        WM_KEYUP, WM_SYSKEYUP:
          if DoKeyUp(TWMKey(Message)) then Exit;

        ...

        CN_KEYDOWN, CN_CHAR, CN_SYSKEYDOWN, CN_SYSCHAR:
          begin
            WndProc(Message);
            Exit;
          end;
      end;
      Result := CallWindowProc(ComboProc, ComboWnd, Msg, WParam, LParam);
      if (Msg = WM_LBUTTONDBLCLK) and (csDoubleClicks in ControlStyle) then
        DblClick;
    end;
  except
    Application.HandleException(Self);
  end;
end;

procedure TCustomCombo.WndProc(var Message: TMessage);
begin
    {for auto drag mode, let listbox handle itself, instead of TControl}
  if not (csDesigning in ComponentState) and
     ((Message.Msg = WM_LBUTTONDOWN) or (Message.Msg = WM_LBUTTONDBLCLK)) and
     not Dragging then
  begin
    if DragMode = dmAutomatic then
    begin
      if IsControlMouseMsg(TWMMouse(Message)) then
        Exit;
      ControlState := ControlState + [csLButtonDown];
      Dispatch(Message);  {overrides TControl's BeginDrag}
      Exit;
    end;
  end;
  with Message do
    case Msg of
      ...
      WM_CHAR:
        begin
          if DoKeyPress(TWMKey(Message)) then Exit;
          if ((TWMKey(Message).CharCode = VK_RETURN) or
            (TWMKey(Message).CharCode = VK_ESCAPE)) and DroppedDown then
          begin
            DroppedDown := False;
            Exit;
          end;
        end;
    end;
  inherited WndProc(Message);
end;

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Thanks voor de code. Ja dat is een beetje jammer dat je bij Delphi Standard niet bij de source code kan komen. Maar gelukkig voor dit soort dingen is er internet.