MediaPlayerで動画を表示するウインドウの位置、サイズを指定するには?

解決


かんとく  2018-03-27 20:02:10  No: 49109  IP: 192.*.*.*

MediaPlayerで動画を表示するウインドウの位置、サイズを、ウインドウのドラッグではなく、プログラムで指定したいです。
具体的には、プログラム実行中に、ボタンをクリックしたら、ウインドウのサイズを大きくしたり、小さくしたりしたいです。
よろしくお願いします。

編集 削除
かんとく  2018-03-27 20:02:41  No: 49110  IP: 192.*.*.*

DelphiXE2,windows1です。

編集 削除
かんとく  2018-03-27 20:07:50  No: 49111  IP: 192.*.*.*

windows10です。
(すみません)

編集 削除
通りすがり  2018-03-27 21:21:36  No: 49112  IP: 192.*.*.*

SetBoundsを呼ぶとかWidth/Heightを実行時に書き換えるとか?

編集 削除
take  2018-03-28 13:26:25  No: 49113  IP: 192.*.*.*

TMediaPlayerControlをフォームなどに貼り付けて alignの設定をalClientで使っていて

>サイズを、ウインドウのドラッグではなく、プログラムで指定したいです

と言われているのであればコンポーネントの配置と設定がわかっていないことになるのだけど
それとはまた違う話?

編集 削除
かんとく  2018-03-28 13:56:08  No: 49114  IP: 192.*.*.*

ありがとうございます。
TMediaPlayerControlというのは、「再生」「停止」「進む」などのボタンが並んでいるコントロールパネルのようなもののことをさせていますでしょうか?

MediaPlayer1.SetBounds (100,100,300,300);
とすると、そのボタンが並んでいるコントロールパネルのようなものの配置は指定できます。

しかし、わたしが指定したいのは、再最中の動画が別ウインドウで開いていますが、このウインドウを配置したいのです。
再生中しか、このウインドウが表示されないので、このウインドウをどうしていしたらよいのかがわかりません。

よろしくお願いします。

編集 削除
take  2018-03-28 15:09:40  No: 49115  IP: 192.*.*.*

VCLのリファレンスを読むと

TMediaPlayerクラスはDisplayプロパティに表示させたいフォームやパネルを指定して
サイズはDisplayRect プロパティを使ってください
Displayプロパティのデフォルト値は nilで、これはデバイスは出力を表示するために独自のウィンドウを作成することを内容します。

ってなっているから説明通りの動作かと

編集 削除
Mr.XRAY  2018-03-28 18:41:55  No: 49116  IP: 192.*.*.*

>再生中しか、このウインドウが表示されないので、このウインドウをどうしていしたらよいのかがわかりません。 

ちょっと教えていただきたいのですが,
TMediaPlayer で再生後にそのウィンドウが自動的に閉じるんですか ?
そのようなプロパティが見つからないのですが,教えてください.

この文章から判断すると,再生後にそのウィンドウが閉じなければ位置とサイズが設定できるということですか ?
これも不思議な気がします.それが可能なら再生中でもできると思うのですが.

編集 削除
Mr.XRAY  2018-03-28 19:16:34  No: 49117  IP: 192.*.*.*

位置とサイズが設定できないというのが一体どういう状況なのかは不明ですが,
ウィンドウの位置とサイズは SetWindowPos 関数で設定できます.
そのものズバリの関数名です.

procedure TForm1.Button2Click(Sender: TObject);
begin
  SetWindowPos(Button2.Handle, 0, 30, 50, 100, 200, SWP_NOZORDER);
end;

編集 削除
take  2018-03-29 10:09:34  No: 49118  IP: 192.*.*.*

VCLのTMediaPlayerコンポーネントは昔からあるコンポーネントなのですが色々理由があってちょっと使いづらく出来ています。
Delphi XE2で新規プロジェクトVCLで起動して配置すると再生や停止などの記号が置かれたものが表示され
FileNameで動画データを指定して再生すると、別フォームが立ち上がってそこに映像が表示されます。

先に書いたようにDisplayプロパティにPanelなどの配置先を指定して
DisplayRectでサイズを指定すれば思い通りの動作になるかと思います。

どうしてこのような仕様になっているかというと動画再生時に負荷の問題の他に
保護されている映像データを再生しているときにプログラム側で操作して画像を取得できないようにするためです。

FireMonkey のTMediaPlayerは、操作系を自分で実装しないといけないものの
扱い方はMr.XRAYさんのおっしゃる通りごく普通のコンポーネントとして動作します。

編集 削除
Mr.XRAY  2018-03-29 12:00:18  No: 49119  IP: 192.*.*.*

もしかしたら,
『ウィンドウの位置とサイズを変更したいだけなのに,何でこんな面倒なわけの分からないレスがつくんだ.
どうして分かってくれないんだ』
と思っているかも知れません.
でも,ややこしくしているのは質問された方自身でしょう.多分.

例えば,以下のように質問するとします.

------------ 質問文の例 ----------------------------------

開発環境は以下です.
Windows 3.1 + Delhi XE50(UP5)

フォームに TMediaPlayer を配置して以下のコードを実行します.
.wmv に関連付けされたプログラムが起動して動画が再生されます.
この時のこの動画を再生しているウィンドウの位置やサイズを,ボタンクリックで変更したいと思います.
どのようにしたらよいのでしょうか.

//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  MediaPlayer1.DeviceType := dtAutoSelect;
  MediaPlayer1.FileName   := 'C:\Users\Public\Videos\Sample Videos\Wildlife.wmv';
  MediaPlayer1.Open;
end;

//=============================================================================
//  フォームを閉じる時の処理
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MediaPlayer1.Stop;
  MediaPlayer1.Close;
end;

------------ 質問文の例 END ----------------------------------

こうすれば,質問を読んだ方が再現できます.
この掲示板に出入りしてからだいぶたちますが,あまり変わっていないですね.
開発環境等を書くようになったことは認めます (笑)

エスパーの登場を期待するのは無理があります.

で,肝心のウィンドウの位置とサイズですが,以下を参考にしてください.
既にレスしたように,TForm, TButton 等,Delphi のコントロールであれば Handle というプロパティがあり,
簡単にウィンドウハンドルを知ることができます.
しかし,他のアプリの場合はそう簡単にはいきません.
まずはそういう知識が必要です.

[ウィンドウハンドルとアプリの起動]
http://mrxray.on.coocan.jp/Delphi/Others/011.htm

では頑張ってください.

# MediaPlayer ではなく,先頭 T をつけて TMediaPlayer を付けるといいです.
# Button はボタンで,ワイシャツのボタンも Button です.
# TButton にすると Delphi の TButton コンポーネントと判断できます.便利です.

参考
[クラス名のプリフィックスの T ( 入門者用 )]
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro03.htm

編集 削除
take  2018-03-30 08:57:45  No: 49120  IP: 192.*.*.*

なんか話がかみ合っていない気がするのですが・・・

質問者はプロジェクトがVCLなのかFireMonkeyを書いた方が良いかも

Delphi XE2 VCLの TMediaPlayer は  「巻き戻し」「再生」「停止」「早送り」
などのボタンが付いた操作系のコンポーネントなので
SetBounds や SetWindowPos  で動くのは操作系部分だけです。

+--------+
| 表示部 | ←動かしたいのはこっち
+--------+

+--------+
| 操作部 | ←指示されたやりかたで動くのはこっち(TMediaPlayer)
+--------+

操作部である TMediaPlayer に再生の指示をした段階で表示部が生成されるので
それを SetWindowPos で動かせというのはちょっときついです。

FireMonkey の TMediaPlayer 本体は表示部なので 表示位置や表示サイズは
TMediaPlayer のプロパティを触れば反応します。

XE5 や最新版でこの挙動が変わっているのかもしれませんが
XE2 の VCLプロジェクトで TMediaPlayerコンポーネントをフォームに貼ると
表示部では無く操作部になります。

編集 削除
かんとく  2018-03-30 12:22:39  No: 49121  IP: 192.*.*.*

ありがとうございます。
質問の仕方が悪くて、申し訳ありませんでした。

開発環境は、VCLです。
配置の指定をしたいのは、表示部です。

takeさんの言われたとおり、
Form上にPanel1を配置して、
MediaPlayer1のDisplayプロパティに、Panel1を指定して 
DisplayRectでサイズを指定すれば、思い通りの動作になりました。

まずい質問でしたが、教えていただいて、ありがとうございました。

編集 削除
Mr.XRAY  2018-04-07 23:33:43  No: 49122  IP: 192.*.*.*

いい機会なので take さんのレスの内容も含めて記事にしてみました.
この掲示板を利用される方の参考になれば幸いです.

[TMediaPlayer または TWindowsMediaPlayer で動画を再生]
http://mrxray.on.coocan.jp/Delphi/Others/TMediaPlayer.htm

編集 削除