Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/56: Рейтинг темы: голосов - 56, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28

Работа с Olecontainer

02.07.2017, 16:13. Показов 10537. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер. Если кто в курсе – подскажите. При работе программы создаю в ней вторую форму, открываю в ней Olecontainer с встроенным пустым файлом Word. Цель – лень заполнять ручками (набивать) данные. Их же можно скачать из уже готового другого файла и вставить (есть необходимость вставить заполненную таблицу и потом уже раскидать значения из ее ячеек там, где надо). Вторая форма создается – все хорошо. В файл в Olecontainere таблица вставляется – все хорошо. Но при сохранении файла из Ole - сохраняется пустой исходник.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm2.FormShow(Sender: TObject);          // вывешиваю вторую форму
begin
  vWord := CreateOleObject('Word.Application');
  vWord.Visible := false;
  vWord.Documents.Open(ExtractFilePath (ParamStr(0))+'\Данные\1.docx'); 
 
 
oleobj1.CreateObject('Word.Application',False);         // при создании на второй форме Olecontainer  
                                                                                          сразу же открываю в ней документ
 
oleobj1.CreateObjectFromFile(ExtractFilePath(Application.ExeName)+'/Данные/1.docx',false);
oleobj1.DoVerb(ovOpen);
end;
……….
// Вношу изменения в открытый документ. Я его вижу, я в нем работаю. Типа все хорошо. (см. картинку)
……….
procedure TForm2.btn1Click(Sender: TObject);  // Закрываю документ
begin
vWord.ActiveDocument.SaveAs(ExtractFileDir(paramstr(0))+ '/Данные/11.docx');
vWord.ActiveDocument.Close (wdSaveChanges, wdOriginalDocumentFormat, False);
Проблема: Документ 11 остается такой же, как и был документ 1. Все изменения исчезают. Если в файле 1 изначально есть текст – он и переходи в файл 11. То есть процесс открытия файла, считывания, закрытия и сохранения как бы работает. Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.07.2017, 16:13
Ответы с готовыми решениями:

Работа с OleContainer и FileListBox
Парни такая проблема пишу дипломную , Завис на работе ФайллистБокса и Олеконтайнера . Вывожу список документов в папке через FileListBox ,...

Работа с Excel и OleContainer
Доброго всем времени суток, помогите сделать вот что: у меня на форме есть 2 кнопки и OleContainer. По нажатию на 1 кнопку производится...

Olecontainer
Как убрать меню в word при отображении в olecontainer delphi.

16
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
02.07.2017, 19:44
вводите данные в программу и сами делайте документ Word
и не нужно этого геморроя и оле-контейнеров
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28
02.07.2017, 19:56  [ТС]
Жалко терять время на нудную и неэффективную работу - заново набирать руками уже набранные таблицы.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
02.07.2017, 20:54
не надо набирать. надо только те данные, которые вводить, ввести в уже готовые шаблоны
но для этого не нужно открывать Word
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28
03.07.2017, 06:24  [ТС]
Во-первых, что бы найти готовую таблицу, из которой я должен взять информацию - Word открыть уже нужно. В идеале я бы выделил таблицу прямо в документе, скопировал бы ее в буфер и уже из него брал бы по кусочкам. Но я пока не нашел такой возможности. Кинуть таблицу в буфер можно, а вот выдрать из нее значения ячеек и скопировать каждое в нужном направлении (каждое в свой Edit, например)???
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
03.07.2017, 06:28
т.е. вы не знаете заранее, что в файле ??
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28
03.07.2017, 09:51  [ТС]
Только примерно. Например - состав компьютера - системный блок, монитор, клавиатура, мышь и принтер. Состав меняется редко, и комп, собранный 2-3 года назад при переучете набирать заново.... А так скопировал - и готово.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
03.07.2017, 10:06
у вас в коде происходит странное
сначала вы создаете один объект
Delphi
1
vWord := CreateOleObject('Word.Application');
потом второй
Delphi
1
oleobj1.CreateObject('Word.Application',False);
потом заполняете третий
Delphi
1
oleobj1.CreateObjectFromFile(...
а потом сохраняете vWord
Delphi
1
vWord.ActiveDocument.SaveAs(ExtractFileDir(paramstr(0))+ '/Данные/11.docx');
какая вообще связь между vWord и oleobj1 ???

офсайт
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28
03.07.2017, 13:07  [ТС]
1. я создаю объект Word ( vWord := CreateOleObject('Word.Application'). Без этого никак.
2. Объявляю в Oleconteiner присоединение файла Word; То же вроде все правильно.
3. Присоединяю к Ole (открываю в окне Ole) конкретный файл Word (у меня файл "1.docx"). Файл открывается. Вижу контрольную надпись "Файл-источник", которая была в файле изначально;
4. Вношу изменения в файл. Вставляю таблицу, текст, вношу правки - все работает, как в обычном Wordе. Даже если в подготовительных операциях (№№ 1-3) я что-то делал не так - неважно, все работает.
5. Пытаюсь после выхода документа Word из Ole закрыть файл с изменениями. Что и не получается.

Я пробовал разные варианты - пытался и сначала выйти из Ole, затем сохранить файл Word, закрыть Word, закрыть Oleconteiner. И сначала сохранить документ в Word, потом выйти из Ole, закрытьWord, закрыть Ole.
В самом лучшем случае файл сохраняется с другим названием (становится 11.docx). Но изменения, внесенные прямо в Ole (п.4), в файле не сохраняются.
Я бы пошел по другому пути - открыть файл Word, выделить в нем таблицу (скопировать ее в буфер обмена), и пытаться уже из него копировать нужную информацию по-ячейкам. Текст и картинки так обрабатывать можно - масса примеров с объяснениями. Как вытащить информацию из ячейки таблицы - пока не нашел.

Добавлено через 3 минуты
Только что увидел одну свою глупость. Я Olecontainer обозвал Oleobj. Из-за этого есть непонятки. Хотя на работу не влияет.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
03.07.2017, 13:14
тебе в посте №8 уже указали на причины: ты создаешь ДВЕ переменных. изменения проводишь в одной, а сохраняешь файл из другой. какие еще вопросы? ты уже создал объект vWord - вот и работай в нем, на кой еще oleobj1?

Добавлено через 56 секунд
а если ты изменения проводишь в oleobj1, так и СОХРАНЯЙ тоже oleobj1
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
03.07.2017, 13:28
Цитата Сообщение от Globus2017 Посмотреть сообщение
Без этого никак.
вы открывали ссылку? где там CreateOleObject('Word.Application'); или CreateObject('Word.Application',False); ???

что за операция "присоединение файла"? почему эта операция игнорируется разработчиками в примере?

и в чем глупость oleObj ?
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28
03.07.2017, 15:22  [ТС]
Oleobj1 - это Oleconteiner. У меня и не получается сохранить в этом самом контейнере изменения в документ Word.
То что Вы написали как OleContainer1.SaveAsDocument(SaveDialog1 .Именем) - вот это и не хочет работать. Только я это делаю без Dialog, автоматом, файл-исходник всегда один и тот же. Файл из 1.docx переименовывается в 11.docx, но все изменения теряются где-то на полпути.
стандартная процедура открытия (все взято с сайта, я не придумывал).
Delphi
1
2
3
4
begin
  if OpenDialog1.Execute then  // Это я убрал - мне не нужно искать файл. Тупо прописываю путь и все получается.
     OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, false);
end;
стандартная процедура активации. То же все работает. И Word и файл открываются.
Delphi
1
2
begin
       OleContainer1.DoVerb(ovShow);
А вот с этим я уже играюсь. Как закрыть с сохранением.
Delphi
1
2
begin
        OleContainer1.Close;
Не я первый выясняю именно этот момент

"" Если рабочий файл открыть в OleContainer и потом закрывать
oc1.Close;
oc1.DestroyObject;
то процесс надстройки не завершается. После завершения моей программы выдается сообщение об ошибке COM и в каталоге остается файл с тильдой.
Что нужно сделать, чтобы файл в OleContainer закрывался корректно как в оболочке Word?"" конец цитаты.

Добавлено через 34 минуты
Вот еще один пример на ту же тему. Если убрать все лишнее - будет один в один с моим текстом программы и с теми же проблемами

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm4.FormShow(Sender: TObject);
begin
  OleContainer1.CreateObject('Word.Application',False);
  OleContainer1.CreateObjectFromFile(ExtractFilePath(Application.ExeName)+'Помощь.doc',false);
  OleContainer1.DoVerb(ovOpen); 
  OleContainer1.OleObject.Protect(3); //  Это явно лишнее - запрет изменений в тексте Word
end;
 
procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  OleContainer1.DestroyObject;
end;
Добавлено через 15 минут
Еще один страдалец
""Добрый день, такая проблема, открываю в оле excel документ, потом я вношу руками туда записи и пытаюсь его сохранить вот так

OleContainer1.SaveAsDocument(Extractfile Path(Application.ExeName) + 'grafic.xlsx');

и пытаюсь открыть этот сохраненный файл опять, но пишет что формат файла поврежден или неверный, и все это после сохранения"" конец цитаты.
Наверное я перемудрил. Сделаю проще - без Ole контейнера просто открою пустой файл Word, кину туда талбицу и буду с ней работать. Не очень удобно, зато получится. Спасибо за помощь.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
03.07.2017, 16:33
вот где есть проблема, так то что оле контейнер не уважает свое место и занимает всю форму, поэтому пришлось выделить для него отдельную форму. результат
Delphi
1
2
3
4
5
procedure TForm1.b1Click(Sender: TObject);
begin
  Form2.ShowModal;
  form2.OleContainer1.OleObject.SaveAs(ExtractFilePath(ParamStr(0))+'333.doc');
end;
Delphi
1
2
3
4
5
procedure TForm2.FormShow(Sender: TObject);
begin
  OleContainer1.CreateObjectFromFile(ExtractFilePath(ParamStr(0))+'111.docx', false);
  OleContainer1.DoVerb(ovInPlaceActivate);
end;
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28
03.07.2017, 20:34  [ТС]
Спасибо. Вечером попробую.

Добавлено через 3 часа 41 минуту
Добрый вечер. Подскажите пожалуйста один момент.

procedure TForm1.b1Click(Sender: TObject);
begin
Form2.ShowModal;
form2.OleContainer1.OleObject.SaveAs(Ext ractFilePath(ParamStr(0))+'333.doc');
end;

procedure TForm2.FormShow(Sender: TObject);
begin
OleContainer1.CreateObjectFromFile(Extra ctFilePath(ParamStr(0))+'111.docx', false);
OleContainer1.DoVerb(ovInPlaceActivate);
end;

Как я понимаю, при появлении новой формы файл 111 открывается в окне.
При нажатии на Btn1 появляется новая форма и сразу же исходный файл '111' сохраняется как '333'? Но ведь это действие (сохранение) должно быть после работы с файлом 111 (внесения в него изменений).
Но почему Form2.ShowModal стоит перед сохранением измененного файла? Получается дали команду на появление второй формы и тут же файл в ней сохранили? Без изменений, до изменений. И я сейчас опять упрусь в необходимость сохранить файл с внесенными изменениями - именно это у меня и не получалось.

Добавлено через 6 минут
Не хочет работать. Даже вторая форма не появляется.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
03.07.2017, 20:48
я привел код прямо "с экрана" так что все работает

ShowModal Открывает форму и не выходит, пока форма не закрыта
соответственно когда вы наиграетесь, оно сохранит результат

стартовая форма Form1. На ней кнопка. При нажатии на кнопку открывается Form2 и не продолжит, пока не закроется
Form2 при открытии читает в контейнер файл 111.docx
и открывает его на редактирование

при закрытии Form2 содержимое контейнера сохраняется в файл 333.doc
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 28
04.07.2017, 05:44  [ТС]
все что я имею - на картинке

Добавлено через 1 час 17 минут
Я не смог победить Olecontainer. Но проблему я решил. Тупо и не изящно, но решил. Вызываю пустой файл Word, вставляю в него таблицу (копирую), и качаю значения из ячеек таблицы в программу, в Comboboxы. При закрывании программы файл будет убит - он больше не нужен. Не получается только одно - при вызове Wordа пустой документ открывается за моей программой, пару вариантов на сайтах нашел - они не срабатывают. Завтра разберемся.

Добавлено через 5 часов 50 минут
Ничего не получилось. Пишет Access violation in adress 0000000000. Плюнул и сделал попроще. Из программы открываю чистый лист Word. Без Ole. напрямую. Кидаю (копирую) на него нужную мне таблицу. А уж из таблицы из документа вытащить значения ячеек - даже я умею. Неизящно. Но результат - все работает. Осталось научиться открывать Word перед формой программы. Упирается. Прячется.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
04.07.2017, 06:49
то-есть сделать готовую программу из четырех строк по образцу не удалось и мы уже вот-вот перейдем к тому варианту, который я предлагал с самого начала.
ввести все нужные данные в программе, потом закинуть их в файл...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.07.2017, 06:49
Помогаю со студенческими работами здесь

OleContainer
Здравствуйте. Нарисовал курсором линию на OleContainer. Сделал прог.что-бы опознала точки линии на Form, но ведать OleContainer не выводит...

OleContainer
Доброго времени суток. Возникла проблема с сохранением файла формата *.xlsx при редактировании его в компоненте OleContainer. Файл...

OleContainer и менюшка
Вопрос на миллион :) в инете покопался кое что нашел попытался сделать но получилось нечто не то что ожидалось :) Скрин получившегося...

OleContainer и его сохранение
Доброго всем времени суток! проблема такова. Открываю через оле контейнер ворд документ. Таким способом: ...

Вывести Excel в OleContainer
Вечер добрый. подскажите как в OleContainer вывести файл Excel пробовал так OleContainer1->CreateObjectFromFile("путь",...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru