Помощь - Поиск - Пользователи - Календарь
Полная версия: Doc-файлы
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Страницы: 1, 2
Айра
Начала работать в Delphi, так что буду мучить глупыми и неочень вопросами... blink.gif
Может ли прога открыть и вывести на экран doc-файл со встроенными в него объектами (формулами)? Если может, то как? Расскажите пожалуйста, очень нужно.
И еще просьба, дайте ссылку на стандартные процедуры и функции в Дельфе. Заранее спасиибо! smile.gif
klem4
DRKB -> Работа с MS Word

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

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


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

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

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

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

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

Нашла на диске про OLE, буду разбираться, но ссылку все равно жду с нетерпением... smile.gif
мисс_граффити
Цитата
Для работы с числами (целыми, вещественными), чтения и вывода чисел (из/в 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
Айра
Спасибо!)))))))
Цитата
А что еще ты хочешь с числами делать?

Размечталась, что есть еще функции и для возведения в степень и т.п... Наивная... wink.gif
А на счет doc'a я так поняла, что файл надо будет открывать в OleContainer'e. Если нет, то где и как?
p.s. кстати OLE - это почти в честь меня... smile.gif
volvo
Цитата
Размечталась, что есть еще функции и для возведения в степень и т.п...
Подключаешь модуль Math и радуешься жизни: Power, IntPower, ...
Айра
Благодарствую! А про OLE я правильно поняла?
volvo
Да, работай через OLEContainer...
Айра
Ураааааааа! Я это сделала! yahoo!.gif Спасибо всем!
А вот теперь думаю. Моя прога, как я раньше хотела, должна была по нажатию кнопки открыть doc-файл (их много), но может обойтись без файлов, так все загнать? Посоветуйте, пожалуйста.
И еще. В OLEContainer'e есть что-нибудь вроде прокрутки (я не нашла, а текст большой, неудобно), и кнопки и Edit'ы на нем помещать ведь можно?
volvo
Айра, смотри:
Нажмите для просмотра прикрепленного файла

А всего-то навсего, я добавил одну строку:
    OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False);
OleContainer1.DoVerb(1); { <--- Вот эту ... }

wink.gif
Айра
Спасибо!!! Вы меня спасли!!! give_rose.gif
p.s. Надеюсь большую часть до завтра сделаю, а тогда недельку мне еще выделят...
мисс_граффити
А что надо сделать, если не секрет? Какое глобальное задание?
Айра
Извиняюсь, но за моей дурной головой, всему покоя нет... unsure.gif
Цитата
OleContainer1.DoVerb(1);
дает доступ к редактированию текста, а в прог-ме это лишнее.
В моей книжке написано про ScrollBars (ssVertical), но в OLE я его не нашла. Есть что-нибуть похожее с этой штукой (скроллер вроде называется, забыла).
volvo
Нет в 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

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

Можно еще поотключать всякие ненужные менюшки/кнопочки, если надо - скажи, какие именно, я покажу как они отключаются...
Айра
Цитата
А что надо сделать, если не секрет? Какое глобальное задание?

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

Спасибо, volvo!
Сейчас начну, как что-то сделаю выложу, но не суди строго...
Айра
Вчера ночью (сегодня почти утром 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 раздела), получилось следующее (у меня скроллер на форме появлялся сам, когда запускала ее):
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Вроде работает, но я особо над ней не издевалась... Жду различных отзывов...

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

Можно:
Нажмите для просмотра прикрепленного файла
На текст особо не обращай внимания, он еще не доделан... wink.gif
volvo
То есть, тебе не надо иметь возможности редактирования файлов?

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

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

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

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

Спасибо!! Я об этом как раз спросить собиралась. Изменения успешно внесены))))
А так программа нормальная (всмысле работать будет нормально)?
Айра
Возникла проблема. Если doc занимает больше одной страницы, то в Ole выводится только первая.
Объясните, пожалуйста, почему и как это исправить?
Алена
Цитата
Если doc занимает больше одной страницы, то в Ole выводится только первая.
Тебе уже предлагали вариант с Protect-ом... Ты от него почему-то отказалась... Если тебя все-таки заинтересует этот метод, посмотри вот этот проект:
Нажмите для просмотра прикрепленного файла

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

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

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

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

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

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

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

Ну а все-таки есть другой способ исправить мою ошибку со страницами? smile.gif
volvo
Цитата
Ну а все-таки есть другой способ исправить мою ошибку со страницами?
Не думаю, что тебе удастся неактивный (а у тебя он именно неактивный, активизируется OLE-Object вызовом DoVerb) TOLEContainer передвинуть на другую страницу...
Айра
А как его сделать активным или остается только Protect?
volvo
Боюсь тебя огорчить, но для того, чтобы сделать то, что тебе нужно с использованием 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'е, если это можно сделать под ним!? Так что вопрос отпадает...
volvo
Цитата
Можете, если не трудно, объяснить мне, что здесь делается (раз уж надо делать так, то надо понять это):
Можем... Смотри:

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... Посмотри, как это может выглядеть:
Айра
С процедурой я разобралась, спасибо)))

Попробовала открыть и выполнить project1.dpr, но мне вылезло 'class TWebBrowser not found' и SHDocVw.dcu тоже не найден((( Где можно их взять?
volvo
Значит, у тебя в Дельфи они не установлены... blink.gif Странно. В Delphi 6 Enterprise это все уже есть... Какая версия у тебя?
Айра
Сейчас еще больше удивишься, у меня как раз Delphi 6 Enterprise blink.gif
Когда я открывала project1.dpr мне вылезло вот что:
Нажмите для просмотра прикрепленного файла
Я нажимала и 'пропуск', и 'отмена' результат одинаковый(((
А при выполнении это:
Нажмите для просмотра прикрепленного файла
volvo
У тебя что, вот этого файла нет? blink.gif

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

Если нет - то придется тебе искать этот Package (если он нужен, конечно...) yes2.gif
Айра
Цитата
есть ли у тебя "Internet Explorer Components" (это файл {Delphi Path}\Bin\dclie60.bpl)

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


Ищу, но пока не выходит (надо было хорошо учить английский)
Айра
Не могу найти ypriamii.gif
Как правильно назвать в поиске? unsure.gif




добавлено: нашла HTML Utils 1.0, не оно? unsure.gif
volvo
Я вышлю тебе этот файл, но если вдруг он потребует еще чего-то, то...

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

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

Пишет, что 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. чувствую себя идиоткой...)))
Айра
Больше ничего толкового не нашла, но завтра днем должны принести, вроде как, полную 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
Ну, первая строка опять же тестовая, ее можно и убрать... Я сначала проверяю, правильно ли конструируется путь к файлу, и только потом пытаюсь его загрузить в TWebBrowser (Navigate работает не только с URL-ами, а и с любыми локальными файлами, которые в принципе открываются Internet Expolorer-ом)
Айра
Понятно, спасибо! smile.gif
Айра
Принесли мне Delphi5, не на родном диске, а так, папку с компа загнали, вообщем сама по себе она не работает, но нужные файлы есть. Я все чего у меня не было перенесла в 6-ю и вышеописанные проблемы исчезли, но... когда компилируешь проект получается следующее (курсор на месте ошибки):
Нажмите для просмотра прикрепленного файла
Это можно исправить? Или это глюк симбиоза 5-й и 6-й версий)))
volvo
Попробуй вот этот файл (это из шестой версии):


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




p.s. если не получится, ждите еще партию вопросов)))
Айра
Переделала первые 4 пункта "Главного меню".

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