喫茶XRAYトップページ


[5001] TAcroPDFのフォーカス返信 削除
2011/7/13 (水) 12:11:01 Atchoum
こんにちわ!

720_Acrobat (PDF)文書の表示と印刷 をみながら
AcroPDFを使って文書を表示させています。

一度文章を表示させるとフォーカスがPDFにとられてしまい移動できません。
リスト(TListView)をクリックするたびにPDFを表示させているので、
リストの上下キーで移動できない状態です。

SendMessage(Handle, WM_NEXTDLGCTL, 1, 0);も試しましたがだめでした。

フォーカスを戻すための何かよい案がありますでしょうか?

[5002] Re:TAcroPDFのフォーカス返信 削除
2011/7/13 (水) 13:17:54 Mr.XRAY
▼ Atchoumさん.こんにちは.

> リスト(TListView)をクリックするたびにPDFを表示させているので、
> リストの上下キーで移動できない状態です。


TListViewに文書名の一覧を表示していて,
矢印キー等でTListViewの項目(文章名)を変更したいのにできない,
ということですよね.
PDFを表示すると,そちらにフォーカスが移動するんですね,きっと.
PDFを表示するコードの後に,TListView.SetFocus; を実行しても
ダメでしょうか?


[5003] Re2:TAcroPDFのフォーカス返信 削除
2011/7/13 (水) 13:32:55 Mr.XRAY
>SendMessage(Handle, WM_NEXTDLGCTL, 1, 0);も試しましたがだめでした。

でダメなのでダメなんですね.
う〜む.PDFの表示が完了してからフォーカス移動する必要があるようです.
さて...


[5004] Re3:TAcroPDFのフォーカス返信 削除
2011/7/13 (水) 14:28:15 Atchoum
▼ Mr.XRAYさん
> >SendMessage(Handle, WM_NEXTDLGCTL, 1, 0);も試しましたがだめでした。
>
> でダメなのでダメなんですね.
> う〜む.PDFの表示が完了してからフォーカス移動する必要があるようです.
> さて...


調べてみると、タイマー使って・・・なんていう解決法もあったり。
でも同じ悩みの書き込みが国内外問わずあったのですが、タイマー以外に解決されていませんでした。

PDFの表示が完了したのを教えてくれるイベントも
探してみたものの見つかりませんでした。
→TAcroPDFを継承して、Protectedで宣言されているイベントも調べました。

[5005] Re4:TAcroPDFのフォーカス返信 削除
2011/7/13 (水) 14:43:01 Mr.XRAY
▼ Atchoumさん

> 調べてみると、タイマー使って・・・なんていう解決法もあったり。

なるほど.
何かないのかな... 困りました.
同じようにPDFを表示するサンプル
[724_Adobe Acrobatオブジェクトの操作]もあるのですが,
こちらだと原理的にフォーカス移動は簡単です.しかしですね.
このサンプルは,結構面倒なんです.Adobe Acrobat(アドビアクロバット)
そのものが必要で,しかもバージョンが違うと例外が発生してしまうんです.

>探してみたものの見つかりませんでした。
>→TAcroPDFを継承して、Protectedで宣言されているイベントも調べました。


Atchoumさんがさんざんやってダメなので,多分私の手には負えないでしょう
(と言って逃げる...) (^^;
少しは考えてみます.期待はしないでくださいませ.

[5006] Re5:TAcroPDFのフォーカス返信 削除
2011/7/13 (水) 23:39:26 Mr.XRAY
> 少しは考えてみます.期待はしないでくださいませ.

継承元のTOleControlも見て,実際に少しテストしてみましたが,
使用できるのはないようです.TAcroPDFにも,もちろんないようです.
元々そういうコントロールだと言えばそれまでなのですが.

やはり,タイマーで監視して,フォーカス移動したら,タイマー監視
を止める.という方法しかないのかも知れません.

[5007] Re5:TAcroPDFのフォーカス返信 削除
2011/7/14 (木) 06:27:24 Mr.XRAY
> 少しは考えてみます.期待はしないでくださいませ.

こんな感じでできるようです.
原理は,Acrobatの文書にフォーカス移動していると,SetFocusしても
SetActiveWindowを実行しても機能しないので,キー操作の[TAB]をコードで
実行するという方法です.
動作確認は,Windows XP(SP3) + Delphi 7 Pro + Acrobat Reader9.4.5

procedure TForm1.Button1Click(Sender: TObject);
begin
  //フォーカスコントロール
  //Button1クリックでButton1にフォーカス(ActiveControl)が移動して
  //いるので,ここで再設定
  //FocusControl(Memo1);でも可
  ActiveControl := Memo1;

  with OpenDialog1 do begin
    DefaultExt:='PDF';
    Filter:='Acrobat PDFファイル|*.PDF';
    Options:=[ofReadOnly];

    if Execute then begin
      Update;
      AcroPDF1.LoadFile(FileName);
      AcroPDF1.setShowToolbar(False);

      //LoadFileで文書を読み込むとAcrobatにフォーカス移動する
      //[TAB]キーで,Acrobat文書からフォーカス移動しておかないと機能しない
      keybd_event( VK_TAB, 0, 0 , 0 );
      keybd_event( VK_TAB, 0, KEYEVENTF_KEYUP , 0 );
      //ここでMemo1.SetFocusのように設定してもよい
    end;
  end;
end;

ところで,[720]のサンプル,リサイズしても,文章の表示サイズが
変更されない場合があります.文書をクリックすると変化します.
Refreshメソッドを実行しても変化しません.
何か方法をご存知でしたら教えてください.


[5008] Re6:TAcroPDFのフォーカス返信 削除
2011/7/14 (木) 06:34:56 Mr.XRAY
参考までに,Acrobat文書のハンドルは以下のように取得できます.

// protected部アクセス用設定
type
  TMyActoPDF = class(TAcroPDF);

var
  AWnd : HWND;

としておいて,

if AcroPDF1.Visible then
  TMyActoPDF(AcroPDF1).OleInPlaceSite_GetWindow(AWnd);

を実行すると,AWndの値が文書のハンドルとなります.
もしかしたら,Acrobatのハンドルかも知れません(未確認です).


[5009] Re7:TAcroPDFのフォーカス返信 削除
2011/7/14 (木) 11:03:30 Atchoum
お返事ありがとうございます。

KeyEvent作戦やってみましたがやはりだめです。
機能しているようですが、またPDF側に戻ってしまっているような気がします。

タイマーイベントを実行しフォーカスをMemoに移動。
移動できたらタイマー終了。

を試したところ、すぐにTimerは終了。

その後上下キーを押すとPDFのほうのスクロールが上下しています。

ツールバーを非表示にしてもPDFを開いたときに
半透明なフローティングツールバー?がもや〜んと表示されるのも気になります。
このツールバーにあるアドビマークを押下するとツールバーが表示されます。

こちらでリサイズは大丈夫でした。
「変更されない場合があります」とありますが、
変更される場合もあるし、ないばあいもあるということですか?

[5010] Re8:TAcroPDFのフォーカス返信 削除
2011/7/14 (木) 15:26:20 Mr.XRAY
▼ Atchoumさん

> KeyEvent作戦やってみましたがやはりだめです。
> 機能しているようですが、またPDF側に戻ってしまっているような気がします。


今,Windows 7でやってみました.
同じです.フォーカス移動してくれません.ダメでした.
う〜ん,Acrobatのやつめ!!

>その後上下キーを押すとPDFのほうのスクロールが上下しています。

当然そうなりますよね.

> こちらでリサイズは大丈夫でした。
> 「変更されない場合があります」とありますが、
> 変更される場合もあるし、ないばあいもあるということですか?


そうなんです.何か微妙なタイミングとでもいうのでしょうか.
う〜ん,Acrobatのやつめ!!


[5011] Re9:TAcroPDFのフォーカス返信 削除
2011/7/14 (木) 16:02:41 Mr.XRAY
> > こちらでリサイズは大丈夫でした。
> > 「変更されない場合があります」とありますが、
> > 変更される場合もあるし、ないばあいもあるということですか?
>
> そうなんです.何か微妙なタイミングとでもいうのでしょうか.
> う〜ん,Acrobatのやつめ!!


リサイズ解決(?)かどうかは分かりませんが,
Windows XP(SP3)または,Windows 7 U64上でDelphi 2010でコンパイルして
作成したEXEだと正常リサイズしました.
う〜ん,Acrobatめ!


[5012] Re:TAcroPDFのフォーカス 挫折返信 削除
2011/7/14 (木) 21:09:02 Mr.XRAY
▼ Atchoumさん,こんにちは.

いろいろなテストの結果,
[TAB]キーでフォーカス移動しても,
PDF文書がまだ完全に読み込まれていないと,残りの文書の読み込みの際に,
再度Acrobatにフォーカス移動してしまう.

つまり,Atchoumさんが言われるように,
PDFの表示が完了したのを教えてくれるイベントがない限りどうしようも
ないようです.

何か方法があるのかも知れませんが,現在の私のスキル,実力,知識では
残念ながら,無理のようです.
どなたかの情報待ちとします.
申し訳ありません m(_ _)m
くやしい.... !


[5013] Re2:TAcroPDFのフォーカス 挫折返信 削除
2011/7/15 (金) 12:20:21 Atchoum
お世話になっております。

もうこれはこういうものだ!と受け止め、
マウス操作でお願いします。。。とあきらめようと思っています。

Acrobatのやつめ!(笑)

あ、そうだ。
PDFの部分だけ別Exeにして外から呼べば何とかできますかね?
あとでちょっとやってみます。

[5014] Re3:TAcroPDFのフォーカス 挫折返信 削除
2011/7/15 (金) 12:53:37 Mr.XRAY
▼ Atchoumさん

> PDFの部分だけ別Exeにして外から呼べば何とかできますかね?

う〜ん.どうでしょう.今ちょっと頭が回りません.
それにしても,PDF表示終了ぐらいのイベントなりを実装してくれたら
いいのになー.

[5015] Re4:TAcroPDFのフォーカス 挫折返信 削除
2011/7/15 (金) 17:46:33 Sara
▼ Mr.XRAYさん
▼ Atchoumさん
こんにちは Saraです。

ちょっと気になったので、試してみました・・・

Timerをつかって以下のようにすると、一応動くようですが・・・(だめ?)
(Intervalは500)
巨大なPDFだと500では足りない可能性もありますが・・・
100ではだめでした・・・


procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Windows.SetFocus(ListView1.Handle);
    Timer1.Enabled := False;
end;

VMPlayer上のWindowsXP SP3にDelphi2007で確認しました。
他の環境は今無いので不明ですが・・・(^^;

[5016] Re5:TAcroPDFのフォーカス 挫折返信 削除
2011/7/15 (金) 18:06:39 Mr.XRAY
▼ Saraさん,どうもです.
いよいよSaraさんの登場ですか.

> Timerをつかって以下のようにすると、一応動くようですが・・・(だめ?)
> (Intervalは500)
> 巨大なPDFだと500では足りない可能性もありますが・・・
> 100ではだめでした・・・


そうなんですよね.Intervalを長くすれば,表示終了後ということに
なるようです.
PDFの文書にもよりますが,実際のアプリで使用するPDF文書でOKであれば
この方法を採用するしかないでしょうね.


[5019] Re6:TAcroPDFのフォーカス 挫折返信 削除
2011/7/18 (月) 15:43:02 Sara
▼ Mr.XRAYさん
こんにちは、ちょっとひねってみました。

> そうなんですよね.Intervalを長くすれば,表示終了後ということに
> なるようです.
> PDFの文書にもよりますが,実際のアプリで使用するPDF文書でOKであれば
> この方法を採用するしかないでしょうね.


procedure TForm1.Timer1Timer(Sender: TObject);
var hWindow :HWnd;
    cName    : array[0..255] of char;
begin
    if Form1.Active then begin
       hWindow := Windows.GetFocus;
       GetClassName(hWindow, cName, sizeof(cName));
       if cName = 'AVL_AVView' then begin
         if not ListView1.Focused then Windows.SetFocus(ListView1.Handle);
       end;
    end;
end;

とすると、Intervalを10にしても、問題なく動作します。
TimerをOFFにしないので、PDFをキーで操作できませんが・・・(笑)
ビュワーとしてならこれで十分かも・・・


[5020] Re7:TAcroPDFのフォーカス 挫折返信 削除
2011/7/18 (月) 16:43:46 Sara
▼ Mr.XRAYさん

> TimerをOFFにしないので、PDFをキーで操作できませんが・・・(笑)
> ビュワーとしてならこれで十分かも・・・


procedure TForm1.AcroPDF1Enter(Sender: TObject);
begin
   Timer1.Enabled := False;
end;

としておくと、一応キー操作も可能なようです。

[5021] Re8:TAcroPDFのフォーカス 挫折から立ち直り完成返信 削除
2011/7/18 (月) 19:17:01 Mr.XRAY
▼ Saraさん,やってくれましたね.
この店の常連さんは,まったく.
しかし,このぐらいのプログラムも出来ないとは.能力の限界か?
えっ? 昔からだろうって? ハイハイ.
悔しいでございます.バッチリ動作しますです(涙).

var
  AFocusControl : TWinControl;

//=============================================================================
//  フォーカスをセットするコントロールを指定
//  タイマーコンポ設定
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  AFocusControl  := ListView1;
  ActiveControl  := AFocusControl;

  Timer1.Enabled  := False;
  Timer1.Interval := 10;
end;

//=============================================================================
//  ファイル選択ダイアログでPDFファイルを選択して表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  with OpenDialog1 do begin
    DefaultExt:='PDF';
    Filter:='Acrobat PDFファイル|*.PDF';
    Options:=[ofReadOnly];

    if Execute then begin
      Update;
      AcroPDF1.LoadFile(FileName);
      AcroPDF1.setShowToolbar(False);
      Timer1.Enabled := True;
    end;
  end;
end;

//=============================================================================
//  表示方式の変更
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  if not AcroPDF1.Visible then exit;

  if Sender=Button2 then AcroPDF1.setView('fit');
  if Sender=Button3 then AcroPDF1.setView('fitwindow');
  if Sender=Button4 then AcroPDF1.setView('fith');
  if Sender=Button5 then AcroPDF1.setView('fitb');
  if Sender=Button6 then AcroPDF1.setView('fitbh');
  if Sender=Button7 then AcroPDF1.setView('fitbv');
  if Sender=Button8 then AcroPDF1.setView('fitv');

  Windows.SetFocus(AFocusControl.Handle);
end;

//=============================================================================
//  フォーカス移動のためのタイマーイベント
//  PDF文書は,読み込み表示の際,PDF文書にフォーカス移動してしまうのでその対策
//=============================================================================
procedure TForm1.Timer1Timer(Sender: TObject);
var
  hWindow :HWnd;
  cName   : array[0..MAX_PATH - 1] of char;
begin
  if Form1.Active then begin
    hWindow := Windows.GetFocus;
    GetClassName(hWindow, cName, sizeof(cName));
    if cName = 'AVL_AVView' then begin
      if not AFocusControl.Focused then Windows.SetFocus(AFocusControl.Handle);
    end;
  end;
end;

//=============================================================================
//  PDFをクリックしたらPDFをキーやマウスで操作可能にするため,タイマーをOFF
//  これがない場合(タイマーイベントが有効な場合)は,PDF文書のページ移動は,ス
//  クロールバーのマウス操作.あるいは,操作用のコードでのみ可能となる
//=============================================================================
procedure TForm1.AcroPDF1Enter(Sender: TObject);
begin
  Timer1.Enabled := False;
end;


[5029] Re:TAcroPDFのフォーカス返信 削除
2011/7/20 (水) 12:16:48 Atchoum
Mr.XRAYさん、Saraさん

ありがとうございます。

早速試してみたいと思います!
後ほどご連絡いたします。


[5030] Re2:TAcroPDFのフォーカス返信 削除
2011/7/20 (水) 12:46:46 Mr.XRAY
▼ Atchoumさんこんにちは.

失礼しました.元々Atchoumさんからの話題でしたね.
勝手に盛り上がってしまいました.(^^;

> 早速試してみたいと思います!

うまくいくことを願っています.

[5031] Re3:TAcroPDFのフォーカス返信 削除
2011/7/20 (水) 13:07:43 Atchoum
Mr.XRAYさん

う〜ま〜く〜い〜き〜ま〜した!
本当に感謝です。

どこかでこの話題でたらこちらのホームページを紹介したいので
ぜひトピックで保存してください。

よろしくお願いします。

このたびはSaraさん、Mr.XRAYさん本当にありがとうございました。


[5032] Re4:TAcroPDFのフォーカス返信 削除
2011/7/20 (水) 13:27:17 Mr.XRAY
▼ Atchoumさん

> ぜひトピックで保存してください。

は〜い ! 後でやっておきま〜す(返事だけは元気がいいんです).
例によって,いつになるやら...

[5044] 更新しました返信 削除
2011/7/22 (金) 21:25:54 Mr.XRAY
> は〜い ! 後でやっておきま〜す(返事だけは元気がいいんです).
> 例によって,いつになるやら...


更新しました.
[720_Acrobat(PDF)文書の表示と印刷]
http://mrxray.on.coocan.jp/Delphi/plSamples/720_Acrobat.htm

ネット上の質問を読んでみると,もう少しサンプルを追加しても
いいとは思うのですが,それは,またどこか,あるいはここで質問が
出てきた時に追加します.


INCM/CMT
Cyclamen v3.82