Delphi — ОлеКонтейнер — PowerPoint — автозапуск

#delphi #powerpoint #autoplay

#delphi #powerpoint #автозапуск

Вопрос:

Добрый день :-), в моем приложении я использую OleContainer для просмотра презентации из Microsoft Powerpoint.

Этот код я использую для загрузки и запуска файла презентации:

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

Презентация была создана как слайд-шоу с автозапуском (в Microsoft PowerPoint работает), но в моем приложении презентация была все еще на первом слайде. Выполнить команду неправильно?

Ответ №1:

Вам не нужен OleContainer для запуска презентации внутри контейнера в вашем приложении. Поместите панель контейнера для запуска презентации в вашей форме и попробуйте эту процедуру:

 procedure TForm2.Button3Click(Sender: TObject);
const
  ppShowTypeSpeaker = 1;
  ppShowTypeInWindow = 1000;
  SHOW_FILE = 'C:UsersjcastilloDocumentstest.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;
  

У меня нет документации под рукой, но моя мысль запущена.Ширина и выполнение.Высота должна указываться в точках, а не в пикселях. Вот мое простое решение для преобразования пикселей в точки, и оно работает у меня в моих тестах здесь … найти правильный способ преобразования в вашей среде зависит от вас.

Предполагается, что вы можете получить дескриптор окна презентации из oPPTPres.SlideShowSettings.Run.HWND свойства, но у меня это здесь не работает, отсюда и вызов FindWindow.

Комментарии:

1. Если бы свойство HWND действительно существовало, это не следует рассматривать как взлом 🙂 Но там ничего нет ( объект SlideShowWindow ).

2. @jachguate: Как я могу остановить презентации до завершения и вернуть свойству HWND значение по умолчанию?

3. @Nanik, я не понимаю твоего вопроса… Я никогда не изменяю свойство HWND, поэтому по умолчанию возврата нет.

4. @jachguate: Могу ли я остановить презентацию до ее окончания и освободить ее от просмотра на панели?

5. @Nanik: Мне приходит в голову простая вещь: если вы заранее знаете, сколько времени займет презентация, использовать таймер для ее остановки.

Ответ №2:

Run это метод TOleContainer , это не метод, специфичный для какого-либо объекта OLE, скажем, презентации power Point или растрового изображения.. В документации говорится , что «Вызовите 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;
  

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

Комментарии:

1. Спасибо за ваше решение :-). Почему я не могу получить доступ по: OleContainer1. OLEObject. Приложение. Презентации. Пункт (1).Выполнить?

2. Есть ли какая-либо возможность проверить окончание воспроизведения?

3. @Nanik — Поскольку у ‘Презентации’ нет метода ‘Run’, у объекта ‘SlideShowSettings’ презентации есть. Должно быть: OleContainer1.OleObject.Application.Presentations.Item(1).SlideShowSettings.Run; Проверьте предоставленную мной ссылку (или код, если уж на то пошло).

4. @Nanik — Объект «Application» имеет событие «SlideShowEnd».

5. @Nanik — Возможно, в конечном итоге вы захотите перейти по ссылке, которую я опубликовал, и начать использовать документацию по объектной модели.. В любом случае, вызовите метод ‘Exit’ объекта ‘SlideShowView’. Для примера кода, который я опубликовал, это было бы S.Run.View.Exit . Что касается кода jachguate, я думаю, вы могли бы разобраться в этом сами. Если ничего другого не удается, это может быть сделано с помощью имитации клавиши Esc..