< návrat zpět

MS Excel


Téma: VS Addins: otvorit zatvorit Powerpoint rss

Zaslal/a 20.4.2016 16:02

Ahojte,
Prekopavam sa tym visual studio a zas som narazil na zadrhel.

problem je ze ked si vytvorim instanciu v tej instancii otvorim powerpoint subor a nakoniez avrem powerpoint subor a aj instanciu. Tak sa vypnu vsetky powerpoin subory.

netusite preco?

Zdroj mojho kodu:

Dim oApp As _Application = New PowerPoint.Application
Dim oPres As PowerPoint.Presentation
oApp.Visible = True
oPres = oApp.Presentations.Open("C:\test.pptx")
oPres.Save()
oPres.Close()
oPres = Nothing
oApp.Quit()
oApp = Nothing

Zaslat odpověď >

#031177
avatar
Prvně se zbavte těch nothing-ů a pak uvidíme co dál.

Jak uvolňovat COM objekty z paměti:
https://blogs.msdn.microsoft.com/geoffda/2007/08/31/the-designer-process-that-would-not-terminate/citovat
#031180
avatar
Na vysvětlenou:

Je skutečně NUTNÉ nastudovat si, jak správně uvolňovat COM objekty z paměti, jinak tady budeme řešit jiné voloviny typu "zůstává mi spuštěný exe soubor, nebo padá mi aplikace :). Na svoz odpadků dotNetu nelze u COM spoléhat. VSTO je pro dotNet prostě unmanaged.

V praxi se mi osvědčil postup, který je uvedený zde:
http://www.xtremevbtalk.com/tutors-corner/160433-automating-office-programs-vb-net-com-interop.html
...čtěte včetně komentářů.

Další možný zdroj:
http://jake.ginnivan.net/vsto-com-interop/

Na důvod Vašeho problému určitě přijdete, jsem si jistý :)citovat
#031183
avatar
Dalda, DAAL: Tak som to skusal ale aj tak to vypne otvorenu prezentaciu ale aj aktualnu prezentaciu.

netusim v com robim chybu. tu je kod:
Private Sub aTest()
Dim aSaveFileDialog As New SaveFileDialog

aSaveFileDialog.Filter = "PowerPoint file|*.pptx"
aSaveFileDialog.Title = "Save an slide"
aSaveFileDialog.ShowDialog()
If aSaveFileDialog.FileName <> "" Then
Dim oApp As ppt.Application = New ppt.Application
Dim oPres As ppt.Presentation

oApp.Visible = Microsoft.Office.Core.MsoTriState.msoFalse
Globals.ThisAddIn.Application.ActivePresentation.SaveCopyAs(aSaveFileDialog.FileName)

oPres = oApp.Presentations.Open(aSaveFileDialog.FileName)

For x = oPres.Slides.Count To 1 Step -1
If oPres.Slides(x).Name <> Globals.ThisAddIn.Application.ActiveWindow.Selection.SlideRange.Name Then oPres.Slides(x).Delete()
Next

GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()

oPres.Save()
oPres.Close()
Marshal.FinalReleaseComObject(oPres)
oApp.Quit()
Marshal.FinalReleaseComObject(oApp)
End If
End Subcitovat
#031184
Jeza.m
Co jsem tak chvíli googlil, tak to vypadá že powerpoint není multiinstatní.
Tak bych asi zkusil na začátku kódu ověřit, je-li powerpoint spuštěný a někam si to poznamenat.
Při ukončení procedury pak podle toho buď jen zavřít aktuální prezentaci, ale aplikaci nechat být (vynechat oApp.Quit), nebo provést obojí.

Je to jen teorie :-)
M@citovat
#031185
avatar
Jeza.m: Mna ani nenapadlo ze prikaz Quit je urceny pre uplne vsetky instancie .... a mate pravdu ako som ho vyhodil z prikazov tak to funguje tak ako som chcel

tu je kod:
Dim aSaveFileDialog As New SaveFileDialog

aSaveFileDialog.Filter = "PowerPoint file|*.pptx"
aSaveFileDialog.Title = "Save an slide"
aSaveFileDialog.ShowDialog()
If aSaveFileDialog.FileName <> "" Then
Dim oPP As PowerPoint.Application = New PowerPoint.Application
Dim oPres As Presentation

Globals.ThisAddIn.Application.ActivePresentation.SaveCopyAs(aSaveFileDialog.FileName)

oPP.Visible = True
oPres = oPP.Presentations.Open(aSaveFileDialog.FileName)

For x = oPres.Slides.Count To 1 Step -1
If oPres.Slides(x).Name <> Globals.ThisAddIn.Application.ActiveWindow.Selection.SlideRange.Name Then oPres.Slides(x).Delete()
Next

oPres.Close()
oPP = Nothing
End If

dakujem za rady :)citovat
#031186
avatar
ale mal by som este jednu otazku :)

preco ked nastavim:
oPP.Visible = False

tak process skonci pritom a nepokracuje dalej?citovat
#031187
Jeza.m
Těžko říct :-), jsou věci mezi nebem a MS, které jsou občas nepochopitelné. Třeba s ním neumí pracovat když je skrytý a je to pro něj jako chyba, ale chyba kterou nehlásí, místo toho rovnou skončí.
Tohle vysvětlit neumím.
M@citovat
#031189
avatar
ja uz som z toho blb :) a to chci len suplik v ktorom by som savol aktualny slide.

nic viac .... v VBA robota na 5scitovat
#031190
avatar
Ano, je to tak a nikdo netvrdil, že uvolňování COM objektů je řešení pro Váš problém. Spíše je to nutnost, bez které se neobejdete a která může způsobovat podobné problémy. To jsou věci na které Vás mohu upozornit, ale nechci být v pozici, kdy za někoho budu podobné věci googlit a tvářit se, že ...Také nechci odpovídat na dotazy, kterých se lze snadno dopátrat nebo dovtípit. Jaký by to mělo smysl do budoucna? - (Řečnická otázka).

Ještě si dovolím jednu poznámku, snad se na za to na mne nebudete zlobit. Někteří "programátoři", kteří přechází např. z VBA na VSTO apod. nevidí výrazné benefity. Naopak si stěžují, že je to zdlouhavá a náročnější práce - "ve VBA 5min." apod. Podle mého názoru je to jen proto, že ty benefity neumí využít/nezná je. Neumí využít výhody OOP, frameworku, patternů, unifikovaných postupů atd. Prostě to programuje stejně jako s VBA a jen naráží na problémy, které ve VBA umí řešit a v novém jazyku/prostředí ne.

Držím palce Palooo ať se projekt podaří.citovat
#031191
avatar
Dalda: Moj hnev plinie len z toho ze tomu nerozumiem a vobec nechcem tvrdit ze VBA je lepsie ako VSTO. Inac by som neprerabal cely VBA program do VSTO. A samozrejme to len nepreklapam ale snazim sa aj vyuzivat vyhody ktore ponuka VSTO. Ako je napr. DataSet, RibbonMenu, aktualizovanie, Panel (WPF formular), OOP som uz vyuzival v VBA ..... atd.

len teraz som sa zasekol pri tejto banalite. Na ktoru mam riesenie ale niesom s nim dostatocne spokojny.

All: Nechce sa mi verit ze by som nedokazal ulozit slide bez toho aby sa zobrazilo nove okno powerpointu.

napr. chcel by som aby to fungovalo ako tento prikaz:
Globals.ThisAddIn.Application.ActivePresentation.Slides(1).Export("C:\test.ppt", "ppt")

toto riesenie je super ale ja potrebujem aby to ulozilo ako PPTX.

ale ked to prepisem takto:
Globals.ThisAddIn.Application.ActivePresentation.Slides(aIndex).Export("C:\test.pptx", "pptx")

tak to samozrejme uz nefunguje

tak isto nikde na nete neviem naist zoznam do coho vsetkeho je mozne to exportovat (nasiel som len zoznam obrzakov)

tak teraz sa snazim to riesit inym sposobom napr.:
- ulozit to cele a potom len vymazat slides ktore nechcem
- vytvorit novu prezentaciu a tam nahrat ten ten slide co potrebujem

tieto riesenia uz funguju (nemam bordel v pamati) ale zas nadruhu stranu tam preblikava okienko ktore nechcem aby sa zobrazovalo

takze mam 3 riesenia s ktorymi niesom spokojny. Moja otazka znie existuje nejake riesenie ktore by ulozilo jeden slide bez toho aby neurobilo to co som uz hore spominal??citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje