3

こんにちは :-)、私のアプリケーションでは、OleContainerを使用して Microsoft Powerpoint からプレゼンテーションを表示します。

プレゼンテーション ファイルを読み込んで実行するために使用するこのコード:

with oleContainer do begin
    Parent := mediaPanel; Left := 0; Top := 0;
    Width := mediaPanel.Width; Height := mediaPanel.Height;
    CreateObjectFromFile('C:\Users\Nanik\Desktop\Present.ppt', false);
    Iconic := false; Visible := true; Run;
 end;

プレゼンテーションは自動再生スライドショーとして作成されました (Microsoft PowerPoint の動作中) が、アプリケーションのプレゼンテーションではまだ最初のスライドにありました。実行コマンドが正しくありませんか?

4

2 に答える 2

5

アプリケーションのコンテナー内でプレゼンテーションを実行するために OleContainer は必要ありません。プレゼンテーションを実行するパネルコンテナーをフォームに配置し、次のルーチンを試してください。

procedure TForm2.Button3Click(Sender: TObject);
const
  ppShowTypeSpeaker = 1;
  ppShowTypeInWindow = 1000;
  SHOW_FILE = 'C:\Users\jcastillo\Documents\test.pps';
var
  oPPTApp: OleVariant;
  oPPTPres: OleVariant;

  screenClasshWnd: HWND;
  pWidth, pHeight: Integer;

  function PixelsToPoints(Val: Integer; Vert: Boolean): Integer;
  begin
    if Vert then
      Result := Trunc(Val * 0.75)
    else
      Result := Trunc(Val * 0.75);
  end;

begin
  oPPTApp := CreateOleObject('PowerPoint.Application');
  oPPTPres := oPPTApp.Presentations.Open(SHOW_FILE, True, True, False);
  pWidth := PixelsToPoints(Panel1.Width, False);
  pHeight := PixelsToPoints(Panel1.Height, True);
  oPPTPres.SlideShowSettings.ShowType := ppShowTypeSpeaker;
  oPPTPres.SlideShowSettings.Run.Width := pWidth;
  oPPTPres.SlideShowSettings.Run.Height := pHeight;
  screenClasshWnd := FindWindow('screenClass', nil);
  Windows.SetParent(screenClasshWnd, Panel1.Handle);
end;

手元にドキュメントはありませんが、私の考えでは、Run.Width と Run.Height はピクセルではなくポイントで指定する必要があります。ピクセルをポイントに変換する私の貧弱な解決策はここにあります。ここでのテストではうまくいきます...あなたの環境で正しい変換方法を見つけるのはあなた次第です。

プロパティからプレゼンテーション ウィンドウのハンドルを取得できると思われますが、oPPTPres.SlideShowSettings.Run.HWNDここでは機能しないため、FindWindow を呼び出します。

于 2011-04-16T01:35:52.613 に答える
4

RunはのメソッドでありTOleContainer、PowerPointプレゼンテーションやビットマップイメージなど、あらゆる種類のOLEオブジェクトに固有のメソッドではありません。ドキュメントには「サーバーアプリケーションが実行されていることを確認するためにRunを呼び出す」と記載されています

それらを操作するには、オブジェクト固有のメソッドを呼び出す必要があります。PowerPointオブジェクトモデルリファレンスを参照してください。サンプルコード:

procedure TForm1.Button1Click(Sender: TObject);
const
  ppAdvanceOnTime = $00000002;
var
  P: OleVariant;
  S: OleVariant;
  i: Integer;
begin
  P :=  OleContainer1.OleObject.Application.Presentations.Item(1);

  // below block would not be necessary for a slide show (i.e. a *.pps)
  for i := 1 to P.Slides.Count do begin
    P.Slides.Item(i).SlideShowTransition.AdvanceOnTime := True;
    P.Slides.Item(i).SlideShowTransition.AdvanceTime := 1;
  end;
  S := P.SlideShowSettings;
  S.AdvanceMode := ppAdvanceOnTime;

  S.Run;
end;


上記はスライドショーとしてプレゼンテーションを実行しますが、フルスクリーンで実行されるため、おそらくあなたが望むものではありません。コンテナウィンドウで実行する方法がわかりません。

于 2011-04-15T23:34:49.100 に答える