Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"как бы" утечка ... [Delphi, Windows]


GanibalLector ©   (2004-10-20 19:27:00) 

Создаю программно документы(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 20:07:00) [1]

YurikGL ©   (21.10.04 19:34) [5]
Всегда работал через WordApp.....


Мне код с Doc1 был бы понятнее и он был бы немного быстрее (хоть я работал только с XL).

YurikGL ©   (21.10.04 19:34) [5]
Вот честное слово... проблемы не вижу...

В Вашем коде и я не вижу проблемы. Только WordApp := Unassigned; просто лишнее. Это как перед FreeAndNil вставлять ещё один FreeAndNil.

В коде GanibalLector © (код был в http://www.delphimaster.ru/cgi-bin/forum.pl?id=1097854855&n=8) была проблема - не было try (точнее был try но не там где надо).


YurikGL   (2004-10-21 19:34:00) [2]


> 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 15:31:00) [3]

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 14:48:00) [4]


> Вот это :
>
> WordApp.Quit;
> WordApp := Unassigned;
> я не делаю.

Вот это WordApp.Quit; не делай а WordApp := Unassigned; делай и все будет ok


GuAV   (2004-10-21 00:12:00) [5]


> (естественно,они не запомнили что за сообщение)

Сохранить изменения в файле Документ1 ? ;-)


GuAV   (2004-10-21 00:03:00) [6]

я говорил, как бы утечка если вот это

> Wordapp.visible:=true;
не выполнится (в следствие исключения) - юзер не увидит ворда. поэтому этой строке место в finally или сделать quit в except.


Наверх

Титульная страница Поиск, карта сайта Написать письмо