Текущий архив: 2005.07.31;
Скачать: CL | DM;
Вниз"как бы" утечка ... Найти похожие ветки
← →
GanibalLector © (2004-10-20 19:27) [0]Создаю программно документы(Word).Так вот,хотел поинтересоваться,насколько это правильно ???
GuaV говорит,что это "как бы" утечка.
WordApp := CreateOleObject("Word.Application");
WordApp.Documents.add;
Doc1 := WordApp.ActiveDocument;
... // собственно создаю
Wordapp.visible:=true;
т.е. я не сохраняю,а сразу вывожу(и путь пользователь сам решает что с ним делать)
Вот это :
WordApp.Quit;
WordApp := Unassigned;
я не делаю.
З.Ы. Может все же сохранять в файл и закрывать Word,а потом CreateProcess с созданным файлом ???
З.З.Ы.В принципе,у меня пока проблем нет(XP),а вот пользователи(Win98) говорят,что при закрытии Word-a ИНОГДА сообщение вылетает
(естественно,они не запомнили что за сообщение)
← →
GuAV © (2004-10-21 00:03) [1]я говорил, как бы утечка если вот это
> Wordapp.visible:=true;
не выполнится (в следствие исключения) - юзер не увидит ворда. поэтому этой строке место в finally или сделать quit в except.
← →
GuAV © (2004-10-21 00:12) [2]
> (естественно,они не запомнили что за сообщение)
Сохранить изменения в файле Документ1 ? ;-)
← →
YurikGL © (2004-10-21 14:48) [3]
> Вот это :
>
> WordApp.Quit;
> WordApp := Unassigned;
> я не делаю.
Вот это WordApp.Quit; не делай а WordApp := Unassigned; делай и все будет ok
← →
GuAV © (2004-10-21 15:31) [4]YurikGL © (21.10.04 14:48) [3]
а WordApp := Unassigned; делай
Это фактически вызовет _VarClear (из модуля Variants). Так вот, я думал что это должно быть автоматически и очистка вручную - излишне. Так и есть.procedure TForm1.Button1Click(Sender: TObject);
var W: OleVariant;
begin
W:=CreateOleObject("Word.Application");
W.Visible:=True; // breakpoint here
end;
При breakpoint в указанном месте нажать Ctrl+Alt+C.
Давить F8 до call _VarClear.
Нажать F7 и убедиться что вызывается та же подпрограмма что и при WordApp := Unassigned;
Так же можно наблюдать что этот call _VarClear находится в секции finally, хотя она явно не написана.
--------
код в [0] лучше переписать такWordApp := CreateOleObject("Word.Application");
try
WordApp.Documents.add;
Doc1 := WordApp.ActiveDocument;
... // собственно создаю
Wordapp.visible:=true;
except
Wordapp.Quit;
end;
Если нужно показывать Word даже в случае ошибки, то можно сделать такWordApp := CreateOleObject("Word.Application");
try
WordApp.Documents.add;
Doc1 := WordApp.ActiveDocument;
... // собственно создаю
finally
Wordapp.visible:=true;
end;
"как бы" утечка имелось ввиду в случае ошибки в "собственно создаю". тогда ворд не будет не завершен не показан.
← →
YurikGL © (2004-10-21 19:34) [5]
> GuAV © (21.10.04 15:31) [4]
Вот честное слово... проблемы не вижу... Всегда делал примерно так:
WordApp := CreateOleObject("Word.Application");
try
WordApp.Documents.add;
Doc1 := WordApp.ActiveDocument; - так никогда не делал. Всегда работал через WordApp.....
... // собственно создаю
Wordapp.visible:=true;
WordApp := Unassigned;
ShowMessage("Документ создан")
except
Wordapp.visible:=true;
WordApp := Unassigned;
ShowMessage("При создании документа произошла ошибка")
end;
← →
GuAV © (2004-10-21 20:07) [6]YurikGL © (21.10.04 19:34) [5]
Всегда работал через WordApp.....
Мне код с Doc1 был бы понятнее и он был бы немного быстрее (хоть я работал только с XL).
YurikGL © (21.10.04 19:34) [5]
Вот честное слово... проблемы не вижу...
В Вашем коде и я не вижу проблемы. Только WordApp := Unassigned; просто лишнее. Это как перед FreeAndNil вставлять ещё один FreeAndNil.
В коде GanibalLector © (код был в http://delphimaster.net/view/10-1097854855/) была проблема - не было try (точнее был try но не там где надо).
Страницы: 1 вся ветка
Текущий архив: 2005.07.31;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.038 c