![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#1
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Здравствуйте!
Скажи пожалуйста, можно ли из разрабатываемого приложения по нажатию кнопки вставить в существующую презентацию (созданную в MOffice PowerPoint) новый слайд, и кроме того - на слайд вставить картинку из Paint..?? |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Можно... Связка Builder 2009 + PowerPoint из Office XP:
void __fastcall TForm1::Button8Click(TObject *Sender)
{
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;
}
Итого: все, что тебе нужно - это чтобы к моменту нажатия на кнопку в буфере обмена Windows находилась нужная картинка (чтобы запихать из Paint-а картинку в Clipboard достаточно найти окно Paint-а и послать ему нажатия Ctrl+A и Ctrl+C)... На приведенной конфигурации это отработало, на других версиях PP или Билдера могут быть несоответствия в количестве параметров у той или иной процедуры/функции, поэтому может потребоваться незначительная переделка. |
18192123 |
![]()
Сообщение
#3
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
void __fastcall TForm1::Button8Click(TObject *Sender)
{
Variant vPowerPoint;
try {
// Создаем экземпляр PowerPoint-а
vPowerPoint = CreateOleObject("PowerPoint.Application");
}
}
Что-то не то с функцией CreateOleObject.. На строке с этой функцией вот такая вот ошибка: [C++ Error] Unit1.cpp(23): E2268 Call to undefined function 'CreateOleObject'.. (тестировалось на C++ Builder 6..) Сообщение отредактировано: 18192123 - 8.03.2009 18:45 |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
#include <ComObj.hpp>
в проекте присутствует? |
18192123 |
![]()
Сообщение
#5
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
18192123 |
![]()
Сообщение
#6
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Проблема со вставкой рисунка на слайд..
Рисунок, как и нужно, находиться в буфере перед нажатием на кнопку...но приложение вылетает на строке:
// Вставляем изображение из буфера обмена на слайд
vPowerPoint.
OlePropertyGet("ActiveWindow").
OlePropertyGet("View").
OleProcedure("Paste");
Скажите пожалуйста, в чём может быть дело? Сообщение отредактировано: 18192123 - 8.03.2009 20:15 Эскизы прикрепленных изображений ![]() |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Рисунок, как и нужно, находиться в буфере перед нажатием на кнопку... Уверена, что он там находится в правильном формате? Если откроешь еще один Paint и нажмешь Ctrl+V перед нажатием на кнопку, рисунок вставится?Если вставляется, значит проблема в том, что у твоего PowerPoint-а другие методы. Сделай стандартным способом: открой свою презентацию в PowerPoint-е, выбери в меню Tools->Macro->Record New Macro..., и сделай все необходимые тебе действия по добавлению слайда и по добавлению в него картинки вручную. Когда получишь нужный результат, прекрати запись макроса, зайди в Tools->Macro->Macros... <имя записанного макроса> -> Edit, и покажи текст макроса, сгенерированного PowerPoint-ом. Будем смотреть ,что можно сделать... |
18192123 |
![]()
Сообщение
#8
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Вот, что получилось:
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
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
В таком случае вставка из моего кода должна работать, у меня был такой макрос:
Код ActiveWindow.View.GotoSlide Index:=ActivePresentation.Slides.Add(Index:=2, Layout:=ppLayoutText).SlideIndex ActiveWindow.Selection.SlideRange.Shapes("Rectangle 3").Select ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Select ActiveWindow.Selection.Unselect ActiveWindow.View.Paste , и именно он запрограммирован выше... Не знаю, в чем проблема. Что насчет правильности содержимого Clipboard-а? Какая у тебя версия PP? |
18192123 |
![]()
Сообщение
#10
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
18192123 |
![]()
Сообщение
#11
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Уж не знаю, что изменилось, но всё сработало - спасибо большое!!
Хотелось бы узнать, как можно сохранить рисуночек из Paint не только в презентации, но и как непосредственно рисунок в определённой папке..Подскажите пожалуйста! |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
У тебя же есть этот рисунок в 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;
}
|
18192123 |
![]()
Сообщение
#13
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Хм..странные вещи со вставкой рисунка на новый слайд..То работало - теперь снова проблемы..Этому можно найти какое-нибудь объяснение..?
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Что, на одной той же машине? Или на разных?
Что произошло перед тем, как оно заработало? Перезагрузка? Или перезагрузки не было, а оно сначала никак не работало, а потом начало работать? Возможно, у тебя что-то с COM-сервером, и он после перезагрузки какое-то время работает, а потом что-то ломается и он работать перестает? |
18192123 |
![]()
Сообщение
#15
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Что, на одной той же машине? Или на разных? Что произошло перед тем, как оно заработало? Перезагрузка? Или перезагрузки не было, а оно сначала никак не работало, а потом начало работать? Возможно, у тебя что-то с COM-сервером, и он после перезагрузки какое-то время работает, а потом что-то ломается и он работать перестает? Уж не знаю, как связано..Но стабильно начало работать, когда в презентации я добавила слайд. вставила туда вручную картинку из буфера..Далее запустила программу - всё прекрасно.. А у меня ещё такой вопрос: по сохранению рисунка из буфера..Скажите пожалуйста, как добиться, чтобы сохранение каждый раз было по новому адресу? например: 1.jpg 2.jpg .. |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Ну, к примеру, объяви переменную - пусть будет Counter - в которую при запуске программы записывай количество JPG-файлов в нужной тебе папке (как ищутся файлы с определенным расширением, знаешь?). А потом - увеличивай Counter и сохраняй файл:
Counter += 1;
jpg->SaveToFile(IntToStr(Counter) + ".jpg");
|
18192123 |
![]()
Сообщение
#17
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
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 передашь...
}
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 20:45 |