![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OLE+WORD [D7, WinXP]
AL CAPONE © (2005-03-06 20:19:00)Народ, помогите плиз кто чем сможет. Ситуация такова: имеется 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-10 19:56:00) [21]
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;
AL CAPONE (2005-03-10 16:57:00) [22]Привет !
Насчёт 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-08 16:43:00) [23]> В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-08 12:07:00) [24]Спасибо за дельный совет. Вcё получается довольно просто при использовании этой процедуры.
Вот только есть несколько вопросов:
1) при повторном запуске этой процедуры программа выдаёт ошибку, что документ WORD уже занят, и пытается открыть его только для чтения, т.е. не срабатывает процедура закрытия
WordApp:=UnAssigned; может быть WORD можно корректно закрыть каким-либо другим способом ?
2) что означают параметры RANGE и TEXT в твоей процедуре ? Какие ещё параметры можно использовать в данном случае ?
3) при считывании ячейки WORD-а (в которой записаны только числа) с помощью этой процедуры программа возвращает не только число, реально записанное в ячейке, но после него и какие-то символы "?"-прямоугольник, а их дальнейшее использование в таком виде неприемлимо. Что это может быть и как с этим бороться (возможно дело в подключении какого-то модуля DELPHI)?
4) При считывании ячеек с математическими формулами и выражениями на месте этих самых формул, набранных в MathType, выдаются уже знакомые прямоугольнички "?". Ворд же понимает все эти выражения и отображает их корректно. Можно ли как-нибудь заствить DELPHI тоже их понимать ?
Заранее огромное спасибо за помощь !
GanibalLector (2005-03-07 01:52:00) [25]Информации по этому поводу предостаточно.Главное желание!Кстати,ЮрийЖЛ статейку написал неплохую(даже обечал подредактировать чуток).Общий принцип таков :
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;