こんにちは、akkyと言います。
Delphi6 PersonalでWebBrowserを使って簡単なブラウザを作っているのですが、
それでナビゲートしたホームページ上のテキスト入力ボックスに文字を入力すると、普通の文字は大丈夫なのですが、改行をしようとすると出来ないのです。
何か解決方法がありましたら、よろしくお願い致します。
WebBrowserのバグです。
このバグ回避は、TUIWebBrowserを使った方が簡単です。
http://plaza21.mbn.or.jp/~takoyakusi/
にしのさん、回答ありがとうございます。
何回か、教えて貰ったURLにあるコンポーネントをインストールしようとしたのですが、上手く行きませんでした(^^;
もう少し色々やってみます。
これでいけます。
private
FOleInPlaceActiveObject: IOleInPlaceActiveObject;
-----
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MsgHandler;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FOleInPlaceActiveObject := nil;
end;
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
var
iOIPAO: IOleInPlaceActiveObject;
Dispatch: IDispatch;
begin
if WebBrowser1 = nil then begin
Handled := False;
Exit;
end;
Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
if (Handled) and (not WebBrowser1.Busy) then begin
Dispatch := WebBrowser1.Application;
if Dispatch <> nil then begin
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO <> nil then begin
FOleInPlaceActiveObject := iOIPAO;
end;
end;
if FOleInPlaceActiveObject <> nil then
if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)) then
else
FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
補足。
uses
***,ActiveX;
ファイルの末尾、end.の前あたりに、オマジナイを忘れずに。
initialization
OleInitialize(nil);
finalization
OleUninitialize;
end.
torumさんのコードと殆ど同じなのですが下のようにして使っています
uses
SHDocVw_TLB, ActiveX;
Delphi6ならSHDocVw_TLBをSHDocVwに
---------------------------------------------------------------
private
FOleInPlaceActiveObject: IOleInPlaceActiveObject;
procedure MsgHandler(var Msg: TMsg; var Handled: Boolean);
---------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MsgHandler;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FOleInPlaceActiveObject := nil;
end;
procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean);
var
iOIPAO: IOleInPlaceActiveObject;
Dispatch: IDispatch;
begin
if WebBrowser1 = nil then
begin
Handled := False;
Exit;
end;
Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
if (Handled) and (not WebBrowser1.Busy) then
begin
Dispatch := WebBrowser1.Application;
if Dispatch <> nil then
begin
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO <> nil then
begin
FOleInPlaceActiveObject := iOIPAO;
end;
end;
if FOleInPlaceActiveObject = nil then
FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
end;
initialization
OleInitialize(nil);
finalization
OleUninitialize;
end.
間違ったコードを投書してしまいました。
torumさんのコードと比較して見ていただくと、
if FOleInPlaceActiveObject <> nil then(以下略を
if FOleInPlaceActiveObject = nil then(以下略
に書き換えています。
上に投書したコードは半角英数入力時、'aa' のように重複してしまう事があるので、それを迂回するときに使っている物でした。
これをそのまま使うとまったく問題の解決にはなりません(^^;
お騒がせ致しました<(_ _)>
ツイート | ![]() |