Author Topic: Regarding vlax-release-object  (Read 3397 times)

0 Members and 1 Guest are viewing this topic.

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Regarding vlax-release-object
« on: June 05, 2009, 08:59:22 PM »
I am not entirely confident with using this function, and do not always know when it should be invoked.

I am looking into writing information to Excel for example, and have used the following code (based on an example posted on another site):

Code: [Select]
[color=RED]([/color][color=BLUE]defun[/color] c:ttx  [color=RED]([/color][color=BLUE]/[/color] ss xlApp xlBooks xlBook xlSheets xlSheet xlCells column row[color=RED])[/color]
  [color=RED]([/color][color=BLUE]vl-load-com[/color][color=RED])[/color]
  [color=RED]([/color][color=BLUE]if[/color] [color=RED]([/color][color=BLUE]setq[/color] ss [color=RED]([/color][color=BLUE]ssget[/color] [color=#ff00ff]"_X"[/color] [color=RED]([/color][color=BLUE]list[/color] [color=RED]([/color][color=BLUE]cons[/color] [color=#009900]0[/color] [color=#ff00ff]"*TEXT"[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
    [color=RED]([/color][color=BLUE]progn[/color]
      [color=RED]([/color][color=BLUE]setq[/color] xlApp    [color=RED]([/color][color=BLUE]vlax-get-or-create-object[/color] [color=#ff00ff]"Excel.Application"[/color][color=RED])[/color]
            xlBooks  [color=RED]([/color][color=BLUE]vlax-get-property[/color] xlApp [color=#ff00ff]"Workbooks"[/color][color=RED])[/color]
            xlBook   [color=RED]([/color][color=BLUE]vlax-invoke-method[/color] xlBooks [color=#ff00ff]"Add"[/color][color=RED])[/color]
            xlSheets [color=RED]([/color][color=BLUE]vlax-get-property[/color] xlBook [color=#ff00ff]"Sheets"[/color][color=RED])[/color]
            xlSheet  [color=RED]([/color][color=BLUE]vlax-get-property[/color] xlSheets [color=#ff00ff]"Item"[/color] [color=#009900]1[/color][color=RED])[/color]
            xlCells  [color=RED]([/color][color=BLUE]vlax-get-property[/color] xlSheet [color=#ff00ff]"Cells"[/color][color=RED])[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]vla-put-visible[/color] xlApp [color=BLUE]:vlax-true[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]setq[/color] column [color=#009900]1[/color] row [color=#009900]1[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]foreach[/color] Str [color=RED]([/color][color=BLUE]mapcar[/color] [color=DARKRED]'[/color][color=BLUE]vla-get-TextString[/color]
                     [color=RED]([/color][color=BLUE]mapcar[/color] [color=DARKRED]'[/color][color=BLUE]vlax-ename->vla-object[/color]
                       [color=RED]([/color][color=BLUE]mapcar[/color] [color=DARKRED]'[/color][color=BLUE]cadr[/color] [color=RED]([/color][color=BLUE]ssnamex[/color] ss[color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
        [color=RED]([/color][color=BLUE]if[/color] [color=RED]([/color][color=BLUE]<[/color] [color=#009900]65536[/color] row[color=RED])[/color]
          [color=RED]([/color][color=BLUE]setq[/color] column [color=#009900]3[/color][color=RED])[/color][color=RED])[/color]
        [color=RED]([/color][color=BLUE]vlax-put-property[/color] xlCells [color=#ff00ff]"Item"[/color] row column Str[color=RED])[/color]
        [color=RED]([/color][color=BLUE]vlax-put-property[/color] xlCells [color=#ff00ff]"Item"[/color] row [color=RED]([/color][color=BLUE]1+[/color] column[color=RED])[/color]
          [color=RED]([/color][color=BLUE]strcat[/color] [color=RED]([/color][color=BLUE]getvar[/color] [color=#ff00ff]"DWGPREFIX"[/color][color=RED])[/color] [color=RED]([/color][color=BLUE]getvar[/color] [color=#ff00ff]"DWGNAME"[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
        [color=RED]([/color][color=BLUE]setq[/color] row [color=RED]([/color][color=BLUE]1+[/color] row[color=RED])[/color][color=RED])[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]mapcar[/color]
        [color=RED]([/color][color=BLUE]function[/color]
          [color=RED]([/color][color=BLUE]lambda[/color] [color=RED]([/color]x[color=RED])[/color]
            [color=RED]([/color][color=BLUE]vl-catch-all-apply[/color]
              [color=RED]([/color][color=BLUE]function[/color]
                [color=RED]([/color][color=BLUE]lambda[/color] [color=RED]([/color][color=RED])[/color]
                  [color=RED]([/color][color=BLUE]progn[/color]
                    [color=RED]([/color][color=BLUE]vlax-release-object[/color] x[color=RED])[/color]
                    [color=RED]([/color][color=BLUE]setq[/color] x [color=BLUE]nil[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
          [color=RED]([/color][color=BLUE]list[/color] xlCells xlSheet xlSheets xlBook xlBooks xlApp[color=RED])[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]alert[/color] [color=#ff00ff]"Close Excel file manually"[/color][color=RED])[/color][color=RED]([/color][color=BLUE]gc[/color][color=RED])[/color][color=RED]([/color][color=BLUE]gc[/color][color=RED])[/color][color=RED])[/color]
    [color=RED]([/color][color=BLUE]princ[/color] [color=#ff00ff]"\n<< No Text Found in Drawing >>"[/color][color=RED])[/color][color=RED])[/color]
  [color=RED]([/color][color=BLUE]princ[/color][color=RED])[/color][color=RED])[/color]

The above should hopefully extract all text items to Excel and put the drawing from which they were extracted in the adjacent column.

However, is it acceptable to write the code like this?

Code: [Select]
[color=RED]([/color][color=BLUE]defun[/color] c:ttx  [color=RED]([/color][color=BLUE]/[/color] ss xlApp xlCells column row[color=RED])[/color]
  [color=RED]([/color][color=BLUE]vl-load-com[/color][color=RED])[/color]
  [color=RED]([/color][color=BLUE]if[/color] [color=RED]([/color][color=BLUE]setq[/color] ss [color=RED]([/color][color=BLUE]ssget[/color] [color=#ff00ff]"_X"[/color] [color=RED]([/color][color=BLUE]list[/color] [color=RED]([/color][color=BLUE]cons[/color] [color=#009900]0[/color] [color=#ff00ff]"*TEXT"[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
    [color=RED]([/color][color=BLUE]progn[/color]
      [color=RED]([/color][color=BLUE]setq[/color] xlApp    [color=RED]([/color][color=BLUE]vlax-get-or-create-object[/color] [color=#ff00ff]"Excel.Application"[/color][color=RED])[/color]
            xlCells  [color=RED]([/color][color=BLUE]vlax-get-property[/color]
                       [color=RED]([/color][color=BLUE]vlax-get-property[/color]
                         [color=RED]([/color][color=BLUE]vlax-get-property[/color]
                           [color=RED]([/color][color=BLUE]vlax-invoke-method[/color]
                             [color=RED]([/color][color=BLUE]vlax-get-property[/color] xlApp [color=#ff00ff]"Workbooks"[/color][color=RED])[/color]
                                [color=#ff00ff]"Add"[/color][color=RED])[/color] [color=#ff00ff]"Sheets"[/color][color=RED])[/color] [color=#ff00ff]"Item"[/color] [color=#009900]1[/color][color=RED])[/color] [color=#ff00ff]"Cells"[/color][color=RED])[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]vla-put-visible[/color] xlApp [color=BLUE]:vlax-true[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]setq[/color] column [color=#009900]1[/color] row [color=#009900]1[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]foreach[/color] Str [color=RED]([/color][color=BLUE]mapcar[/color] [color=DARKRED]'[/color][color=BLUE]vla-get-TextString[/color]
                     [color=RED]([/color][color=BLUE]mapcar[/color] [color=DARKRED]'[/color][color=BLUE]vlax-ename->vla-object[/color]
                       [color=RED]([/color][color=BLUE]mapcar[/color] [color=DARKRED]'[/color][color=BLUE]cadr[/color] [color=RED]([/color][color=BLUE]ssnamex[/color] ss[color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
        [color=RED]([/color][color=BLUE]if[/color] [color=RED]([/color][color=BLUE]<[/color] [color=#009900]65536[/color] row[color=RED])[/color]
          [color=RED]([/color][color=BLUE]setq[/color] column [color=#009900]3[/color][color=RED])[/color][color=RED])[/color]
        [color=RED]([/color][color=BLUE]vlax-put-property[/color] xlCells [color=#ff00ff]"Item"[/color] row column Str[color=RED])[/color]
        [color=RED]([/color][color=BLUE]vlax-put-property[/color] xlCells [color=#ff00ff]"Item"[/color] row [color=RED]([/color][color=BLUE]1+[/color] column[color=RED])[/color]
          [color=RED]([/color][color=BLUE]strcat[/color] [color=RED]([/color][color=BLUE]getvar[/color] [color=#ff00ff]"DWGPREFIX"[/color][color=RED])[/color] [color=RED]([/color][color=BLUE]getvar[/color] [color=#ff00ff]"DWGNAME"[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
        [color=RED]([/color][color=BLUE]setq[/color] row [color=RED]([/color][color=BLUE]1+[/color] row[color=RED])[/color][color=RED])[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]mapcar[/color]
        [color=RED]([/color][color=BLUE]function[/color]
          [color=RED]([/color][color=BLUE]lambda[/color] [color=RED]([/color]x[color=RED])[/color]
            [color=RED]([/color][color=BLUE]vl-catch-all-apply[/color]
              [color=RED]([/color][color=BLUE]function[/color]
                [color=RED]([/color][color=BLUE]lambda[/color] [color=RED]([/color][color=RED])[/color]
                  [color=RED]([/color][color=BLUE]progn[/color]
                    [color=RED]([/color][color=BLUE]vlax-release-object[/color] x[color=RED])[/color]
                    [color=RED]([/color][color=BLUE]setq[/color] x [color=BLUE]nil[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color][color=RED])[/color]
          [color=RED]([/color][color=BLUE]list[/color] xlCells xlApp[color=RED])[/color][color=RED])[/color]
      [color=RED]([/color][color=BLUE]alert[/color] [color=#ff00ff]"Close Excel file manually"[/color][color=RED])[/color][color=RED]([/color][color=BLUE]gc[/color][color=RED])[/color][color=RED]([/color][color=BLUE]gc[/color][color=RED])[/color][color=RED])[/color]
    [color=RED]([/color][color=BLUE]princ[/color] [color=#ff00ff]"\n<< No Text Found in Drawing >>"[/color][color=RED])[/color][color=RED])[/color]
  [color=RED]([/color][color=BLUE]princ[/color][color=RED])[/color][color=RED])[/color]

Such that fewer variables are used and hence fewer have to be processed through vlax-release-object.

Which is the better programming practice?

Thanks for your advice, time, and interest in this thread.

Cheers,

Lee

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
Re: Regarding vlax-release-object
« Reply #1 on: June 05, 2009, 09:23:17 PM »
IMO the only one YOU created is xlApp and you should release that one.
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

It's Alive!

  • Retired
  • Needs a day job
  • Posts: 8691
  • AKA Daniel
Re: Regarding vlax-release-object
« Reply #2 on: June 05, 2009, 09:26:42 PM »
I always thought vlax-release-object is to be used on objects that you create, in your case the only object that needs to be released is xlApp. I could be wrong though

It's Alive!

  • Retired
  • Needs a day job
  • Posts: 8691
  • AKA Daniel
Re: Regarding vlax-release-object
« Reply #3 on: June 05, 2009, 09:27:36 PM »
oops   :-)

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Re: Regarding vlax-release-object
« Reply #4 on: June 06, 2009, 06:16:23 AM »
Thanks guys,

I'll take that on board  :-)

Joe Burke

  • Guest
Re: Regarding vlax-release-object
« Reply #5 on: June 06, 2009, 09:02:08 AM »
May I add, in cases where release is important, it should be done in an error handler. So if the routine crashes, the object will be released.

Example which assumes (*error* nil) is called at the end of the primary function.

  (defun *error* (msg)
    (cond
      ((not msg))
      ((wcmatch (strcase msg) "*QUIT*,*CANCEL*"))
      (T (princ (strcat "\nError: " msg)))
    )
    (if (not (vlax-object-released-p RegExp))
      (vlax-release-object RegExp)
    ) 
    (princ)
  ) ;end error

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Re: Regarding vlax-release-object
« Reply #6 on: June 06, 2009, 11:17:18 AM »
Good Point Joe.

Regarding your code, I like the way you have provided the condition:

Code: [Select]
((wcmatch (strcase msg) "*QUIT*,*CANCEL*"))

I would normally use:

Code: [Select]
(if (not (member msg '("Function cancelled" "quit / exit abort")))
  (princ (strcat "\nError: " msg)))

But I think I may use your option in my error handlers in future - if that's ok with you of course  :angel:

alanjt

  • Needs a day job
  • Posts: 5352
  • Standby for witty remark...
Re: Regarding vlax-release-object
« Reply #7 on: June 06, 2009, 02:03:41 PM »
you could even take it a step farther and protect yourself from error'ing out befor you define the object

Code: [Select]
(vl-catch-all-apply 'vlax-release-object (list RegExp))or
Code: [Select]
(and RegExp
       (vl-catch-all-apply 'vlax-release-object (list RegExp))
 )
Civil 3D 2019 ~ Windohz 7 64bit
Dropbox

alanjt

  • Needs a day job
  • Posts: 5352
  • Standby for witty remark...
Re: Regarding vlax-release-object
« Reply #8 on: June 06, 2009, 02:06:53 PM »
or...

Code: [Select]
 (and (eq (type RegExp) 'VLA-OBJECT)
       (vl-catch-all-apply 'vlax-release-object (list RegExp))
  )
Civil 3D 2019 ~ Windohz 7 64bit
Dropbox

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Re: Regarding vlax-release-object
« Reply #9 on: June 06, 2009, 02:09:51 PM »
or...

Code: [Select]
 (and (eq (type RegExp) 'VLA-OBJECT)
       (vl-catch-all-apply 'vlax-release-object (list RegExp))
  )

Nice one Alan...  striving to make it "uncrashable"   :-P

alanjt

  • Needs a day job
  • Posts: 5352
  • Standby for witty remark...
Re: Regarding vlax-release-object
« Reply #10 on: June 06, 2009, 10:06:52 PM »
or...

Code: [Select]
 (and (eq (type RegExp) 'VLA-OBJECT)
       (vl-catch-all-apply 'vlax-release-object (list RegExp))
  )

Nice one Alan...  striving to make it "uncrashable"   :-P

little cya never hurt ;)

i like to use the 2nd one.
Civil 3D 2019 ~ Windohz 7 64bit
Dropbox