Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[VB] object was open for write

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben in autocad een dingetje aan het maken dat er wanneer een revisie balk in de tekening word gevoegd, in de onderhoek bij versie het bijbehorende nr. wordt ingevuld. Dit omdat er weleens een revisie word gemaakt, maar vergeten word om het versie nr. te wijzigen.

Dit heb ik als code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Private Sub AcadDocument_ObjectAdded(ByVal Object As Object)
    Dim Attributen
    Dim element
    Dim attribuut
    Dim Symbool
    Dim CountWijziging
    
        For Each element In ThisDrawing.PaperSpace
            If element.ObjectName = "AcDbBlockReference" Then
                Set Symbool = element
                If Symbool.HasAttributes Then
                    Attributen = Symbool.GetAttributes
                    For i = LBound(Attributen) To UBound(Attributen)
                    Set attribuut = Attributen(i)
                        If attribuut.TagString = "WIJZ01" Then
                            CountWijziging = "01"
                        End If
                    Next i
                End If
            End If
          Next element
        
        
        For Each element In ThisDrawing.PaperSpace
            If element.ObjectName = "AcDbBlockReference" Then
                Set Symbool = element
                If Symbool.HasAttributes Then
                    Attributen = Symbool.GetAttributes
                    For i = LBound(Attributen) To UBound(Attributen)
                    Set attribuut = Attributen(i)
                        If attribuut.TagString = "VERSIE" Then
                            attribuut.TextString = CountWijziging
                        End If
                    Next i
                End If
            End If
        Next element
End Sub


Eerst gaat hij hier kijken of er een revisie balk word ingevoegd, als dat zo is dan pakt hij bij revisie balk (hebben allemaal een oplopende naam) het nr erbij. Tweede gedeelte schrijft hij dat nr. in de onderhoek.
Dit gaat allemaal heel mooi en werkt ook. maar tussendoor krijg ik de error:

code:
1
 Object was open for write


(Rare error vind ik eigenlijks, tuurlijk moet het object toch open zijn om naar te schrijven)
Als ik deze error wegklik, doet hij precies wat ik wil.

Nu heb ik op Google lopen zoeken, en daar kom ik precies 1 zelfde probleem tegen, alleen ik snap niet wat ik nu precies moet doen hiermee.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Set RecordIterator = ODT.GetODRecords
RecordIterator.init acadobj, False, False
If RecordIterator.IsDone Then Exit Sub
Do Until RecordIterator.IsDone
  Set ODR = RecordIterator.Record
  counter = 0
  For Each CurTable In ODT.ODFieldDefs
    Set CurRecord = ODR.Item(counter)
    If LCase(CurTable.name) = "foo" Then msgbox CurRecord.Value
    counter = counter + 1
  Next
  RecordIterator.Next
Loop
Set RecordIterator = Nothing 'release the RecordIterator lock on objects


De iterator object moet naar Nothing gezet worden???

[ Voor 0% gewijzigd door een moderator op 08-09-2008 11:01 . Reden: Code even ingesprongen... ]


Verwijderd

Topicstarter
Weet niemand de oplossing hiervoor?

  • BramFokke
  • Registratie: Augustus 2007
  • Laatst online: 04-10-2024
Ik ben een beetje verbaasd over de volgende regel:
Visual Basic:
1
Set RecordIterator = Nothing 'release the RecordIterator lock on objects


Is RecordIterator hier een property van een object? In dat geval zou het namelijk kunnen dat als deze op Nothing wordt gezet, hij ook automatisch de lock released. Als RecordIterator dus een lokale variabele is, dan heeft het op Nothing zetten geen zin, want objecten 'weten' niet dat ze op Nothing of null worden gezet. Hoogstens wordt de iterator wat eerder gegarbagecollect. Als de RecordIterator IEnumerable implementeert, dan heeft deze ook een Dispose() methode. En dat is dan degene die je moet aanroepen om de resources die door de iterator gebruikt worden te releasen.

Edit: Het 'Set' statement doet vermoeden dat het inderdaad een property is. Is dit VB6 code? Het verhaal hierboven gaat namelijk wel op voor VB.Net, maar wat betreft VB6 weet ik het niet zeker.

[ Voor 12% gewijzigd door BramFokke op 08-09-2008 10:57 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
BramFokke schreef op maandag 08 september 2008 @ 10:55:
Edit: Het 'Set' statement doet vermoeden dat het inderdaad een property is.
Het is geen property maar een object op zichzelf.
Verwijderd schreef op vrijdag 05 september 2008 @ 08:06:
maar tussendoor krijg ik de error:

code:
1
 Object was open for write
Wat is tussendoor? Op welke regel?

Overigens kun je de exit sub vervangen als je do/loop vervangt door while/wend:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set RecordIterator = ODT.GetODRecords
RecordIterator.init acadobj, False, False
While not RecordIterator.IsDone
  Set ODR = RecordIterator.Record
  counter = 0
  For Each CurTable In ODT.ODFieldDefs
    Set CurRecord = ODR.Item(counter)
    If LCase(CurTable.name) = "foo" Then msgbox CurRecord.Value
    counter = counter + 1
  Next
  RecordIterator.Next
Wend
Set RecordIterator = Nothing 'release the RecordIterator lock on objects


Nu ben ik verder niet bekend met de ACAD "api" maar:

Visual Basic:
1
2
Set RecordIterator = ODT.GetODRecords
RecordIterator.init acadobj, False, False

Eerst doe gooi je de "ODRecords" in de RecordIterator, en daarna moet 'ie dan nog ge-init worden? En hier raak je me even kwijt:

Visual Basic:
1
2
3
Set ODR = RecordIterator.Record 
...
Set CurRecord = ODR.Item(counter) 

Je gebruikt ODR, ODT, CurRecord, counter... Helemaal duidelijk is het me niet.

[ Voor 84% gewijzigd door RobIII op 08-09-2008 11:11 ]

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


Verwijderd

Topicstarter
RobIII schreef op maandag 08 september 2008 @ 11:02:
[...]

Het is geen property maar een object op zichzelf.

[...]

Wat is tussendoor? Op welke regel?
Op regel 8 van me eigen code:
Visual Basic:
1
    For Each element In ThisDrawing.PaperSpace
Overigens kun je de exit sub vervangen als je do/loop vervangt door while/wend:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set RecordIterator = ODT.GetODRecords
RecordIterator.init acadobj, False, False
While not RecordIterator.IsDone
  Set ODR = RecordIterator.Record
  counter = 0
  For Each CurTable In ODT.ODFieldDefs
    Set CurRecord = ODR.Item(counter)
    If LCase(CurTable.name) = "foo" Then msgbox CurRecord.Value
    counter = counter + 1
  Next
  RecordIterator.Next
Wend
Set RecordIterator = Nothing 'release the RecordIterator lock on objects


Nu ben ik verder niet bekend met de ACAD "api" maar:

Visual Basic:
1
2
Set RecordIterator = ODT.GetODRecords
RecordIterator.init acadobj, False, False

Eerst doe gooi je de "ODRecords" in de RecordIterator, en daarna moet 'ie dan nog ge-init worden? En hier raak je me even kwijt:

Visual Basic:
1
2
3
Set ODR = RecordIterator.Record 
...
Set CurRecord = ODR.Item(counter) 

Je gebruikt ODR, ODT, CurRecord, counter... Helemaal duidelijk is het me niet.
Deze code komt ook niet van mij. Maar van internet. Dit was de enigste 'oplossing' die ik tegenkwam op google. Ik snap er ook niet veel van wat ze nou precies doen. Daarom stelde ik me vraag hierzo.

[ Voor 4% gewijzigd door Verwijderd op 08-09-2008 11:23 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Mja, als je niet weet wat er gedaan wordt en je denkt er met copy/pasten te komen dan ben je verkeerd bezig (en zit je in het verkeerde forum). In dat geval is het misschien beter je eens te verdiepen in de documentatie en eens even te zien wat er nu precies gebeurt. We zijn hier geen persoonlijke debug service ;)

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


Verwijderd

Topicstarter
RobIII schreef op maandag 08 september 2008 @ 11:28:
Mja, als je niet weet wat er gedaan wordt en je denkt er met copy/pasten te komen dan ben je verkeerd bezig (en zit je in het verkeerde forum). In dat geval is het misschien beter je eens te verdiepen in de documentatie en eens even te zien wat er nu precies gebeurt. We zijn hier geen persoonlijke debug service ;)
Nee, ik denk er niet over om te copy/pasten. Ik heb zelf een code geschreven, die een error geeft die ik niet snap. Ik heb een oplossing gevonden op google (wat je als eerste hoort te doen, voordat je hier wat neerzet). Alleen die oplossing is voor mij ook acacadabra.
Mijn vraag is simpel: Waarom gaat het mis?
Tweede vraag: Wat doet die code die ik gevonden heb.

Ik ga echt niet copy/pasten. Ik wil begrijpen waarom. En wat doet het.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 08 september 2008 @ 11:33:
Nee, ik denk er niet over om te copy/pasten. Ik heb zelf een code geschreven, die een error geeft die ik niet snap. Ik heb een oplossing gevonden op google (wat je als eerste hoort te doen, voordat je hier wat neerzet). Alleen die oplossing is voor mij ook acacadabra.
Dat zeg ik: als het abracadabra voor je is moet je de documentatie er bij pakken en je in de materie verdiepen.
Verwijderd schreef op maandag 08 september 2008 @ 11:33:
Mijn vraag is simpel: Waarom gaat het mis?
Again: geen idee. Ik heb 0 kennis van de ACAD "api", en de paar mensen die hier (vast) rondlopen die dat wel hebben moeten maar net je topic zien en dan ook nog eens zin hebben het uit te leggen aan iemand die verder geen zin heeft zelf gewoon de documentatie er bij te pakken.
Verwijderd schreef op maandag 08 september 2008 @ 11:33:
Tweede vraag: Wat doet die code die ik gevonden heb.

Ik ga echt niet copy/pasten. Ik wil begrijpen waarom. En wat doet het.
8)7

Enige idee dat ik heb is dat je eens kunt proberen de variabelen die je gebruikt in de for-each eens na de lus op nothing te zetten; maar dat zou de for-each eigenlijk al moeten doen AFAIK en de variabelen die geSET worden, wanneer je ze niet meer nodig hebt, ook weer op Nothing SETten natuurlijk. Dus:

Visual Basic:
1
2
3
4
5
Set Symbool = element 
...
...<code hier waar je symbool gebruikt>...
...
Set Symbool = Nothing

[ Voor 14% gewijzigd door RobIII op 08-09-2008 11:40 ]

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


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Als ik deze error wegklik, doet hij precies wat ik wil.
Visual Basic:
1
On Error Resume Next

O-)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Verwijderd

Topicstarter
CodeCaster schreef op maandag 08 september 2008 @ 11:53:
[...]

Visual Basic:
1
On Error Resume Next

O-)
Ja ... nu geeft hij geen error, en doet hij wat ik wil .... Maar is dit echt netjes coden (ja dat is een andere discussie)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Uit deze post http://discussion.autodesk.com/thread.jspa?threadID=219932 kan ik opmaken dat die init binnen de for loop zou moeten om je object te initialiseren met dat waar de iterator naar wijst:
Object Data Records are not exposed as a typical
automation collection in this library, but as an
iterator which you must first allocate before use
and then sequentially traverse. During active
useage, you must keep a reference to that allocated
iterator.

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.

Pagina: 1