Начала работать в Delphi, так что буду мучить глупыми и неочень вопросами... Может ли прога открыть и вывести на экран doc-файл со встроенными в него объектами (формулами)? Если может, то как? Расскажите пожалуйста, очень нужно. И еще просьба, дайте ссылку на стандартные процедуры и функции в Дельфе. Заранее спасиибо!
То есть, тебе не надо иметь возможности редактирования файлов?
1. На каждой форме ставишь у TOleContainer-а свойство AutoActivate -> aaManual, это запретит открывать файл для редактирования (вернее, открыть-то можно будет, только для того, чтобы это сделать надо будет выполнить DoVerb(ovPrimary), например, по нажатию кнопки)
2. Popup меню по клику правой кнопкой на TOleContainer-е тоже убираем: AutoVerbMenu -> False
Если doc занимает больше одной страницы, то в Ole выводится только первая.
Тебе уже предлагали вариант с Protect-ом... Ты от него почему-то отказалась... Если тебя все-таки заинтересует этот метод, посмотри вот этот проект: project.rar ( 47.44 килобайт )
Кол-во скачиваний: 490
(там в папке Files только один исправленный файл, двухстраничный - запускай проект, сразу же жми на кнопку - это файл "Введение", и там, наверху, выше OleContainer-а, увидишь новую кнопочку... После нажатия на эту кнопку будет возможность листать содержимое файла, но никаких доп. панелек уже не будет - я их отключила)
Единственный недостаток этого метода - если пользователь откроет во время работы твоей программы Word, то он тоже будет безо всех тулбаров... Если тебя это не пугает - продолжай идти в этом направлении
А вообще-то, я бы попробовала создавать не несколько форм (по одной для каждого документа), а вообще одну, и ней создавать в TOleContainer-е нужный файл через OleContainer.CreateObjectFromFile... Тогда при изменении (тобой, НЕ программой) содержимого файлов не надо будет переприсоединять их к Контейнеру, не понадобится даже перекомпилировать проект, изменения вступят в силу сразу же...
Тебе уже предлагали вариант с Protect-ом... Ты от него почему-то отказалась...
Признаюсь честно, для меня это оказалось сложнова-то... да и инет тогда отрубился - пришлось делать как умею
Мне эту работу надо будет сдать на конференцию (районная сессия МАН). Ваши идеи - замечательные, большое за них спасибо, но если я сделаю так, мне скорее всего просто не поверят (да и совесть меня замучает - профи все сделали, а я просто тупо списала код)... Так что пусть лучше будет не очень хорошо, но зато свое.
Цитата
я бы попробовала создавать не несколько форм (по одной для каждого документа), а вообще одну
Т.е. форма одна, а Unit'ов несколько? Я правильно поняла? А тогда будет возможность открыть сразу несколько тем в разных окнах?
Я сейчас попробовала вставить в Ole "введения" edit , но во время выполнения он не двигается вместе с текстом, а в моем варианте двигался (но думаю и это дело попровимое?..).
Ну а все-таки есть другой способ исправить мою ошибку со страницами?
Ну а все-таки есть другой способ исправить мою ошибку со страницами?
Не думаю, что тебе удастся неактивный (а у тебя он именно неактивный, активизируется OLE-Object вызовом DoVerb) TOLEContainer передвинуть на другую страницу...
Боюсь тебя огорчить, но для того, чтобы сделать то, что тебе нужно с использованием Word-а тебе придется именно делать Protect с отключением всех тулбаров ...
Ну раз это единственный выход, то буду учиться))) Что можете сказать на счет этого:
Цитата
...попробовала вставить в Ole "введения" edit , но во время выполнения он не двигается вместе с текстом...
?
p.s. Можете, если не трудно, объяснить мне, что здесь делается (раз уж надо делать так, то надо понять это):
Код
procedure TForm2.Button1Click(Sender: TObject); var ev: olevariant; i: integer; const wdNumberOfPagesInDocument = 4; begin OleContainer1.DoVerb(ovShow); ev := 2;
for i:=1 to OleContainer1.OleObject.CommandBars.Count do if OleContainer1.OleObject.CommandBars.Item[i].Visible then OleContainer1.OleObject.CommandBars.Item[i].Visible:=False;
OleContainer1.OleObject.Protect(ev); end;
p.s. Как обычно в последние моменты на меня сходит озарение))) Зачем мне помещать edit'ы и кнопки в OleContainer'е, если это можно сделать под ним!? Так что вопрос отпадает...
Можете, если не трудно, объяснить мне, что здесь делается (раз уж надо делать так, то надо понять это):
Можем... Смотри:
procedure TForm2.Button1Click(Sender: TObject); var ev: olevariant; i: integer; const wdNumberOfPagesInDocument = 4; { <--- Это - лишняя строка ... } begin OleContainer1.DoVerb(ovShow); { Активизируем OLE объект, причем методом Show } ev := 2; { <--- степень защиты OLE - объекта, "только чтение" }
// А вот тут - проходим по всем тулбарам связанного с контейнером приложения // и устанавливаем всем невидимость, чтоб не мешали ... for i:=1 to OleContainer1.OleObject.CommandBars.Count do if OleContainer1.OleObject.CommandBars.Item[i].Visible then OleContainer1.OleObject.CommandBars.Item[i].Visible:=False;
// Ну, и наконец - устанавливаем желаемый уровень защиты OleContainer1.OleObject.Protect(ev); end;
Кстати, я не отвечал потому, что сделал тебе еще один альтернативный вариант: использование TWebBrowser-а (да, да, именно его ) и в нем - открытие того же самого файла, только сохраненного Word-ом в формат MHT - Web Archive... Посмотри, как это может выглядеть:
Сейчас еще больше удивишься, у меня как раз Delphi 6 Enterprise Когда я открывала project1.dpr мне вылезло вот что: Я нажимала и 'пропуск', и 'отмена' результат одинаковый((( А при выполнении это:
Слишком много выкладывать придется... Если бы это было так просто Все сложнее, значит у тебя не установлены Packages... Зайди в меню Component -> Install Packages, и проверь, есть ли у тебя "Internet Explorer Components" (это файл {Delphi Path}\Bin\dclie60.bpl)
Если нет - то придется тебе искать этот Package (если он нужен, конечно...)