{"id":554,"date":"2011-02-06T21:48:24","date_gmt":"2011-02-06T20:48:24","guid":{"rendered":"http:\/\/www.matjazev.net\/blog\/?p=554"},"modified":"2011-02-11T08:50:34","modified_gmt":"2011-02-11T07:50:34","slug":"scitenje-resursov-v-vba-ii","status":"publish","type":"post","link":"https:\/\/www.matjazev.net\/blog\/2011\/02\/06\/scitenje-resursov-v-vba-ii\/","title":{"rendered":"\u0160\u010ditenje resursov v VBA II"},"content":{"rendered":"<p>V <a href=\"http:\/\/www.matjazev.net\/blog\/2011\/02\/01\/scitenje-resursov-v-vba\/\">prej\u0161njem blogu<\/a> sem omenil, da nam pri \u0161\u010ditenju resursov lahko pomagajo objekti in <strong>zdaj je \u010das, da si ogledamo kako.<\/strong><\/p>\n<p>Napi\u0161imo torej <strong>skrajno preprost objekt, ki ima samo konstruktor, destruktor ter inicializacijsko funkcijo<\/strong>, ki mu postavi ime, da mu la\u017eje sledimo (poimenujmo ga <em><strong>objSciti<\/strong><\/em>):<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nOption Explicit\n\nPrivate ime As String\n\nPrivate Sub Class_Initialize()\n&nbsp;&nbsp;Debug.Print &quot;NOV &quot;\nEnd Sub\n\nPrivate Sub Class_Terminate()\n&nbsp;&nbsp;Debug.Print &quot;BRI\u0160EM &quot;; ime\nEnd Sub\n\nPublic Sub init(aime As String)\n&nbsp;&nbsp;ime = aime\n&nbsp;&nbsp;Debug.Print &quot;&nbsp;&nbsp;POSTAVIM &quot;; ime\nEnd Sub\n<\/pre><br \/>\nUporabimo ga v preprosti proceduri:<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nSub Proc()\n&nbsp;&nbsp;Dim a As New objSciti\n&nbsp;&nbsp;a.init &quot;prvi&quot;\nEnd Sub\n<\/pre><br \/>\n\u010ce proceduro izvedemo, dobimo slede\u010d rezultat:<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nNOV\n&nbsp;&nbsp;POSTAVIM prvi\nBRI\u0160EM prvi\n<\/pre><br \/>\n\u010ce funkcijo pogledamo, nam je jasno, da izpis niza <strong>&#8216;NOV&#8217; <\/strong>povzro\u010di <strong>prva vrstica kode, <\/strong>izpis niza<strong> &#8216;POSTAVIM prvi&#8217; <\/strong>povzro\u010di <strong>druga vrstica <\/strong>kode\u2026 <strong>Kaj pa izpis tretjega niza?<\/strong> <em><strong>Tretji niz pa izpi\u0161e destruktor, ki ga VBA pokli\u010de sam ob zaklju\u010dku procedure<\/strong><\/em>.<\/p>\n<p>Malce ni\u017eje bomo sicer spoznali tudi, da pravzaprav prvi dve vrstici izpi\u0161e funkcija &#8216;init&#8217;, a to zdajle niti ni pomembno.<\/p>\n<p>Kaj \u010de funkcijo preoblikujemo tako, da sprejme ime in jo potem <strong>kli\u010demo iz neke druge funkcije<\/strong>? Omenjena ideja je predstavljena spodaj:<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nSub Proc2(ime As String)\n&nbsp;&nbsp;Dim a As New objSciti\n&nbsp;&nbsp;a.init ime\nEnd Sub\n\nSub TestProc2()\n&nbsp;&nbsp;Dim i\n&nbsp;&nbsp;For i = 1 To 20\n&nbsp;&nbsp;&nbsp;&nbsp;Proc2 &quot;spr&quot;; i\n&nbsp;&nbsp;Next\nEnd Sub\n<\/pre><br \/>\n\u010ce izvedemo testno proceduro &#8216;<em><strong>TestProc2<\/strong><\/em>&#8216;, dobimo slede\u010d rezultat<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nNOV\n&nbsp;&nbsp;POSTAVIM spr1\nBRI\u0160EM spr1\nNOV\n&nbsp;&nbsp;POSTAVIM spr2\nBRI\u0160EM spr2\n\u2026 in tako dalje \u2026\nNOV\n&nbsp;&nbsp;POSTAVIM spr20\nBRI\u0160EM spr20\n<\/pre><br \/>\nTo  je torej <strong>lep dokaz, da se objekt ob zaklju\u010dku funkcije avtomati\u010dno uni\u010di <\/strong>in nam za to ni potrebno skrbeti. Iz rezultata je namre\u010d vidno, da se funkcija izvede 20x in vsaki\u010d kli\u010de proceduro, ki objekt ustvari in ga tudi uni\u010di. In to preprosto dejstvo nam lahko re\u0161i neprespane no\u010di ob iskanju hro\u0161\u010da \ud83d\ude42<\/p>\n<p>Konkreten primer uporabe vam bom prikazal naslednji\u010d, za danes pa podajam samo \u0161e dve zelo pomembni opozorili.<\/p>\n<h2>Opozorilo1<\/h2>\n<p>V kolikor ste navajeni klasi\u010dnih programskih jezikov, kot sta recimo C in C++ lahko pridete na idejo, da vso pomembno programsko kodo postavite v konstruktor in ustrezno \u010di\u0161\u010denje v destruktor\u2026<\/p>\n<p><strong>TODA, \u010de v VBA-ju ne uporabite vsaj ene javne funkcije\/ metede\/ lastnosti objekta, ga VBA izvajalno okolje ne bo naredilo. Torej VBA tak\u0161nega objekta sploh nikoli ne bo ustvaril.<br \/>\n<\/strong><\/p>\n<p>\u010ce prej\u0161njo funkcijo preoblikujete takole:<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nSub Proc2(ime As String)\n&nbsp;&nbsp;Dim a As New objSciti\n&#039; objekta nikoli ne uporabimo\n&#039; zato ga VBA sploh ne bo ustvaril!\nEnd Sub\n<\/pre><br \/>\n<strong>Program ne bo izpisal ni\u010desar!<\/strong><\/p>\n<h2>Opozorilo2<\/h2>\n<p>V kolikor ste navajeni klasi\u010dnih programskih jezikov, kot sta recimo C in C++ lahko pri\u010dakujete, da bo VBA uni\u010dil objekt ob koncu programskega bloka. <strong>A to v primeeru VBA-ja ne dr\u017ei. VBA uni\u010duje objekte samo na koncu funkcij \/procedur.<\/strong><\/p>\n<p>Primer je lepo viden, \u010de v testni proceduri ne kli\u010demo procedure, temve\u010d objekt direktno ustvarimo:<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nSub TestProc3()\n&nbsp;&nbsp;Dim i\n&nbsp;&nbsp;For i = 1 To 20\n&nbsp;&nbsp;&nbsp;&nbsp;&#039; VBA bo objekt ustvaril samo 1x !\n&nbsp;&nbsp;&nbsp;&nbsp;Dim a As New objSciti\n\n&nbsp;&nbsp;&nbsp;&nbsp;&#039; lastnosti bo spreminjal ISTEMU objektu\n&nbsp;&nbsp;&nbsp;&nbsp;a.init &quot;spr&quot;; i\n&nbsp;&nbsp;Next&nbsp;&nbsp;&#039; objekt a ne bo uni\u010den tukaj\n\n&nbsp;&nbsp;&#039; temve\u010d bo uni\u010den \u0161ele tukaj\nEnd Sub\n<\/pre><br \/>\nSedaj pa je izpis povsem druga\u010den:<br \/>\n<pre name=&#8221;code&#8221; class=&#8221;vb&#8221;>\nNOV\n&nbsp;&nbsp;POSTAVIM spr1\n&nbsp;&nbsp;POSTAVIM spr2\n\u2026 in tako dalje \u2026\n&nbsp;&nbsp;POSTAVIM spr20\nBRI\u0160EM spr20\n<\/pre><br \/>\n<strong>Na primeru je lepo vidno, da VBA ustvari en sam objekt. Bodite pozorni na to!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>V prej\u0161njem blogu sem omenil, da nam pri \u0161\u010ditenju resursov lahko pomagajo objekti in zdaj je \u010das, da si ogledamo kako. Napi\u0161imo torej skrajno preprost objekt, ki ima samo konstruktor, destruktor ter inicializacijsko funkcijo, ki mu postavi ime, da mu la\u017eje sledimo (poimenujmo ga objSciti): Option Explicit Private ime As String Private Sub Class_Initialize() &nbsp;&nbsp;Debug.Print &hellip; <a href=\"https:\/\/www.matjazev.net\/blog\/2011\/02\/06\/scitenje-resursov-v-vba-ii\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">\u0160\u010ditenje resursov v VBA II<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,35,34],"tags":[40,39,41,66,65,38],"_links":{"self":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts\/554"}],"collection":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/comments?post=554"}],"version-history":[{"count":9,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts\/554\/revisions"}],"predecessor-version":[{"id":563,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts\/554\/revisions\/563"}],"wp:attachment":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/media?parent=554"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/categories?post=554"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/tags?post=554"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}