Twebbrowser浏览网页时,一个表单里有一个多行的文本输入框,<Textarea > </textarea>时,无法回车?但是用IE浏览可以输入回车,并且状态很好。请问这是什么问题?

解决方案 »

  1.   

    默认的情况下Delphi的TwebBrowser控件是不支持Enter的,这使一些多行文本框变得无法录入,解决的办法如下:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleCtrls, SHDocVw_TLB, ActiveX, StdCtrls;type
      TForm1 = class(TForm)
        WebBrowser1: TWebBrowser;
        Button1: TButton;
        Button2: TButton;
        procedure FormDestroy(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        FOleInPlaceActiveObject: IOleInPlaceActiveObject;
        procedure MsgHandler(var Msg: TMsg; var Handled: Boolean);
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    implementation{$R *.dfm}procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FOleInPlaceActiveObject := nil;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := MsgHandler;
    end;procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
    const
      DialogKeys: set of Byte = [VK_LEFT, VK_RIGHT, VK_BACK, VK_UP, VK_DOWN,
        $30..$39, $41..42, $44..$55, $57, $59..$5A];
    var
      iOIPAO: IOleInPlaceActiveObject;
      Dispatch: IDispatch;
    begin
      { exit if we don't get back a webbrowser object }
      if (WebBrowser1 = nil) then
      begin
        Handled := System.False;
        Exit;
      end;  Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = System.True);  if (Handled) and (not WebBrowser1.Busy) then
      begin
        if FOleInPlaceActiveObject = nil then
        begin
          Dispatch := WebBrowser1.Application;
          if Dispatch <> nil then
          begin
            Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
            if iOIPAO <> nil then
              FOleInPlaceActiveObject := iOIPAO;
          end;
        end;    if FOleInPlaceActiveObject <> nil then
          if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
            (Msg.wParam in DialogKeys) then
            // nothing - do not pass on the DialogKeys
          else
            FOleInPlaceActiveObject.TranslateAccelerator(Msg);
      end;
    end;initialization
      OleInitialize(nil);finalization
      OleUninitialize;