Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Doc-файлы

Автор: Айра 21.01.2007 23:32

Начала работать в Delphi, так что буду мучить глупыми и неочень вопросами... blink.gif
Может ли прога открыть и вывести на экран doc-файл со встроенными в него объектами (формулами)? Если может, то как? Расскажите пожалуйста, очень нужно.
И еще просьба, дайте ссылку на стандартные процедуры и функции в Дельфе. Заранее спасиибо! smile.gif

Автор: klem4 22.01.2007 0:19

DRKB -> Работа с MS Word

Но про импорт формул я там ничего не вижу, да и вообще как-то мне это маловозможным кажется ...

Цитата
И еще просьба, дайте ссылку на стандартные процедуры и функции в Дельфе


Экхм, купи себе учебник хороший smile.gif В интете полно онлайн учебников. Ну или спрашивай конкретно функции для работы с чем тебя интересуют ?

Автор: мисс_граффити 22.01.2007 0:33

Цитата
Но про импорт формул я там ничего не вижу, да и вообще как-то мне это маловозможным кажется ...

через OLE-контейнер можно попробовать....
сейчас поэкспериментирую, если удастся - расскажу.

Автор: volvo 22.01.2007 0:58

Цитата
через OLE-контейнер можно попробовать....
Можно не пробовать, ибо все работает... На Сурсах мы как-то эту тему на 5 страницах развивали, там чего только через OLE не делали с этими формулами... smile.gif Надо найти ссылку...

Автор: мисс_граффити 22.01.2007 1:26

Сорри за нарушение правил...
Но только что выяснила, как выглядит OLE-контейнер физически:
Прикрепленное изображение

М
Юля, кстати, а ты знаешь, что OLE (Object Linking and Embedding) переводится на русский, как ПиВО (Подключение и Внедрение Объектов)? smile.gif
volvo


Автор: Айра 22.01.2007 18:46

Цитата
спрашивай конкретно функции для работы с чем тебя интересуют ?

Для работы с числами (целыми, вещественными), чтения и вывода чисел (из/в Edit)...

Нашла на диске про OLE, буду разбираться, но ссылку все равно жду с нетерпением... smile.gif

Автор: мисс_граффити 22.01.2007 19:39

Цитата
Для работы с числами (целыми, вещественными), чтения и вывода чисел (из/в Edit)...

Для чтения и вывода...
Дело в том, что свойство Edit'a Text - это строка. Соответственно, ее надо преобразовать в число.
Для этого можно использовать либо паскалевский val, либо такие конструкции, как StrToInt для целых и StrToFloat для вещественных. И то, и другое - функции, поэтому:
a: integer;
...
a:=StrToInt(Edit6.Text);

Для вывода - наоборот: FloatToStr и IntToStr (либо паскалевский Str)
Для ввода целых чисел иногда удобнее использовать SpinEdit (закладка Samples палитры компонентов), свойство Value - это целое число.

А что еще ты хочешь с числами делать?

Цитата
Юля, кстати, а ты знаешь, что OLE (Object Linking and Embedding) переводится на русский, как ПиВО (Подключение и Внедрение Объектов)?

Знаю, конечно smile.gif Это, пожалуй, единственное, что нам рассказали про OLE на лекции. smile.gif

Автор: Айра 23.01.2007 0:15

Спасибо!)))))))

Цитата
А что еще ты хочешь с числами делать?

Размечталась, что есть еще функции и для возведения в степень и т.п... Наивная... wink.gif
А на счет doc'a я так поняла, что файл надо будет открывать в OleContainer'e. Если нет, то где и как?
p.s. кстати OLE - это почти в честь меня... smile.gif

Автор: volvo 23.01.2007 0:20

Цитата
Размечталась, что есть еще функции и для возведения в степень и т.п...
Подключаешь модуль Math и радуешься жизни: Power, IntPower, ...

Автор: Айра 23.01.2007 1:14

Благодарствую! А про OLE я правильно поняла?

Автор: volvo 23.01.2007 1:19

Да, работай через OLEContainer...

Автор: Айра 23.01.2007 2:36

Ураааааааа! Я это сделала! yahoo!.gif Спасибо всем!
А вот теперь думаю. Моя прога, как я раньше хотела, должна была по нажатию кнопки открыть doc-файл (их много), но может обойтись без файлов, так все загнать? Посоветуйте, пожалуйста.
И еще. В OLEContainer'e есть что-нибудь вроде прокрутки (я не нашла, а текст большой, неудобно), и кнопки и Edit'ы на нем помещать ведь можно?

Автор: volvo 23.01.2007 3:20

Айра, смотри:
Прикрепленное изображение

А всего-то навсего, я добавил одну строку:

    OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False);
OleContainer1.DoVerb(1); { <--- Вот эту ... }

wink.gif

Автор: Айра 23.01.2007 3:34

Спасибо!!! Вы меня спасли!!! give_rose.gif
p.s. Надеюсь большую часть до завтра сделаю, а тогда недельку мне еще выделят...

Автор: мисс_граффити 23.01.2007 4:17

А что надо сделать, если не секрет? Какое глобальное задание?

Автор: Айра 23.01.2007 4:17

Извиняюсь, но за моей дурной головой, всему покоя нет... unsure.gif

Цитата
OleContainer1.DoVerb(1);
дает доступ к редактированию текста, а в прог-ме это лишнее.
В моей книжке написано про ScrollBars (ssVertical), но в OLE я его не нашла. Есть что-нибуть похожее с этой штукой (скроллер вроде называется, забыла).

Автор: volvo 23.01.2007 4:36

Нет в TOleContainer-е полос прокрутки...

Но твою проблему можно решить - попробуй сделать так:

procedure TForm1.Button1Click(Sender: TObject);
var ev: variant;
begin
if OpenDialog1.Execute then begin
OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False);
OleContainer1.DoVerb(ovShow);
ev := 2;
OleContainer1.OleObject.Protect(ev); { <--- !!! }
end;
end;

и отредактировать текст smile.gif

Я хочу посмотреть, как это у тебя получится... Однако, прокрутка по-преднему работает...

Можно еще поотключать всякие ненужные менюшки/кнопочки, если надо - скажи, какие именно, я покажу как они отключаются...

Автор: Айра 23.01.2007 4:44

Цитата
А что надо сделать, если не секрет? Какое глобальное задание?

Помнишь я просила натолкнуть на мысль по т/в - это сюда же. Вобщем должно получиться что-то вроде программы-учебника, в которой помимо теории и практики есть "мини-приложения", где можно ввести свои цифры, что-то посчитать и т.п.
А я (впрочем как и многие другие) начала все делать почти в последний момент...
Цитата
Я хочу посмотреть, как это у тебя получится...

Спасибо, volvo!
Сейчас начну, как что-то сделаю выложу, но не суди строго...

Автор: Айра 24.01.2007 2:13

Вчера ночью (сегодня почти утром smile.gif) начала отвечать, но предательски закончилась карточка. wink.gif
Вот что у меня получилось:

Код
unit proba;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtnrs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OleContainer1: TOleContainer;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ev: variant;
begin
  if OpenDialog1.Execute then begin
    OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False);
    OleContainer1.DoVerb(ovShow);
    ev := 2;
    OleContainer1.OleObject.Protect(ev); { <--- !!! }

end;
end;
end.

Большая часть кнопок не работает, но если опять попытаться открыть файл (еще раз надовить на кнопку), а потом нажать отмена, то картина получится следующей:

Прикрепленное изображение

Потом помучалась еще над своей прогой ('работают' только первые 4 раздела), получилось следующее (у меня скроллер на форме появлялся сам, когда запускала ее):
Прикрепленный файл  GlavnoeMenu.pas ( 653 байт ) Кол-во скачиваний: 494

Прикрепленный файл  vvedenie.pas ( 358 байт ) Кол-во скачиваний: 513

Прикрепленный файл  literarura.pas ( 360 байт ) Кол-во скачиваний: 515

Прикрепленный файл  TeoriyaVer.pas ( 1.47 килобайт ) Кол-во скачиваний: 491

Вроде работает, но я особо над ней не издевалась... Жду различных отзывов...

p.s. если как-то неправильно вставила файлы (или не те, что не исключено), то научите?... unsure.gif

Автор: volvo 24.01.2007 2:26

А можно весь проект заархивировать, и выложить (без EXE и DCU-файлов)? Чтобы можно было откомпилировать и посмотреть именно то, что есть у тебя ... Желательно с DOC-файлами ...

Автор: Айра 24.01.2007 3:11

Цитата
А можно весь проект заархивировать... Желательно с DOC-файлами...

Можно:
Прикрепленный файл  _______.rar ( 76.15 килобайт ) Кол-во скачиваний: 413

На текст особо не обращай внимания, он еще не доделан... wink.gif

Автор: volvo 24.01.2007 3:29

То есть, тебе не надо иметь возможности редактирования файлов?

1. На каждой форме ставишь у TOleContainer-а свойство AutoActivate -> aaManual, это запретит открывать файл для редактирования (вернее, открыть-то можно будет, только для того, чтобы это сделать надо будет выполнить DoVerb(ovPrimary), например, по нажатию кнопки)

2. Popup меню по клику правой кнопкой на TOleContainer-е тоже убираем: AutoVerbMenu -> False

Попробуй внести пока эти изменения...

Автор: Айра 24.01.2007 3:54

Цитата
То есть, тебе не надо иметь возможности редактирования файлов?

Да
Цитата
Попробуй внести пока эти изменения...

Спасибо!! Я об этом как раз спросить собиралась. Изменения успешно внесены))))
А так программа нормальная (всмысле работать будет нормально)?

Автор: Айра 27.01.2007 3:42

Возникла проблема. Если doc занимает больше одной страницы, то в Ole выводится только первая.
Объясните, пожалуйста, почему и как это исправить?

Автор: Алена 27.01.2007 19:47

Цитата
Если doc занимает больше одной страницы, то в Ole выводится только первая.
Тебе уже предлагали вариант с Protect-ом... Ты от него почему-то отказалась... Если тебя все-таки заинтересует этот метод, посмотри вот этот проект:
Прикрепленный файл  project.rar ( 47.44 килобайт ) Кол-во скачиваний: 402


(там в папке Files только один исправленный файл, двухстраничный - запускай проект, сразу же жми на кнопку - это файл "Введение", и там, наверху, выше OleContainer-а, увидишь новую кнопочку... После нажатия на эту кнопку будет возможность листать содержимое файла, но никаких доп. панелек уже не будет - я их отключила)

Единственный недостаток этого метода - если пользователь откроет во время работы твоей программы Word, то он тоже будет безо всех тулбаров... Если тебя это не пугает - продолжай идти в этом направлении smile.gif

А вообще-то, я бы попробовала создавать не несколько форм (по одной для каждого документа), а вообще одну, и ней создавать в TOleContainer-е нужный файл через OleContainer.CreateObjectFromFile... Тогда при изменении (тобой, НЕ программой) содержимого файлов не надо будет переприсоединять их к Контейнеру, не понадобится даже перекомпилировать проект, изменения вступят в силу сразу же...

Автор: Айра 28.01.2007 1:44

Цитата
Тебе уже предлагали вариант с Protect-ом... Ты от него почему-то отказалась...

Признаюсь честно, для меня это оказалось сложнова-то... да и инет тогда отрубился - пришлось делать как умею wink.gif

Мне эту работу надо будет сдать на конференцию (районная сессия МАН). Ваши идеи - замечательные, большое за них спасибоgood.gif, но если я сделаю так, мне скорее всего просто не поверят (да и совесть меня замучает - профи все сделали, а я просто тупо списала код)... Так что пусть лучше будет не очень хорошо, но зато свое.
Цитата
я бы попробовала создавать не несколько форм (по одной для каждого документа), а вообще одну

Т.е. форма одна, а Unit'ов несколько? Я правильно поняла?
А тогда будет возможность открыть сразу несколько тем в разных окнах?

Я сейчас попробовала вставить в Ole "введения" edit , но во время выполнения он не двигается вместе с текстом, а в моем варианте двигался (но думаю и это дело попровимое?..).

Ну а все-таки есть другой способ исправить мою ошибку со страницами? smile.gif

Автор: volvo 28.01.2007 3:33

Цитата
Ну а все-таки есть другой способ исправить мою ошибку со страницами?
Не думаю, что тебе удастся неактивный (а у тебя он именно неактивный, активизируется OLE-Object вызовом DoVerb) TOLEContainer передвинуть на другую страницу...

Автор: Айра 28.01.2007 3:44

А как его сделать активным или остается только Protect?

Автор: volvo 28.01.2007 4:04

Боюсь тебя огорчить, но для того, чтобы сделать то, что тебе нужно с использованием Word-а тебе придется именно делать Protect с отключением всех тулбаров ...

Автор: Айра 28.01.2007 4:09

Ну раз это единственный выход, то буду учиться)))
Что можете сказать на счет этого:

Цитата
...попробовала вставить в 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'е, если это можно сделать под ним!? Так что вопрос отпадает...

Автор: volvo 28.01.2007 6:48

Цитата
Можете, если не трудно, объяснить мне, что здесь делается (раз уж надо делать так, то надо понять это):
Можем... Смотри:

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-а (да, да, именно его smile.gif ) и в нем - открытие того же самого файла, только сохраненного Word-ом в формат MHT - Web Archive... Посмотри, как это может выглядеть:


Прикрепленные файлы
Прикрепленный файл  test.rar ( 10.65 килобайт ) Кол-во скачиваний: 178

Автор: Айра 28.01.2007 20:09

С процедурой я разобралась, спасибо)))

Попробовала открыть и выполнить project1.dpr, но мне вылезло 'class TWebBrowser not found' и SHDocVw.dcu тоже не найден((( Где можно их взять?

Автор: volvo 28.01.2007 20:27

Значит, у тебя в Дельфи они не установлены... blink.gif Странно. В Delphi 6 Enterprise это все уже есть... Какая версия у тебя?

Автор: Айра 28.01.2007 20:50

Сейчас еще больше удивишься, у меня как раз Delphi 6 Enterprise blink.gif
Когда я открывала project1.dpr мне вылезло вот что:
Прикрепленное изображение
Я нажимала и 'пропуск', и 'отмена' результат одинаковый(((
А при выполнении это:
Прикрепленное изображение

Автор: volvo 28.01.2007 21:06

У тебя что, вот этого файла нет? blink.gif




Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Айра 29.01.2007 0:55

Нет((( А можно его сюда выложить?
Кстати, у меня в Source вообще только Rtl, Samples и Vcl!? Может у меня версия неполная...

Автор: volvo 29.01.2007 1:16

Слишком много выкладывать придется... Если бы это было так просто no1.gif Все сложнее, значит у тебя не установлены Packages... Зайди в меню Component -> Install Packages, и проверь, есть ли у тебя "Internet Explorer Components" (это файл {Delphi Path}\Bin\dclie60.bpl)

Если нет - то придется тебе искать этот Package (если он нужен, конечно...) yes2.gif

Автор: Айра 29.01.2007 1:36

Цитата
есть ли у тебя "Internet Explorer Components" (это файл {Delphi Path}\Bin\dclie60.bpl)

Нет mega_chok.gif
Ну что ж, попробую поикать.
А можно посмотреть, как оно должно было работать (на картинке) rolleyes.gif

Автор: volvo 29.01.2007 1:41

Вот так:



Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: Айра 29.01.2007 1:56

Да. Выглядит отлично)))


Ищу, но пока не выходит (надо было хорошо учить английский)

Автор: Айра 29.01.2007 4:18

Не могу найти ypriamii.gif
Как правильно назвать в поиске? unsure.gif




добавлено: нашла HTML Utils 1.0, не оно? unsure.gif

Автор: volvo 29.01.2007 4:27

Я вышлю тебе этот файл, но если вдруг он потребует еще чего-то, то...

Распакуй BPL в папку BIN, зайди туда, куда я написал выше, и попробуй добавить компонент, выбери этот файл... Может и получится...

А, нет... Не получится... У тебя же исходников нету... sad.gif


Прикрепленные файлы
Прикрепленный файл  dclie60.rar ( 4.24 килобайт ) Кол-во скачиваний: 157

Автор: Айра 29.01.2007 4:56

Цитата
Не получится...

Пишет, что vclie60.bpl а потом и dclie60.bpl (странно) не найдены.

Sorry, слишком долго отвечала...
Вобщем пишу что нашла, что-нибудь подходит?

RichView (Delphi version) 1.9.24 - Пакет компонентов для Delphi, позволяющих просматривать, редактировать ... гипертекстовые документы ... экспорт в HTML, импорт ...

TextToHTML 1.0 - Компонент позволяющий конвертировать обычные строки в HTML-код для правильного визуального восприятия в соответсвии с маркировкой языка HTML. Например, &(&), <(<)

NewPas III 1 - в нем более 20 компонентов, среди которых есть BrowseExecutor.

исходники HTMLCoolEdit`а 1.261 - HTMLCoolEdit - это тэговый HTML-редактор с исходниками (Delphi5), позволяющий работать над текстом в стиле 1st Page 2000, HomeSite, AceExpert и др.

PowerPack for FastReport2.47 2.47 - Импорт из MS Word ... Экспорт в RTF, XLS, HTM...




p.s. чувствую себя идиоткой...)))

Автор: Айра 29.01.2007 18:08

Больше ничего толкового не нашла, но завтра днем должны принести, вроде как, полную Delphi 5 или 6. Буду ждать... А пока, не объясните эту процедуру?))

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ExtractFileDir(ParamStr(0)) + '\part_2.mht');
WebBrowser1.Navigate(ExtractFileDir(ParamStr(0)) + '\part_2.mht');
end;

Автор: volvo 29.01.2007 18:15

Ну, первая строка опять же тестовая, ее можно и убрать... Я сначала проверяю, правильно ли конструируется путь к файлу, и только потом пытаюсь его загрузить в TWebBrowser (Navigate работает не только с URL-ами, а и с любыми локальными файлами, которые в принципе открываются Internet Expolorer-ом)

Автор: Айра 29.01.2007 18:25

Понятно, спасибо! smile.gif

Автор: Айра 31.01.2007 1:49

Принесли мне Delphi5, не на родном диске, а так, папку с компа загнали, вообщем сама по себе она не работает, но нужные файлы есть. Я все чего у меня не было перенесла в 6-ю и вышеописанные проблемы исчезли, но... когда компилируешь проект получается следующее (курсор на месте ошибки):
Прикрепленное изображение
Это можно исправить? Или это глюк симбиоза 5-й и 6-й версий)))

Автор: volvo 31.01.2007 2:18

Попробуй вот этот файл (это из шестой версии):


Добавлено через 1 мин. 57 сек.
Если тоже не сработает - значит, глюк smile.gif


Прикрепленные файлы
Прикрепленный файл  SHDocVw.rar ( 13 килобайт ) Кол-во скачиваний: 148

Автор: Айра 31.01.2007 2:46

Заменила свой файл.
А вот дальше, может это и бред, но я удалила из uses'a SHDocVw и все заработало blink.gif
Буду переделывать программу.
Большое спасибо!!!




p.s. если не получится, ждите еще партию вопросов)))

Автор: Айра 31.01.2007 7:45

Переделала первые 4 пункта "Главного меню".

p.s. Какой еще вопрос по программе может задать девушка))) => где мне взять такой же скроллер (красивый) как был на твоем примере (на прошлой странице), а то у меня все под Windows98? smile.gif

Автор: Айра 2.02.2007 17:28

Сделала почти всю программу (осталоль только вычисление факториала добавить).
Еще раз огромное спасибо, volvo!!! good.gif give_rose.gif Без твоей помощи я бы не справилась.

Автор: Гость 30.01.2008 14:28

Подскажите пожалуйтса, как сделать защиту от записи в Excel. Открыва. в olecontainer.... OC.OleObject.Protect(ev) не по магает, говорит не верно заданный параметр...

Автор: volvo 30.01.2008 15:07

У Excel-я другой Protect, делается он для ActiveSheet:

begin
OleContainer1.CreateObjectFromFile('G:\test.xls', False);
OleContainer1.DoVerb(ovShow);
OleContainer1.OleObject.ActiveSheet.Protect(True, True, True);
end;