TWebBrowser仕様時のHTMLテキストエリア内の改行


じゅん  2010-05-18 10:39:29  No: 38468

TWebBrowserを仕様して、HTMLを開いています
そのときにHTMLテキストエリア内の改行ができません
いままで気づきませんでした、そうしてでしょうか?

(動作例)
FormにTWebBrowserを設置して以下をナビゲートします、この
テキストエリア内のENTERでの改行ができるようにしたい。
http://search.chiebukuro.yahoo.co.jp/search/search.php?flg=3&fr=chie-search-t&p=delphi+TWebBrowser+%E6%94%B9%E8%A1%8C

宜しくお願いします。


Mr.XRAY  2010-05-18 23:05:56  No: 38469

こんにちは.Mr.XRAYです.

>テキストエリア内のENTERでの改行ができるようにしたい。

いろいろな意味があると思いますが,

(1) 提示のURLのテキスト入力エリアで{Enter]で改行するようにしたい.
      そのURLの内容を表示しているサーバー側のプログラムを変更する必要があります.
      例えば,私のサイトの掲示板は,設置当初,タイトル部で[Enter]を押すと,自動的に
      [送信]になっていましたか,修正しました.
      
(2) Delphiから,このテキストエリアに文章を挿入する時に改行をいれたい.
      改行文字を入れれば可能と思われます.
      
(3) 表示されているテキストエリアに,キーボードから入力している時に改行したい.
      [Shift] + [Enter]で可能と思われます
      単なる[Entter]は自動的にSubmitする時に使います.
      Delphiのアプリでもありますよね.ModalResultとか.
      
他にも考えられますが.      
ここはDelphi関係の掲示板ですので,おそらく(2)ではないかと思います(確信なし).
こんなところでしょうか.
的ハズレでしたら,ごめんなさい.


じゅん  2010-05-19 00:43:17  No: 38470

Mr.XRAY様さっそくのご返信ありがとうございます。

私の説明不足でいろいろご迷惑をおかけいたしました、
私の行いたいことはキーボードからの入力になります
(3)になると思います
FormにTWebBrowserを配置しただけのものになりますが
そのTWebBrowserに表示されているHTMLのテキストエリア内に
キーボード入力で文字を入力する際に改行ができない状態です
Ctrl+EnterまたはAlt+Enterなどを試しましたが無理でした
そして送信にもなりません、サーバー側を変更することも可能ですが
IEでHTMLをみているような操作ができることが1番の希望です
引き続き宜しくお願いします。


monaa  2010-05-19 01:05:33  No: 38471

FAQだと思われます、
まとめてくださってるページがありましたのでこちらを参考にしてください。
http://fusigidane.seesaa.net/article/136751944.html
あと有名どころのブラウザコンポーネントは大抵対応しています。
http://www.bsalsa.com/product.html


Mr.XRAY  2010-05-19 01:14:38  No: 38472

Mr.XRAYです.
大変失礼しました.
TWebBrowser上での表示の場合でしたね.
文章をよく読まず失礼しました.


Mr.XRAY  2010-05-19 01:23:42  No: 38473

>あと有名どころのブラウザコンポーネントは大抵対応しています。
>http://www.bsalsa.com/product.html

今このコンポーネントで動作確認しました.
[Enter]でも[Shift]+[Enter]でも改行します.

動作確認環境
Windows XP(SP3) + Delphi2010(UP5) + TEmbeddedWB Version 14.69.1 - 23.11.2009


じゅん  2010-05-19 05:53:27  No: 38474

Mr.XRAY様ご回答ありがとうございます、以下を試してみましたがエラーが
でてしまいます、基本的なことかもしれませんがご指導宜しくお願いします。

まずTMainFormにApplicationEventsを配置、その後
以下をMAINFormにいれてみたところ、、、
----------------------------------------------------------
FOleInPlaceActiveObject:IOleInPlaceActiveObject;

FOleInPlaceActiveObject
部分と
----------------------------------------------------------
if Msg.message = WM_KEYDOWN then

Msg.message
の部分が赤下線になってしまいます。
----------------------------------------------------------
環境は以下です。
WinXP SP3 delphi2010 

「コピー」の動作不良
  以下のコードをユニットの最後部に書く必要があります。

initialization
  OleInitialize(nil);

finalization
  OleUninitialize;

//引用原文
//TMainFormにApplicationEventsを配置したとします。
//WebBrowser1.: TWebBrowser;
procedure TMainForm.AppMessages(var Msg: tagMSG; var Handled: Boolean);
var
  FOleInPlaceActiveObject: IOleInPlaceActiveObject;
  Re: HRESULT;
begin
  if Msg.message = WM_KEYDOWN then
  begin
    //WebBrowserにメッセージが送られてきたかを判定
    if IsChild(WebBrowser1.Handle, Msg.hwnd) then
    begin
      FOleInPlaceActiveObject :=
      WebBrowser1.ControlInterface as IOleInPlaceActiveObject;

      //メッセージをアクティブなWebBrowser(の子ウインド)に転送
      Re := FOleInPlaceActiveObject.TranslateAccelerator(Msg);

      if Re = S_OK then
        Handled := True
      else
        Handled := False;
    end
  end

//自分で編集したもの
procedure TForm1.FormCreate(Sender: TObject);
FOleInPlaceActiveObject:IOleInPlaceActiveObject;
Re : HRESULT;
begin
  // main
  if Msg.message = WM_KEYDOWN then
  begin
    // WebBrowserにメッセージが送られてきたかを判定
    if IsChild(WebBrowser1.Handle, Msg.hwnd) then
    begin
      FOleInPlaceActiveObject :=
        WebBrowser1.ControlInterface as IOleInPlaceActiveObject;
      // メッセージをアクティブなWebBrowser(の子ウインド)に転送
      Re := FOleInPlaceActiveObject.TranslateAccelerator(Msg);
      if Re = S_OK then
        Handled := True
      else
        Handled := False;
    end
  end
end;


じゅん  2010-05-19 06:22:45  No: 38475

すいません、いろいろ抜けていました、
プラスこちらもためしてみましたがうまく動きません
https://www.petitmonte.com/bbs/answers?question_id=973

Application.OnMessage := MsgHandler;ここの
OnMessage  にエラーがでてしまします。

動作確認できたソースをあげていただくことはできませんでしょうか?


じゅん  2010-05-19 06:24:34  No: 38476

すいません、いろいろ抜けていました、
プラスこちらもためしてみましたがうまく動きません
https://www.petitmonte.com/bbs/answers?question_id=973

Application.OnMessage := MsgHandler;ここの
OnMessage  にエラーがでてしまします。

動作確認できたソースをあげていただくことはできませんでしょうか?


monaa  2010-05-19 19:01:10  No: 38477

ご確認下さい。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, ActiveX, AppEvnts, StdCtrls;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    ApplicationEvents1: TApplicationEvents;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  case Msg.message of
    WM_KEYDOWN :
      begin
        if IsChild(WebBrowser1.Handle, Msg.hwnd) then
        begin
          Handled := (IOleInPlaceActiveObject(WebBrowser1.ControlInterface as IOleInPlaceActiveObject)
            .TranslateAccelerator(Msg) = 0);
        end;
      end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  aURL:string;
begin
  aURL := 'http://search.chiebukuro.yahoo.co.jp/search/search.php?flg=3&fr=chie-search-t&p=delphi+TWebBrowser+%E6%94%B9%E8%A1%8C';
  WebBrowser1.Navigate(aURL);
end;

end.


Mr.XRAY  2010-05-19 19:33:56  No: 38478

>Application.OnMessage := MsgHandler;ここの
>OnMessage  にエラーがでてしまします。

何というエラーメッセージがでますか?
On何とかというのは,ほとんどイベントのことです.
このイベントのコードが implementation部にあると思いますが,
interface部で定義されていないからだと思いますよ.


Mr.XRAY  2010-05-20 00:18:49  No: 38479

こんにちは.

monaaさんが具体的なコードを提示していますので,ついでに.
前の参考ページのコードよりも,monaaさんのコードをお勧めします.

if IsChild(WebBrowser1.Handle, Msg.hwnd)

Handled := (IOleInPlaceActiveObject...

だけで判断しておいたほうが,ブラウザしている他のコントロールやブラウザ(TWebBrowser自身)
のキー操作が保障されます.これは,前出のコードとmonaaさんのコードの両方をいろいろテストして
みると分かります.

monaaさんのコードを見ると

ApplicationEvents1: TApplicationEvents;

というのが,いわゆる「特殊な領域」にあります.
これは,コンポーネントをこのフォームに配置してあるということです.
このコンポーネントはTApplicationEventsです.

「Delphiの特殊領域」の参考記事
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm#03

それから,前出のコードにある以下のコードはDelphi2010では必要ありません.
Delphiが自動的にやってくれます(monaaさんのコードにもありません).

>initialization
>  OleInitialize(nil);
>finalization
>  OleUninitialize;

それと,私がテストしたのは,TEmbededWBというコンポーネントです.
http://mrxray.on.coocan.jp/Delphi/plSamples/940_TWebBrowserAndIE.htm#08

テストした具体的なコードは以下です.これだけのコードです.

procedure TForm1.Button1Click(Sender: TObject);
var
  StrURL : String;
begin
  StrURL := 'http://search.chiebukuro.yahoo.co.jp/search/search.php?flg=3&fr=' +
       'chie-search-t&p=delphi+TWebBrowser+%E6%94%B9%E8%A1%8C';
  EmbeddedWB1.Navigate(StrURL);
end;

end.

Mr.XRAY


じゅん  2010-05-20 05:36:16  No: 38480

皆様たくさんのご返答ありがとうございます。

>monaa 様
コンポーネントを配置してそのままソースをはりつけて
コンパイルできましたが、動作がかわったようには思えません
Memoはどういう役割をはたすのでしょうか?

>Mr.XRAY
procedure TForm1.Button1Click(Sender: TObject);
var
  StrURL : String;
begin
  StrURL := 'http://search.chiebukuro.yahoo.co.jp/search/search.php?flg=3&fr=' +
       'chie-search-t&p=delphi+TWebBrowser+%E6%94%B9%E8%A1%8C';
  EmbeddedWB1.Navigate(StrURL);
end;

end.

ありがとうございます、コンポーネントをDLしてきました
EmbeddedWB_D5-D2010_Version_14.69.1
どれを追加したらよろしいのでしょうか?
追加経験がないため苦戦しております。


Mr.XRAY  2010-05-20 06:17:44  No: 38481

>どれを追加したらよろしいのでしょうか?

解凍したファイルの中にReadme_Install.txtというのがあります.
そこに書いてあります.Delphi2010のはありませんが,
そういう場合は,なるべく最新であるDelphi2005のを参考にします.
英語ができなくても,単語やファイル名である程度は判断できます.

http://www.bsalsa.com/ewb_install_d200.html
(Readme_Install.txtに書いてあるリンクです)

>Memoはどういう役割をはたすのでしょうか?

そのコードで使っていなければ削除します.
テスト等で,Memoに出力したり,確認用に使用することもあるからです.
じゅんさん用に特別にコードを作成しているわけではないのです.
そのぐらいは自分で判断しないといけません.
これじゃ,授業料いただかないといけませんね.

# 誤字脱字やスペルを間違えてもなんか質問されてしまいそう...


Mr.XRAY  2010-05-20 06:53:02  No: 38482

多分間違えることはないと思いますが,

>..:\Borland\BDS\3.0\lib

というのは,Delphi2010をインストールしたLibというフォルダに読み換えます.
したがって,デフォルトでインストールした場合は,

C:\Program Files\Embarcadero\RAD Studio\7.0\lib

ということになります.
このLibにEmbeddedWB_2010というフォルダを作成するといいでしょう.

ではがんばってください.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加