[VB6] Mijn Word wordt gebruikt door anderen.

Pagina: 1
Acties:

  • Daos
  • Registratie: Oktober 2004
  • Niet online
In VB6 moet ik wat Word-bestanden maken uit een template. Bij het starten maak ik een nieuwe Word.Application en stop deze in de globale variabele wrd door middel van Set wrd = New Word.Application. Bij het sluiten doe ik wrd.Quit.

Als mijn programma draait en je start Word, dan wordt de Word van mijn programma gebruikt. Dit geeft problemen in twee situaties. 1: Als de gebruiker Word sluit, dan werkt Word ook niet meer in mijn programma. 2: Als ik mijn programma afsluit dan sluit alles van Word.
Kan ik ervoor zorgen dat de Word die ik aanmaak niet kan worden gebruikt door anderen? Of moet ik elke keer de fout afvangen en Word opnieuw opstarten (1) en bij het afsluiten kijken of alle documenten wel gesloten zijn (2)?


Ik moet verder wat data invullen in die documenten. Deze data moet ook later weer uitgelezen worden. Hoe kan ik dit het beste doen?

Wat ik nu heb (Er zit bijvoorbeeld in het document een bookmark met de naam test):
Visual Basic:
1
2
3
4
5
6
7
8
    Dim bm As String
    bm = "test"
    
    Dim r As Range
    Set r = wrd.Bookmarks(bm).Range
    
    r.Text = "testje"
    wrd.Bookmarks.Add bm, r


Ik gebruik nu bookmarks om de locaties te bepalen waar de data moet komen te staan. Het lukt mij niet om de bookmark in een keer over de ingevulde tekst te krijgen. Bij .insertBefore en After blijft de bookmark gewoon bij het begin staan en bij .Text verdwijnt de bookmark helemaal. Ik heb het nu werkend door de bookmark gewoon na het invoegen weer toe te voegen. Kan het ook in 1 keer? Of is er een betere methode om data in en uit een document te verplaatsen?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
(1):
Visual Basic 6:
1
2
Set oWord = New Word.Application
oWord.Visible = False

Daarmee wordt Word niet meer getoond en kan niemand 'm dus "per ongeluk" sluiten/overnemen (taskmanager daargelaten >:) )

[ Voor 79% gewijzigd door RobIII op 02-02-2006 23:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
RobIII schreef op donderdag 02 februari 2006 @ 23:58:
(1):
Visual Basic 6:
1
2
Set oWord = New Word.Application
oWord.Visible = False

Daarmee wordt Word niet meer getoond en kan niemand 'm dus "per ongeluk" sluiten/overnemen (taskmanager daargelaten >:) )
Met als leuke bijeigenschap dat als deze instantie van word een fout geeft dat je geen nieuwe instantie van word meer ziet openen want er staat er al 1 open ( verborgen maar ja ), waardoor een gebruiker heel erg rare meldingen kan krijgen ( onhandige gebruiker probeert alles even 20x op te starten en af te sluiten, door foutmelding sluit word niet maar start wel 20x ).

Mijn ervaring is dat het erg onhandig is om verborgen office venstertjes te hebben kunnen te veel rare dingen mee gebeuren...

  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
RobIII schreef op donderdag 02 februari 2006 @ 23:58:
(1):
Visual Basic 6:
1
2
Set oWord = New Word.Application
oWord.Visible = False

Daarmee wordt Word niet meer getoond en kan niemand 'm dus "per ongeluk" sluiten/overnemen (taskmanager daargelaten >:) )
Volgens mij maak je met "New Word.Application" altijd een verborgen venster aan. Je kunt het zichtbare venster alleen ophalen met GetObject.
Gomez12 schreef op vrijdag 03 februari 2006 @ 08:38:
[...]

Met als leuke bijeigenschap dat als deze instantie van word een fout geeft dat je geen nieuwe instantie van word meer ziet openen want er staat er al 1 open...
Als je je errorhandling op orde hebt, zorg je er natuurlijk voor dat bij het optreden van een error het word-object visible wordt gemaakt.

[ Voor 21% gewijzigd door BertS op 03-02-2006 09:01 ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
bee-es schreef op vrijdag 03 februari 2006 @ 09:00:
[...]

Volgens mij maak je met "New Word.Application" altijd een verborgen venster aan.
Dat klopt. Het maakt dan ook niet uit of ik .Visible gebruik.


Misschien was ik niet helemaal duidelijk met de omschrijving van mijn probleem. Ik wil dat de Word die door mijn programma gestart wordt alleen door mijn programma gebruikt mag worden.

Wat er nu gebeurt is:
Er draait nu 0x Winword.exe.
- Start mijn programma.
Er draait nu 1x Winword.exe.
- Start Word via het Startmenu of door een document te openen in Explorer.
Er draait nu 1x Winword.exe.
- Sluit Word.
Er draait nu 0x Winword.exe.
- Doe iets met een document in mijn programma -> crash want Word is weg.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Niet getest, maar iets als dit zou in principe word moeten verhinderen af te sluiten.
code:
1
2
3
4
5
6
7
8
9
dim myWord as word.application
dim myDoc as word.document
Dim bMagVanMij as boolean
Private Sub myWord_DocumentBeforeClose(ByVal Doc As Document, ByVal Cancel As Boole-waarde)
      If not(bmagvanmij) and doc=mydoc then
              msgbox "He, ik ben nog bezig"
              cancel=true
      end if
End sub

Waarbij je dus, als je klaar bent bMagvanMij op true zet voordat je e.e.a. afsluit. Door de documents collectie na te lopen ga je na of een gebruiker ook met word aan het stoeien is en weet je of of je heel Word mag afsluiten.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:27

mulder

ik spuug op het trottoir

Doe eerst GetObject en als die niks terug geeft doe je CreateObject.

oogjes open, snaveltjes dicht


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Niesje schreef op vrijdag 03 februari 2006 @ 10:10:
Niet getest, maar iets als dit zou in principe word moeten verhinderen af te sluiten.
code:
1
2
3
4
5
6
7
8
9
dim myWord as word.application
dim myDoc as word.document
Dim bMagVanMij as boolean
Private Sub myWord_DocumentBeforeClose(ByVal Doc As Document, ByVal Cancel As Boole-waarde)
      If not(bmagvanmij) and doc=mydoc then
              msgbox "He, ik ben nog bezig"
              cancel=true
      end if
End sub

Waarbij je dus, als je klaar bent bMagvanMij op true zet voordat je e.e.a. afsluit. Door de documents collectie na te lopen ga je na of een gebruiker ook met word aan het stoeien is en weet je of of je heel Word mag afsluiten.
Ik heb geen documenten open staan. Alleen Word staat open. Ik laat Word open staan omdat het anders veel tijd kost om voor elk documentje dat ik wil bewerken Word moet starten en afsluiten.

Jouw code bracht me wel op een idee. Ik vang gewoon het Quit-event af en herstart Word.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim WithEvents wrd As Word.Application
Dim bMagVanMij As Boolean

Private Sub Class_Initialize()
    bMagVanMij = False
    Set wrd = New Word.Application
End Sub

Private Sub Class_Terminate()
    bMagVanMij = True
    
    If wrd.Documents.Count = 0 Then
        wrd.Quit
    End If
End Sub

Private Sub wrd_Quit()
    If Not bMagVanMij Then
        Set wrd = New Word.Application
    End If
End Sub

Dit werkt wel goed, maar er zijn nog een paar vreemde dingen:
- Het Quit-event wordt niet aangeroepen als ik de wrd.Quit doe in Class_Terminate. Is hier een reden voor? Als dit altijd zo is, dan kan ik bMagVanMij weghalen.

- De code werkt maar 1 keer. Als ik Word een tweede keer open via het startmenu, dan komt er een 2e winword.exe tussen de processen te staan.

Wat er nu gebeurt is:
Er draait nu 0x Winword.exe.
- Start mijn programma.
Er draait nu 1x Winword.exe.
- Start Word via het Startmenu of door een document te openen in Explorer.
Er draait nu 1x Winword.exe.
- Sluit Word. (Mijn programma vangt event en herstart Word)
Er draait nu 1x Winword.exe.
- Start Word via het Startmenu of door een document te openen in Explorer.
Er draait nu 2x Winword.exe.
- Sluit Word. (Mijn programma vangt geen events)
Er draait nu 1x Winword.exe.
- Sluit mijn programma.
Er draait nu 0x Winword.exe.

Waarom gaat het de tweede keer wel op de manier die ik altijd zou willen hebben? Kan het niet altijd zo gaan?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-04 09:44
Omdat je code niet klopt:

- Je start Word altijd in class init, maar sluit em niet altijd in terminate
- Als iemand Word dichtgooit maak je een nieuwe aan ipv het dichtgooien te blokkeren

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:27

mulder

ik spuug op het trottoir

Omdat je geen referentie meer hebt naar Word. Die kun je krijgen met GetObject.

oogjes open, snaveltjes dicht


  • Daos
  • Registratie: Oktober 2004
  • Niet online
farlane schreef op vrijdag 03 februari 2006 @ 11:08:
Omdat je code niet klopt:

- Je start Word altijd in class init, maar sluit em niet altijd in terminate
Die class wordt bij het starten van mijn programma aangemaakt en bij het sluiten weer weggegooid. Die if in de Terminate is om ervoor te zorgen dat Word niet wordt afgesloten als iemand anders nog documenten open heeft staan. Als ik die if weghaal, dan kom ik nog steeds niet ik het Quit-event.
- Als iemand Word dichtgooit maak je een nieuwe aan ipv het dichtgooien te blokkeren
Dat klopt. Ik kan alleen niet vinden hoe ik het dichtgooien moet blokkeren.
Het vreemde is dat de nieuwe Word niet gebruikt wordt als je vervolgens Word nog een keer start via het startmenu. Kan ik ervoor zorgen dat dit altijd zo gebeurt?
Don Facundo schreef op vrijdag 03 februari 2006 @ 11:08:
Omdat je geen referentie meer hebt naar Word. Die kun je krijgen met GetObject.
Met GetObject krijg je de Word die al draait. Ik wil gewoon in mijn programma een nieuwe Word die alleen voor mij is. Als ik "Set wrd = New Word.Application" doe, dan komt in wrd de referentie te staan.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:27

mulder

ik spuug op het trottoir

Het vreemde is dat de nieuwe Word niet gebruikt wordt als je vervolgens Word nog een keer start via het startmenu. Kan ik ervoor zorgen dat dit altijd zo gebeurt?
Je zegt nu toch dat je wilt dat als iemand zelf word opstart je dit ook wilt afvangen?

oogjes open, snaveltjes dicht


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Don Facundo schreef op vrijdag 03 februari 2006 @ 11:42:
[...]

Je zegt nu toch dat je wilt dat als iemand zelf word opstart je dit ook wilt afvangen?
Nee, ik wil niets te maken hebben met de Word die iemand zelf opgestart heeft voordat mijn programma start.

Ik wil gewoon bij het starten van mijn programma een nieuwe Word starten en ervoor zorgen dat alleen mijn programma deze gebruikt. Het probleem is dat mijn Word gekaapt wordt als iemand op het Word-icoontje klikt in het startmenu. Dit kapen gebeurt alleen de eerste keer. De tweede keer gaat alles goed en wordt er een nieuwe Word gestart.

[ Voor 10% gewijzigd door Daos op 03-02-2006 11:53 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

set wrd= createobject("word.application") maakt afaik altijd een nieuwe instantie aan.

Mogelijk hangt het gedrag nog samen met de optie of je word in mdi-modus of sdi modus start. Welke wordversie heb je?
mdi-sdi
turning of SDI in word 2000

[ Voor 17% gewijzigd door Lustucru op 03-02-2006 12:30 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Niesje schreef op vrijdag 03 februari 2006 @ 12:28:
set wrd= createobject("word.application") maakt afaik altijd een nieuwe instantie aan.
Dat klopt. Maar kan ik die ook blokkeren/reserveren zodat hij alleen door mijn programma gebruikt kan worden?
Wat er nu gebeurt is dat als mijn programma draait en je start Word via het startmenu, dan wordt mijn instantie gebruikt. Dat wil ik niet.
Mogelijk hangt het gedrag nog samen met de optie of je word in mdi-modus of sdi modus start. Welke wordversie heb je?
mdi-sdi
turning of SDI in word 2000
Word2000. SDI vind ik wel makkelijk en heeft volgens mij niets met het probleem te maken. Met SDI krijg je gewoon meerdere venstertjes terwijl er maar 1 winword.exe draait. Dat is hetzelfde als bij bv Internet Explorer (Maar als je IE nog een keer start via het startmenu, dan komt er wel een tweede process.).

[edit]
Ik kan het ook oplossen door alle snelkoppelingen naar Word te wijzigen zodat winword /w opstart, maar dat is wel erg veel werk.

[ Voor 9% gewijzigd door Daos op 03-02-2006 14:06 ]

Pagina: 1