Delphi - OleContainer - PowerPoint - Автозапуск - PullRequest
3 голосов
/ 15 апреля 2011

Добрый день :-), в моем приложении я использую 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 работает), но в моем приложении презентация была все еще на первый слайд . Команда запуска не верна?

Ответы [ 2 ]

4 голосов
/ 16 апреля 2011

Вам не нужен 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.

4 голосов
/ 16 апреля 2011

Run - это метод TOleContainer, он не является методом, специфичным для какого-либо объекта 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;

Несмотря на то, что вышеизложенное запустит презентацию в виде слайд-шоу, вероятно, это не то, что вам нужно, потому что она работает в полноэкранном режиме.Я понятия не имею, как запустить его в окне контейнера ..

...