喫茶XRAYトップページ

[スレッド全体
]

[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;


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82