Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

OLE+WORD   Найти похожие ветки 

 
AL CAPONE   (2005-03-06 20:19) [0]

Народ, помогите плиз кто чем сможет. Ситуация такова: имеется doc-файл с таблицей из 3-х столбцов и 400 строк, в 1-м столбце номера от 1 до 400 соответственно, во 2-м столбце вопрос и 5 вариантов ответа к нему, в 3-м столбце правильные ответы (сложность в том, что правильных ответов на 1 вопрос может быть несколько, и они хранятся в WORD в виде , например, 1 2 или 3 5). Теперь вопросы :
1) как предварительно из этого файла считать правильные ответы в таблицу Paradox 7.0 следующего вида :
номер вопроса / ответ1/ ответ2/ ответ3/ ответ4/ ответ5 ,
где номер вопроса берётся из 1-го столбца DOC-файла, а дальше , если у заданного вопроса среди правильных ответов есть, например ответ 4, то нужно в базу поставить единицу в столбец ответ4, иначе в базу нужно поставить 0;
2) как с помощью OLE-технологий произвести считывание вопроса с заданным номером из такого DOC-файла и на какой компонент формы его можно забросить для корректного отображения.
Все заранее огромное спасибо за помощь !


 
GanibalLector ©   (2005-03-07 01:52) [1]

Информации по этому поводу предостаточно.Главное желание!Кстати,ЮрийЖЛ статейку написал неплохую(даже обечал подредактировать чуток).Общий принцип таков :

var WordApp:Variant;
begin
WordApp := CreateOleObject("Word.Application");
try
  WordApp.Documents.Open("C:\2.doc");
  WordApp.Visible:=true;
  Messagedlg("Ячейка [2,2] таблицы №1="+
             WordApp.ActiveDocument.Tables.Item(1).Cell(2,2).Range.Text,mtinformation,[MbOk],0);
finally
  WordApp:=UnAssigned;
end;
end;


 
AL CAPONE   (2005-03-08 12:07) [2]

Спасибо за дельный совет. Вcё получается довольно просто при использовании этой процедуры.
Вот только есть несколько вопросов:
1) при повторном запуске этой процедуры программа выдаёт ошибку, что документ WORD уже занят, и пытается открыть его только для чтения, т.е. не срабатывает процедура закрытия
WordApp:=UnAssigned; может быть WORD можно корректно закрыть каким-либо другим способом ?
2) что означают параметры RANGE и TEXT в твоей процедуре ? Какие ещё параметры можно использовать в данном случае ?
3) при считывании ячейки WORD-а (в которой записаны только числа) с помощью этой процедуры программа возвращает не только число, реально записанное в ячейке, но после него и какие-то символы "?"-прямоугольник, а их дальнейшее использование в таком виде неприемлимо. Что это может быть и как с этим бороться (возможно дело в подключении какого-то модуля DELPHI)?
4) При считывании ячеек с математическими формулами и выражениями на месте этих самых формул, набранных в MathType, выдаются уже знакомые прямоугольнички "?". Ворд же понимает все эти выражения и отображает их корректно. Можно ли как-нибудь заствить DELPHI тоже их понимать ?
Заранее огромное спасибо за помощь !


 
GanibalLector ©   (2005-03-08 16:43) [3]

> Вcё получается довольно просто при использовании этой процедуры
Ну и кто тебе сказал,что это процедура?

1)
> т.е. не срабатывает процедура закрытия  WordApp:=UnAssigned
Это не процедура закрытия.Это просто освобождение.Для закрытия необходимо использовать метод Close,который имеет три параметра.
НЕ ОБЯЗАТЕЛЬНЫЕ,В СЛУЧАЕ ПОЗДНЕГО СВЯЗЫВАНИЯ!
Первый
 wdDoNotSaveChanges = $00000000;
 wdSaveChanges = $FFFFFFFF;
 wdPromptToSaveChanges = $FFFFFFFE;
Второй
wdWordDocument = $00000000;//сохранить в Word
 wdOriginalDocumentFormat = $00000001;//сохранить в исходном
 wdPromptUser = $00000002;//вывести диалоговое окно
Третий не пригодиться.Итого

WordApp.ActiveDocument.Close;
WordApp.Quit;// зыгрузить нах


2)  
>что означают параметры RANGE и TEXT в твоей процедуре ?
Свойство текст обьекта RANGE.Какие еще?Много...Детали в обьектной модели Word-a или в Word97.pas
3) Мог бы и сам погадаться :
 
S:= WordApp.ActiveDocument.Tables.Item(1).Cell(2,2).Range.Text;
  SetLength(S,Length(S)-2);
  Messagedlg(S ,mtinformation,[MbOk],0);

4)не знаю.


 
AL CAPONE   (2005-03-10 16:57) [4]

Привет !
Насчёт S:= WordApp.ActiveDocument.Tables.Item(1).Cell(2,2).Range.Text; SetLength(S,Length(S)-2) всё работает. Вот тока непонятно, почему всё-таки происходит считывание 2-х лишних символов.
Но вот при использовании WordApp.ActiveDocument.Close($00000000,EmptyParam,EmptyParam)или WordApp.Quit выдаётся Invalid Variant Operation, а ВОРД остаётся в списке задач незакрытым. Даже не знаю, что и думать-то дальше.


 
GanibalLector ©   (2005-03-10 19:56) [5]


function GetCells(Doc:Variant;Table,CellX,Celly:integer):string;
begin
 Result:=Doc.Tables.Item(Table).Cell(CellX,CellY).Range.Text;
 SetLength(Result,Length(Result)-2);
end;

procedure SetCells(Doc:Variant;Table,CellX,CellY:Integer;Value:string) ;
begin
 Doc.Tables.Item(Table).Cell(CellX,CellY).Range.Text:=Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var WordApp,Doc1:Variant;
   i:integer;
begin
WordApp := CreateOleObject("Word.Application");
try
  WordApp.Documents.Open("C:\2.doc");
  WordApp.Visible:=FALSE;
  Doc1 := WordApp.ActiveDocument;

  for i:=1 to 20 do
   Memo1.Lines.Add(GetCells(Doc1,1,i,2));

  for i:=1 to 20 do
   SetCells(Doc1,1,i,3,"Fuck");

  Doc1.Close;
  WordApp.Quit;

finally
  Doc1:=UnAssigned;
  WordApp:=UnAssigned;
end;

end;


 
GanibalLector ©   (2005-03-11 02:58) [6]

Выйти без изменений :

Doc1.Close(0);
WordApp.Quit;


 
AL CAPONE   (2005-03-14 15:45) [7]

Спасибо огромное за помощь! Со всем этим разобрался и привёл в рабочий вид. Осталось ещё одно : необходимо считать ячейку ВОРДА с математическими выражениями и формулами и закинуть её на форму. Ты не подскажешь, на какой компонент её можно закинуть для корректного отображения. Вроде народ говорил об OleContainer-е, но он отображает тока весь документ, а мне нужна одна заданная ячейка. Спасибо !


 
AL CAPONE   (2005-03-19 17:47) [8]

Помогите сделать корректное отображение математических формул из заданной ячейки в таблице ВОРДА на компонент формы. Вроде
народ говорил, что это возможно в OleContainer, но он отображает тока весь документ сразу, а нужна 1 ячейка


 
YurikGL ©   (2005-03-19 18:01) [9]


> Помогите сделать корректное отображение математических формул
> из заданной ячейки в таблице ВОРДА на компонент формы. Вроде
>
> народ говорил, что это возможно в OleContainer, но он отображает
> тока весь документ сразу, а нужна 1 ячейка

Попробуй цепляться не к документу Ворд а к Microsoft Equation...


 
GanibalLector ©   (2005-03-19 22:04) [10]

2 YurikGL ©   (19.03.05 18:01) [9]
Это сложно.Только великий гуру GuAV делал такое ;)


 
AL CAPONE   (2005-03-21 19:35) [11]

Народ, а если серьёзно, то может мне кто-нибудь помочь с этим или нет ??? Обращение к  Microsoft Equation - это что, поясните, кто знает, с чем это блюдо едят ;))


 
GanibalLector ©   (2005-03-21 19:52) [12]

Это читал?
http://delphimaster.net/view/10-1110228903/


 
GuAV ©   (2005-03-22 00:28) [13]

2 GanibalLector ©   (19.03.05 22:04) [10]

Я не говорил что я такое делал - я говорил только что кое что с этим SDK получилось.

Про взять объект из ячейки - через  буфер обмена (.InlineShapes.Item(0).Range.Copy).

В MathType SDK есть ф-ция ExportEquations (сохраняет формулы в файлы), так вот она тоже работает через буфер обмена... и mathtype SDK поможет только если есть mathtype.

Кроме буфера обмена способов наверное нет, кроме разве что самому читать из Word документа.


 
AL CAPONE   (2005-03-24 17:56) [14]

1) Что именно у тебя получилось с SDK и для чего нужна ваще эта прога ?
2) через  буфер обмена (.InlineShapes.Item(0).Range.Copy) - это процедура какого элемента Дельфы, опиши пожалуйста поподробнее, а то я в этом полный лох.
Заранее спасибо !


 
GuAV ©   (2005-03-25 02:36) [15]

Этот код вставляет первый графич объект (в т.ч. формулу) в ячейке 1,1 в OleContainer.
Формула копируется в буфер обмена, оттуда вставляется в OleContainer.

var WD, DOC: Variant;
begin
 WD := CreateOleObject("Word.Application");
 try
   Doc := WD.Documents.Open("C:\1.DOC");
   Doc.Tables.Item(1).Cell(1,1)
     .Range.InlineShapes.Item(0).Range.Copy;
   OleContainer1.Paste;
 finally
   WD.Quit;
 end;
end;


 
GuAV ©   (2005-03-25 02:37) [16]

MathType SDK - описание функций mathtype и формата mathtype и equation editor.
Функции позволяют форматировать, преобразовывать и экспортировать формулы из макросов Word"а и из внешних приложений. функции доступны только для mathype (не для equation).

Например, такой код заменяет @1 на X, а @2 на Zed в формуле в буфере обмена. В этом случае кроме буфера обмена исходная формула и результат могли бы быть также в переменной или в файле.

var MTResult: Integer;
begin
 MTResult := MTInitAPI(mtinitLAUNCH_NOW, -1);
 MTCheck(MTResult);
 try
   MTResult := MTEquationOnClipboard;
   MTCheck(MTResult);

   MTResult := MTXFormReset;
   MTCheck(MTResult);

   MTResult := MTXFormSetPrefs(mtxfmPREF_EXISTING, nil);
   MTCheck(MTResult);

   MTResult := MTXFormAddVarSub(mtxfmSUBST_ALL, mtxfmVAR_SUB_PLAIN_TEXT,
     "@1", Length("@1"), mtxfmVAR_SUB_PLAIN_TEXT,
     "X", Length("X"), mtxfmSTYLE_VARIABLE);
   MTCheck(MTResult);

   MTResult := MTXFormAddVarSub(mtxfmSUBST_ALL, mtxfmVAR_SUB_PLAIN_TEXT,
     "@2", Length("@2"), mtxfmVAR_SUB_PLAIN_TEXT,
     "Zed", Length("Zed"), mtxfmSTYLE_VARIABLE);
   MTCheck(MTResult);

   MTResult := MTXFormEqn(mtxfmCLIPBOARD, mtxfmTEXT, "",
     0, mtxfmCLIPBOARD, mtxfmTEXT, "", 0, "", nil);

   MTCheck(MTResult);

   OleContainer1.Paste;
 finally
   MTTermAPI;
 end;
end;


Описание формата в SDK - и для mathtype и для equation. пока не пытался исползовать.

http://dessci.com/en/reference/sdk/


 
AloneAli   (2005-03-25 09:00) [17]

А не лучше ли использовать поля Word"а???
ИМХО, это намного проще, чем связываться с Equation или с MathType.
К тому же (точно незнаю), но мне кажется поля более корректно отображаются, чем формулы.


 
AloneAli   (2005-03-25 09:04) [18]


> GuAV ©   (25.03.05 02:37) [16]

А ты не мог бы скинуть dll на мыло?


 
GuAV ©   (2005-03-25 16:47) [19]

dll это часть mathtype. нужно ставить mathtype.

описание функций есть по ссылке внизу [16] (там длинная анкета но на самом деле достаточно указать что-то похожее на мыло :-) )

Дельфовские прототипы ф-циям из dll могу выложить или скинуть.


 
AL CAPONE   (2005-03-26 17:11) [20]

Привет, GuAV !!!
Твоя процедура
var WD, DOC: Variant;
begin
WD := CreateOleObject("Word.Application");
try
  Doc := WD.Documents.Open("C:\1.DOC");
  Doc.Tables.Item(1).Cell(1,1)
    .Range.InlineShapes.Item(0).Range.Copy;
  OleContainer1.Paste;
finally
  WD.Quit;
end;
end;
работает на все 100, вот только проблема в том, что у меня в ячейке хранятся не только формулы и выражения, они ещё и перемешаны с текстом (в ячейке хранится вопрос и 5 вариантов ответа к нему, вся прога - тестирующая система). Вот такую вот ячейку-бутерброд мне и нужно полностью и корректно отобразить хоть на каком-нибудь элементе формы. HELP !!!
Кстати пробовал сам сделать считывание всей ячейки через
WordApp.ActiveDocument.Tables.Item(1).Cell(1,2).Range.Select;
WordApp.Selection.Copy;
OleContainer1.Paste;
но на 2-й строке выдаётся "Ошибка команды" и прога останавливается.
Подумал, что оптимально будет сделать так :
1) выделить всю ячейку со всем содержимым и скопировать её в буфер;
2) открыть новый документ ВОРДА;
3) вставить всю инфу туда и сохранить документ на диске;
4) испрользовать OleContainer.LoadFromFile для отображения всего документа;
5) динамически удалить документ с диска.
Вот только как это всё организовать и довести до ума, понятия не имею. Может подскажешь. Заранее спасибо и пока !!!


 
GuAV ©   (2005-03-27 00:11) [21]


>2) открыть новый документ ВОРДА;
> 3) вставить всю инфу туда и сохранить документ на
>диске;
> 4) испрользовать OleContainer.LoadFromFile для
> отображения всего документа;
> 5) динамически удалить документ с диска.


Зачем так усложнять ?   OleContainer.CreateObject("Word.Application"), False); создаст документ в OleContainer. А ещё проще сразу вставить туда что надо.


>WordApp.ActiveDocument.Tables.Item(1).Cell(1,2).Range.Select;
>WordApp.Selection.Copy;
>OleContainer1.Paste;

Странно, а у меня работает.
Кстати, не проще ли сразу Cell(1,2).Range.Copy; ?

Вообще, см. справку по офису. для ХР - VBAWD10.CHM .


 
VoaCo   (2005-03-27 16:46) [22]

Здравствуйте!
Помогите пожалуйста.

У меня вопрос как можно экспортировать таблицу ворд в базу (dbf)
потом читать из базы?


 
AL CAPONE   (2005-03-27 18:00) [23]

Привет, GuAV !!!
Перепробовал всё и знаешь, в чём оказалось дело: просто при создании этого документа ВОРДА он разок подвис и не сохранился как надо и теперь из него не копируются 2 ячейки из 400 с лишним штук. На остальных же ячейках программа прекрасно работает при помощи
WordApp.ActiveDocument.Tables.Item(1).Cell(i,j).Range.Copy;
OleContainer1.Paste;
Вот только 2 вопроса напросились:
1) при отображении в OleContainer у ячейки обрезается 0.5-1 см. её левого края, хотя в ВОРДЕ отрезки нет, а копируется всё полностью. Размер OleContainer-a тоже больше размера самой ячейки. Так что непонятно, почему это происходит. Может есть какие-нибудь идеи ?
2) случаем не ведаешь, как при работе программы очистить OleContainer для помещения в него другой ячейки ?
Спасибо огромное за помощь !


 
YurikGL ©   (2005-03-28 06:58) [24]

VoaCo   (27.03.05 16:46) [22]

см. http://www.delphimaster.ru/articles/dbtoword/index.html

тока делать все наоборот.


 
AloneAli   (2005-03-28 11:21) [25]


> GuAV ©   (25.03.05 16:47) [19]
> Дельфовские прототипы ф-циям из dll могу выложить или скинуть.

Скинь на мыло, пожалуйста!



Страницы: 1 вся ветка

Форум: "Corba";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.038 c
6-1128492766
Mx
2005-10-05 10:12
2006.01.22
Подключение по одному порту, ответ по другому, на основе Indy


2-1136558855
dabreezy
2006-01-06 17:47
2006.01.22
Команда при запуске программы


14-1135771386
VirEx
2005-12-28 15:03
2006.01.22
С новым годом


8-1122221174
rolex
2005-07-24 20:06
2006.01.22
Как подать на колонки звук определенной частоты???


1-1134654245
BFG9k
2005-12-15 16:44
2006.01.22
Дельфи находит файлы, которые находить не должен





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский