La explicacion esta en la implementacion de la clase TWinControl de la que desciende el TEdit. Cuando recibe el mensage WM_CHAR, se ejecuta lo siguiente:
Código Delphi
[-]
function TWinControl.DoKeyPress(var Message: TWMKey): Boolean;
var
Form: TCustomForm;
Ch: Char;
begin
Result := True;
Form := GetParentForm(Self);
if (Form <> nil) and (Form <> Self) and Form.KeyPreview and
TWinControl(Form).DoKeyPress(Message) then Exit;
if not (csNoStdEvents in ControlStyle) then
with Message do
begin
Ch := Char(CharCode);
KeyPress(Ch); CharCode := Word(Ch);
if Char(CharCode) = #0 then Exit;
end;
Result := False;
end;
procedure TWinControl.WMChar(var Message: TWMChar); begin
if not DoKeyPress(Message) then inherited;
end;
Como ves, si no se pone el valor de key a cero, el resultado de la función DoKeyPress es FALSE, por lo que es delphi quien llama a inherited. Poniendo key a cero evitamos que eso pase.