Здравствуйте!
Скажи пожалуйста, можно ли из разрабатываемого приложения по нажатию кнопки вставить в существующую презентацию (созданную в MOffice PowerPoint) новый слайд, и кроме того - на слайд вставить картинку из Paint..??
Можно... Связка Builder 2009 + PowerPoint из Office XP:
void __fastcall TForm1::Button8Click(TObject *Sender)Итого: все, что тебе нужно - это чтобы к моменту нажатия на кнопку в буфере обмена Windows находилась нужная картинка (чтобы запихать из Paint-а картинку в Clipboard достаточно найти окно Paint-а и послать ему нажатия Ctrl+A и Ctrl+C)... На приведенной конфигурации это отработало, на других версиях PP или Билдера могут быть несоответствия в количестве параметров у той или иной процедуры/функции, поэтому может потребоваться незначительная переделка.
{
Variant vPowerPoint;
try {
// Создаем экземпляр PowerPoint-а
vPowerPoint = CreateOleObject("PowerPoint.Application");
}
catch(...) {
// Если была ошибка при создании - сообщаем об этом
ShowMessage("Error...");
}
// Делаем PowerPoint видимым
vPowerPoint.OlePropertySet("Visible", true);
// Открываем нужную презентацию
vPowerPoint.
OlePropertyGet("Presentations").
OleFunction("Open", "F:\\P.ppt", false);
// Получаем количество слайдов в ней на данный момент,
// чтоб добавить новый куда нужно
int nSlides = vPowerPoint.
OlePropertyGet("ActivePresentation").
OlePropertyGet("Slides").
OlePropertyGet("Count");
// Добавляем новый слайд после всех присутствующих
vPowerPoint.
OlePropertyGet("ActivePresentation").
OlePropertyGet("Slides").
OleProcedure("Add",nSlides + 1, 2); // ppLayoutText
// Переходим ко вновь добавленному слайду
vPowerPoint.OlePropertyGet("ActiveWindow").
OlePropertyGet("View").
OleFunction("GoToSlide", nSlides + 1);
// Вставляем изображение из буфера обмена на слайд
vPowerPoint.
OlePropertyGet("ActiveWindow").
OlePropertyGet("View").
OleProcedure("Paste");
// Сохраняем презентацию
vPowerPoint.
OlePropertyGet("ActivePresentation").
OleFunction("Save");
// Выходим и освобождаем память
vPowerPoint.OleProcedure("Quit");
vPowerPoint = Unassigned;
}
void __fastcall TForm1::Button8Click(TObject *Sender)
{
Variant vPowerPoint;
try {
// Создаем экземпляр PowerPoint-а
vPowerPoint = CreateOleObject("PowerPoint.Application");
}
}
#include <ComObj.hpp>в проекте присутствует?
#include <ComObj.hpp>в проекте присутствует?
Проблема со вставкой рисунка на слайд..
Рисунок, как и нужно, находиться в буфере перед нажатием на кнопку...но приложение вылетает на строке:
// Вставляем изображение из буфера обмена на слайд
vPowerPoint.
OlePropertyGet("ActiveWindow").
OlePropertyGet("View").
OleProcedure("Paste");
Вот, что получилось:
Sub МакросPP_Builder()
'
' Макрос записан 08.03.2009. Автор: Milagro
'
ActivePresentation.Slides.Add(Index:=17, Layout:=ppLayoutText).Select
ActiveWindow.Selection.SlideRange.Shapes("Rectangle 3").Select
ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Select
ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Characters(Start:=1, Length:=0).Select
ActiveWindow.View.Paste
End Sub
В таком случае вставка из моего кода должна работать, у меня был такой макрос:
Уж не знаю, что изменилось, но всё сработало - спасибо большое!!
Хотелось бы узнать, как можно сохранить рисуночек из Paint не только в презентации, но и как непосредственно рисунок в определённой папке..Подскажите пожалуйста!
У тебя же есть этот рисунок в ClipBoard-е, так забери его оттуда и сохрани:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TPicture *p = new TPicture;
TJPEGImage *jpg = new TJPEGImage;
if(IsClipboardFormatAvailable(CF_BITMAP)) {
OpenClipboard(Form1->Handle);
p->LoadFromClipboardFormat(CF_BITMAP, (unsigned int)GetClipboardData(CF_BITMAP), 0);
CloseClipboard();
jpg->Assign(p->Bitmap);
jpg->SaveToFile(where_to_save);
}
delete jpg;
delete p;
}
Хм..странные вещи со вставкой рисунка на новый слайд..То работало - теперь снова проблемы..Этому можно найти какое-нибудь объяснение..?
Что, на одной той же машине? Или на разных?
Что произошло перед тем, как оно заработало? Перезагрузка? Или перезагрузки не было, а оно сначала никак не работало, а потом начало работать? Возможно, у тебя что-то с COM-сервером, и он после перезагрузки какое-то время работает, а потом что-то ломается и он работать перестает?
Ну, к примеру, объяви переменную - пусть будет Counter - в которую при запуске программы записывай количество JPG-файлов в нужной тебе папке (как ищутся файлы с определенным расширением, знаешь?). А потом - увеличивай Counter и сохраняй файл:
Counter += 1;
jpg->SaveToFile(IntToStr(Counter) + ".jpg");
int CountJPG(AnsiString dir)
{
TSearchRec sr;
AnsiString ext;
int res = 0;
for(int r = FindFirst(dir + "*.*", faAnyFile, sr); !r; r = FindNext(sr)) {
if (sr.Attr & faDirectory) continue; // Поддиректории пропускаем
ext = UpperCase(ExtractFileExt(sr.Name));
if(ext == ".JPG") res += 1;
// Application->ProcessMessages();
}
FindClose(sr);
return res;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Counter = CountJPG(ExtractFilePath(ParamStr(0))); // Директорию нужную в CountJPG передашь...
}