#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..