Рашэнне праблемы: “FileNotFoundException” З Маім атрымальніка функцыі.

I was working on a feature last week that would add some event receivers to a specific list instance. (Я пісаў трохі аб гэтым спісе прымачом тут).

Выкарыстанне каманднага радка, Я магу ўсталяваць кампанент без памылкі (але гл ніжэй для схаванай памылцы). When I tried to deploy the feature on the site, MOSS complained of a "FileNotFoundException" памылка. This blog entry describes how I solved it.

Гэта памылка, якая паказала мне MOSS ў вэб-браўзэры:

Feature ‘b2cb42e3-4f0a-4380-aaba-1ef9cd526f20’ could not be installed because the loading of event receiver assembly "xyzzyFeatureReceiver_0" не ўдалося: System.IO.FileNotFoundException: Could not load file or assembly ‘xyzzyFeatureReceiver_0’ або адзін з залежных ад. The system cannot find the file specified.
File name: ‘xyzzyFeatureReceiver_0’
at System.Reflection.Assembly.nLoad(AssemblyName імя_файла, Струнны CODEBASE, Доказы assemblySecurity, Асамблея locationHint, StackCrawlMark& стэк глебы, Булевы throwOnFileNotFound, Булевы forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Доказы assemblySecurity, StackCrawlMark& стэк глебы, Булевы forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Доказы assemblySecurity, StackCrawlMark& стэк глебы, Булевы forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
at Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) да 1.
Увага: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

Troubleshoot issues with Windows SharePoint Services.

I know how to deliberately cause that error: don’t install the assembly in the GAC. Але, it was in the GAC. I normally install assemblies into the GAC by dragging them into the c:\windows\assembly folder using windows explorer. I’ve never felt 100% comfortable doing that because I always thought that gacutil existed for a reason … so I tried that. It made no difference.

I searched the Internets and found this post: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2243677&SiteID=1

The poster happened to be using the same root bit of code (from the Inside WSS book from this list) so that was a hopeful sign. Аднак, the suggestion of decorating the assembly with an [assembly: ] directive didn’t make sense to me. I tried it anyway and I was right. It made no difference.

Then I noticed that my class definition was not public. I made it public and that made no difference.

Наступны, I went to the trouble of enabling the "assembly bind failure log" (пасля карыснымі і дакладнымі інструкцыямі) and this is where things started to get interesting. That log shows me that the runtime is searching everywhere on that server for my assembly. It even appears to be searching for it in my medicine cabinet. Але … ён не будзе шукаць яго ў GAC.

I put on my winter jacket and go searching the Internets again and find that someone has had this problem too. The lengthy discussion in that posting peters off into nothing and I can’t find a solution.

I move my assembly into one of the places the log claims it’s searching and I make a little more progress. I’m rewarded with a new error in the browser when I try to activate the feature:

Failed to create feature receiver object from assembly "xyzzyFeatureReceiver_0", type "Conchango.xyzzyFeatureReceiver" для мастацкіх b2cb42e3-4f0a-4380-ааба-1ef9cd526f20: System.ArgumentNullException: Значэнне не можа быць пустым.
Найменне параметра: тып
at System.Activator.CreateInstance(Тып Тып, Булевы непублічнай)
at System.Activator.CreateInstance(Тып Тып)
at Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()

Troubleshoot issues with Windows SharePoint Services.

Час для адной апошняй паездкі ў інтэрнэце!

На гэты раз я даведаюся,, дастаткова прадказальна, that MOSS issues this error because the assembly is not in GAC.

Я хачу атрымаць нешта станоўчае з гэтага і спрабуюць адчуваць сябе крыху ганаруся тым, што я стварыў Уцякач з MSIL зборкі, but it’s not working. I’m just plain annoyed. I find myself muttering "chicken or the egg" пад нос.

I finally decide to punt. I create an entirely new project and copy/paste the code from the incredible-cloaked-from-the-GAC-assembly non-working project over to this new project. (I look for a build flag called something like "hide from assembly binding if installed in the GAC" але не магу знайсці адну).

Я ўсталяваць функцыю і актываваць яго і … гэта працуе! Так, пасля ўсяго, што, I had to basically ‘reboot’ my project. Гэта яшчэ адна прычына, чаму я ненавіджу кампутары.

I did learn something useful from this. I had been installing features using the stsadm command line all day long and been using the "-force" option out of habit. Па некаторых прычынах, I did not use the -force option when I installed the new project. На гэты раз, Я зрабіў на самай справе, truly forget to copy this new project’s assembly into the GAC. У выніку, I received that "FielNotFoundException" памылка. На гэты раз, Я атрымаў яго ад Stsadm, not when I tried to activate the feature via the web browser. Так, -force actually plays two roles. It allows you to re-install an existing feature. It also allows you to install a buggy feature that cannot work at runtime by suppressing the error. It probably says as much in the help somewhere but I never noticed it.

</канец>

Нядзеля Смешныя: Верхні 10 Спосабаў, каб дапячы сваёй жонцы

  1. Купіць брокалі, калі вы ведаеце, што ёсць ужо больш чым досыць у халадзільніку.
  2. Go for a run. Cool off. Take off clean pillow case and replace with T-shirt. Cover with clean pillow case.
  3. Пры руху, спытаеце, калі мы павінны ісці няправільны шлях ўніз вуліца з аднабаковым рухам.
  4. Для 15 гадоў, кожную нядзелю, што вы жонка прапануе збіраецца ў музей, выказваюць здзіўленне, што музеі адкрыты ў нядзелю.
  5. Для 15 гадоў, occasionally suggest going to the local book store on Sunday. Express surprise that they are not open on Sunday’s (дзякуй вялікі Пурытанскія законы!).
  6. Выкарыстоўваць 20 пунктаў, каб зрабіць 3 point turn.
  7. На халодную восень рана днём, walk into the room and turn on the A/C. Complain that it’s cold. When wife says, "then why did you turn that on, дурны" і ўстае, каб выключыць яго, grab the warm spot she had on the couch. Bonus points if she does not realize you did it until much later.
  8. Адкрыць слоік смачнага тунца белы тунец і з'есці яго прама з банкі, у ложку, ноччу.
  9. Пайсці на кухню ў той час як жонка есць вячэру, адкрыць скрыню сталовых прыбораў і посуду штуршок вакол, пакуль крыкі жонкі, "what are you looking for!"
  10. Атрымаўшы новыя візітныя карткі, таемна размясціць іх па ўсім доме: Пад ложкам, ў навалачцы, ўнутры кававыя кубкі, ў сумачцы, ў кішэні паліто, адсекаў аўтамабіля пальчаткі, каморы — anywhere you can think of.
  11. Напісаць запісаў аб вашай жонцы.
  12. Прачынацца.
  13. Пры хадзе на вуліцах Нью-Ёрка, be on the alert for "crusty" objects on the ground. Маючы на ​​ўвазе асаблівых боязі вашай жонкі, дасягнуць ўніз, як быццам падняць адзін і спытаць, "hmm, Цікава, што гэта такое?" (Be prepared for wife to body slam you as if she’s a secret service agent protecting the President from a sniper or you’ll find yourself laying on your back on the sidewalk).
  14. Drive twice around a parking lot looking for space. You know you’ve really hit pay dirt when your son in the back seat yells, "Oh no! Ён робіць гэта зноў!"
  15. Write "top 10" спісы, якія не маюць 10 элементы.

===

Бонусныя жарт жонкі:

Two male co-workers go out to lunch. One of them tells the other, "I let loose an embarrassing Freudian slip the other night."

"A Freudian slip? What’s that?"

"Well, калі мы скончылі ёсць, Падышла афіцыянтка і спытала, як нам спадабаліся нашы стравы. Я меў на ўвазе сказаць, ‘I loved the chicken breast’ but instead I said ‘I loved your breasts’. I was so embarrassed."

"Ah," his co-worker replied. "I had the same thing happen to me this weekend with my wife. We were eating breakfast I meant to ask her to pass the butter, але замест гэтага я крычаў на яе, ‘You ruined my life!'"

</канец>

Technorati Тэгі:

Код падзеі 1023: “Не атрымалася загрузіць пашыраецца лічыльнікаў MSSCNTRS DLL”

АБНАЎЛЕННЕ (04/08/08): I seem to have solved this problem. From the command line, I ran "c:\Windows System32 Lodctr / R" паводле запісу кажуць аб праблемах InstallShield і які, здаецца, вырашыў гэта для мяне.

Я заўважыў, што ў апошні час, my desktop/server fan never turns off. I know it used to turn off. I took a moment to check it out noticed that the a VMware process was running a consistent 20% utilization on one of the CPU’s. I checked the event log and saw these errors in the application log happening dozens of times per minute:

Не атрымалася загрузіць пашыраецца лічыльнікаў UGatherer DLL, першы DWORD ў раздзеле дадзеных кода Windows Error.

Не атрымалася загрузіць пашыраецца лічыльнікаў UGTHRSVC DLL, першы DWORD ў раздзеле дадзеных кода Windows Error.

Не атрымалася загрузіць пашыраецца лічыльнікаў MSSCNTRS DLL, першы DWORD ў раздзеле дадзеных кода Windows Error.

Калі я паглыбіцца ў дэталі аднаго з гэтых паведамленняў, Я атрымліваю гэта:

Крыніца: Perflib

Тып: Памылка

Катэгорыя: Ні адзін

Код падзеі 1023

I did some research and there was some indication it could be a permission problem in terms of access to the DLLs in question. I played around with that stuff but could not affect things in a positive way so I gave up on that.

VMware была ныццё мяне аб выкананні абнаўлення на працягу досыць доўгага часу, так што я запісаў версію я ўсталяваў (apparently "1.0.1 build 29996") and did the update. This upgraded me to v1.04. Сумна, гэта не вырашыць праблему.

I can stop the insane number of messages going to my application log if I shut down a service named "VMware Authorization Service". This prevents me from using the VMware software, так … not such a great option.

Базавая аперацыйная сістэма Windows XP з'яўляецца 64 біт.

Я не думаю, што гэта заўсёды адбывалася, але я не памятаю ні аднаго канкрэтнага падзеі, што магло б прывесці да яго.

Вось чаму я ненавіджу кампутары.

</канец>

Technorati Тэгі:

Хутка & Лёгка: Пераназавіце загружаны файл з дапамогай аб'ектнай мадэлі SharePoint праз прыёмнік падзей

АБНАЎЛЕННЕ: This works but there are significant limitations which are described in the comments. This may still be useful in some cirumstances.

АБНАЎЛЕННЕ 2: У маім бягучым праекце, users always upload documents. У выніку, I don’t run into a problem where MS Word is running and thinks that the file was renamed on it. I did run into a problem, "the file was modified by someone else" and solved this via a simple semaphore type flag. Users need to change a meta data field from its default value to something else. The itemupdated() Прыёмнік шукае сапраўднае значэнне там да фактычнага выканання перайменавання і з тых часоў, I have not had any problems. Your mileage may vary.

I have a client requirement to change the name of files uploaded to a specific document library to conform with a particular naming convention. The API does not provide a "rename()" метад. Замест, мы выкарыстоўваем "MoveTo(…)". Here is a minimal bit of code to accomplish this:

 грамадскасць адмяняць ануляваць ItemAdded(SPItemEventProperties ўласцівасці)
        {
            SPFile F = properties.ListItem.File;

            f.MoveTo(properties.ListItem.ParentList.RootFolder.Url + "/xyzzy.doc");
            f.Update();

        }

The only tricky bit is the "properties.ListItem.ParentList.RootFolder.Url". The MoveTo() method requires a URL. That mashed up string points me to the root folder of my current document library. This allows me to avoid any hard coding in my event receiver.

Гэта больш карысна версія, якая робіць тое ж самае, but assigns the name of the file to "Title":

 грамадскасць адмяняць ануляваць ItemAdded(SPItemEventProperties ўласцівасці)
        {
            DisableEventFiring();

            // Назначце назва гэтага пункта на імя самога файла.
 // УВАГА: Гэта прызначэнне павінна адбыцца, перш чым змяніць сам файл.
 // Выклік абнаўлення() на SPFile здаецца несапраўдным ўласцівасці ў
 // пэўным сэнсе.  Updates to "Title" не ўдалося пакуль што змены (і абнаўлення() называць)
 // былі перамешчаныя перад змяненнем імя файла.
            properties.ListItem["Title"] = Properties.ListItem.File.Name;

            properties.ListItem.Update();

            SPFile F = properties.ListItem.File;

            // Атрымаць пашырэння файла.  Нам трэба, каб пазней.
 радок spfileExt = новы Інфармацыя аб файле(f.Name).Пашырэнне;

            // Пераназавіце файл у ID элемента спісу і выкарыстоўваць пашырэнне файла, каб захаваць
 // што частка яго ў такім выглядзе.
            f.MoveTo(properties.ListItem.ParentList.RootFolder.Url +
                "/" + properties.ListItem["ID"] + spfileExt);

            // Фіксацыя ходу.
            f.Update();

            EnableEventFiring();
        }

Форум Размовы: Захаванне рэкамендацый выканання ў нетрывіяльных MOSS навакольнага асяроддзя

Хлопец, "Mark", has started up a potentially interesting newsgroup discussion focusing on "establishing excellent SharePoint Governance from the start" для 35,000 карыстацкай асяроддзя.

Размовы тут: http://groups.google.com/group/microsoft.public.sharepoint.portalserver/browse_thread/thread/6d9a738d981af772/1c390b15c5407db6?#1c390b15c5407db6

Поп пра больш і спрыяюць!

</канец>

Карыстацкі URL Дзеянне не будзе адлюстроўвацца для новых функцый

I’m still in the habit of crafting my feature XML files by hand since it’s all quite new to me. I don’t want to rely on a front-end tool that does stuff I don’t understand (Ён сказаў, як ён напісаў у блогу запіс з дапамогай інструмента ён не разумее).

Сёння, I was trying to add a custom action to the site settings but it just wouldn’t show up. I could install the feature and see it in the site features, but when I activated it (without error) it simply wouldn’t show up on the drop-down menu.

I finally realized that I misspelled "SharePoint" in the Location attribute of the <CustomAction> вузел. This is the bad elements.xml file:

<?XML версія="1.0" кадаваньне="UTF-8" ?>
<Элементы XMLNS="HTTP://schemas.microsoft.com / SharePoint /">
  <CustomAction
 Id="SiteActionsToolbar"
 GroupId="SiteActions"
 Размяшчэнне="Microsoft.Sharepoint.StandardMenu"
 Sequence="100"
 Назва="Прывітанне!"
 Апісанне="Custom menu action added via a feature."
 ImageUrl="_layouts/images/menuprofile.gif">

    <UrlAction Url="HTTP://www.xyzzy.com"/>

  </CustomAction>
</Элементы>

Good:

<?XML версія="1.0" кадаваньне="UTF-8" ?>
<Элементы XMLNS="HTTP://schemas.microsoft.com / SharePoint /">
  <CustomAction
 Id="SiteActionsToolBar"
 GroupId="SiteActions"
 Размяшчэнне="Microsoft.SharePoint.StandardMenu"
 Sequence="100"
 Назва="Прывітанне!"
 Апісанне="Custom menu action added via a feature."
    >
    <UrlAction Url="HTTP://www.xyzzy.com"/>
  </CustomAction>
</Элементы>

That one took me a good two hours to figure out 🙂

I take solace in the fact that some day in the future, I’ll be able to say with conviction, "back in the day, I had to walk three miles up hill in the snow (barefoot!) in order to deploy a custom feature to MOSS. You kids, you don’t know how easy you have it! Get off my lawn!"

Can’t wait.

</канец>

Technorati Тэгі: ,

Блог Статыстыка

I thought some people might be interested in my blog’s statistics. You can use mine as a benchmark to compare your own.

I’m running my blog on windows live spaces. They collect stats for me and I don’t know any way to control that. It’s good as far as it goes, but it’s fairly limited in that I can’t do much actual analysis with it. I’d love, напрыклад, to be able to generate a listing of my most frequently hit posts but I can’t do that without a prohibitive manual process. If someone knows better, Калі ласка, скажыце мне.

Live-статус прастор скажы мне: Усяго паказаў на працягу дня, total hits for the week and total hits since day zero. It also tells me what people did to get to my blog (e.g. Google, MSDN Спасылка для форуму, і г.д.).

У пэўным сэнсе, a "hit" Відавочна. Калі вы чытаеце гэтую прапанову прама цяпер, Вы амаль напэўна зарэгістраваныя ў якасці аднаго ўдару.

RSS is a little confusing. On one hand, I see individual RSS hits all day long. Але, I also see RSS "sweeps". A sweep is when I see 20 або 30 RSS hits all within a one or two second window. I assume these are automated things like google checking in on my site, можа быць, чужыя браўзэры … not sure. They are definitely some kind of automated process. I cannot tell, аднак, how many of my total hits are automated and how many have an actual human on the other side. I would guess at least 100 хітоў у дзень аўтаматызаваны.

На да нумароў!

Я напісаў сваю першую запіс у блогу ліпені 27, 2007.

Я напісаў прыкладна 60 запісаў з тых часоў, больш 50 якія наўпрост звязаныя з SharePoint.

Я пачаў сачыць за маёй хітоў у электронную табліцу на штодзённай аснове ў канцы верасня.

Штомесячныя Starts:

Першы тыдзень: Усяго запытаў
Кастрычнік 1,234
Лістапада 2,162
Снежань 3,071
Студзень 2008 4,253

Усяго па месяцах

Месяц Усяго запытаў
Кастрычнік 6,620
Лістапада 11,110
Снежань 13,138

Высокія ацэнкі вады

Тып Усяго запытаў
Лепшы дзень 958
Лепшая тыдзень 4,253
Усяго запытаў з нулявы дзень 42,438

Я зацікаўлены ў іншыя’ stats. If you care to share yours in the comments, калі ласка!

</канец>

Technorati Тэгі:

Sunday Morning Смешныя: “Так, ды, ды. Глупства, глупства, бла.”

Каля шасці гадоў таму, my four-year-old son and I were upstairs watching a Discovery channel "shark attacks" спецыяльны (Напэўна, гэты адказ). He was very young at the point and I was always worried what he might see on a show like this and how he might take it. I didn’t want him to develop, напрыклад, любы special fears of the water or blab something inappropriate to his friends and possibly cause his baby friend network to come crashing down.

Discovery handles these kinds of subjects very well. It’s not about creating a fear of something, but rather to show how unusual it is for sharks to attack humans.

Так, we’re watching it and there is this one particularly scary attack involving a small girl. As Discovery is building the drama of the attack, my son (who has always been extremely jumpy anyway), is getting very excited. I make some noises about how unusual it is for sharks to attack people, and how bad the poor girl must feel. I’m trying to explain that people recover from these events and become stronger for it. Аднак, I had misinterpreted his excitement. He was not worried about the girl at all. Замест, while clapping his hands, he tells me, "The sharks love it! It’s terrific. It’s wonderful. Its a DREAM COME TRUE!"

I thought this was hilarious, but also very disturbing. З аднаго боку, I was glad — even a little proud — that he could have strong empathic feelings, cross-species though they may be. As humans, we need to develop our "empathic muscles" so speak or you’ll end up like this guy 🙂 On the other hand, he was feeling cross-species empathy toward a species who was exhibiting behavior inimical to his own. I was really struggling with this when the narrator used the word "paradigm". My son picked up on that and asked me what that meant.

That’s not such an easy word to describe to a four year old, but I gave it a try. When I think of the word "paradigm", Thomas Kuhn is never far from my thoughts. Я чытаю The Structure of Scientific Revolutions back at Lafayette and for better or for worse, the word "paradigm" is pregnant with extra meaning for me. (Sort of like the word "contact" after hearing a Movie Phone voice tell me where I could see that movie [I thought the book was better]; I always say to myself, "CONTACT!" whenever I see or hear someone say "contact").

У любым выпадку, I’m trying to explain to him a Kuhnian definition, that it’s "a historical movement of thought" and that it’s a "way of thinking with a number of built-in assumptions that are hard to escape for people living at that time." Вядома, you can’t talk like to a four-year old, so I’m trying to successively define it to smaller pieces and feeling rather proud of myself as I do so. (I just knew that someone outside of college would care that I had read Kuhn!).

I’m just warming to the task when he interrupts me. Waving his hand in my general direction and never taking his eyes off another brutal shark attack, he just says, "Yeah, ды, ды. Глупства, глупства, blah.".

So much for that 🙂

At that point, I decided to run away, rhetorically speaking, sit back, and enjoy watching sharks attack humans with my son.

</канец>

Technorati Тэгі:

Пераключыць выгляд прадстаўлення на аснове ідэнтыфікатар карыстальніка ў формы InfoPath

Мы распрацавалі формы InfoPath з некалькімі ўяўленнямі для падтрымкі новага супрацоўніка / on-boarding process. When the company hires a new person, ІТ-аддзела і іншых груп павінны прыняць меры (створана заработнай платы, забяспечыць доступ да адпаведных прыкладанням, знайсці стол, і г.д.). We use on form but a different view of the form for each of those functions.

У гэтай кампаніі, большасць людзей, якія ўдзельнічаюць у бізнес-працэсе з'яўляюцца IT-падкаваных, таму, калі яны атрымліваюць доступ да форме, their default view is a "menu" view with buttons that direct them to their specific function. Аднак, we needed to simplify things for the new hire’s direct manager. This person should not see any of the IT related stuff. На самай справе, яна павінна ўбачаць толькі адзін від на форме і нават не маюць магчымасць убачыць іншыя меркаванні.

У нашым выпадку, што кошт прамога мэнэджара напрамую звязана з формай ласкі Выбар кантактаў (which I am always wanting to call a "people picker" па некаторых прычынах).

Меры заключаюцца ў наступным:

1. У рэжыме канструктара, перайдзіце ў меню Сэрвіс -> Параметры формы -> Адкрыць і Захаваць.

2. Select "rules".

3. Create a new rule whose action is "switch to view" і чый стан выкарыстоўвае імя карыстальніка() функцыя.

имя_пользователя() returns the "simple" user name without the domain. If I log into SharePoint with credentials "domain\pagalvin", имя_пользователя() returns "pagalvin".

The contact selector provides three bits of information for a contact. The "AccountID" portion is most useful for this scenario. The only thing that makes this even a little bit of challenge is that the contact selector (у маім асяроддзі ўсё роўна) вяртае імя дамена і карыстальніка ID, as in "domain\pagalvin". This prevents us from doing a straight-forward equality condition since AccountID ("domain\pagalvin") ніколі не будзе роўная имя_пользователя() ("pagalvin").

We can get around this using the "contains" аператар: AccountID ўтрымлівае имя_пользователя().

Мы можам узяць яго, а таксама папярэдне залежаць жорстка дамена перад імем карыстальніка() функцыю, каб атрымаць нашу раўнавагу праверыць і выключыць рызыку ілжывых спрацоўванняў на аператара ўтрымлівае.

We would have REALLY like to automatically switch view for other users based on their AD security group membership. Напрыклад, when a member of the "IT Analytics" група атрымлівае доступ да форме, automatically switch to the IT Analytics view. We didn’t have time to implement it, but my first thought is to create a web service that would have a method like "IsMemberOfActiveDirectorySecurityGroup", перадаць яго імя карыстальніка() and return back true or false. Does anyone have any other, больш разумная думка? Is there any SharePoint function we can leverage from InfoPath to make that determination?

</канец>

Technorati Тэгі:

Выпадкова Даданне кода ў InfoPath Form; Наўмысна выдалення яго

Пры працы з кнопкамі на форме, we often add rules. You access the rules editor from the properties of the button.

Пры націску вакол хутка, it’s easy to accidentally click on "Edit Form Code" instead of "Rules …".

Першы раз я зрабіў гэта, I canceled out of the code editor. Аднак, when I tried to publish the form a little while later, it required that I publish as an "Administrator-approved form template (advanced)". I didn’t actually do any programming and I absolutely didn’t want to go through an unnecessary approval process. I was in a bit of panic at the time due to time constraints. To get past it, I simply restored a previous backup and continued. I had recently seen some blog posts about people going into the form’s XML to tweak things and I was afraid I would have to do something similar.

Сёння, I did it again. На гэты раз, I had a little more time on my hands and found that you can easily undo this.

Да:

Tools -> Параметры формы -> Праграмаванне: "Remove Code"

It does not get much easier than that.

</канец>

Technorati Тэгі: ,