Tuesday, July 06, 2010

Långsamma javascript i IE ger felmeddelande.

På vissa sidor så går javascripten så långsamt att man får felmeddelande gång på gång i IE om man vill stoppa skriptet.

Ett skript på den här sidan gör att Internet Explorer går långsamt. Om det fortsätter att vara igång kan datorn sluta att svara. Vill du avbryta skriptet?



Stop running this script


Råkade ut för detta på en sida som visar API dokumentationen har även påtalat felet för dom som står bakom websiten, men det tar ett tag att fixa prestandaproblem och efter att ha stäng felrutan hundra gånger, så googlade jag efter andra alternativ och det finns ett annat sätt att hantera detta genom att ställa upp timeout tiden. Se: http://support.microsoft.com/kb/175500

Thursday, July 01, 2010

Exkludera filer från källkodshantering i Visual Studio.

Är tvungen att kolla upp detta gång på gång, så nu skriver jag upp det i bloggen så kanske jag kommer ihåg det tills nästa gång. Om man vill göra detta i ett vanligt projekt så är det relativt enkelt, gäller bara att komma ihåg att det är under source control i file menyn man ska söka:

1.In Visual Studio, open Solution Explorer and select the file to exclude.

2.On the File menu, click Source Control, then click Exclude from Source Control.

3.When you are ready to place the file under source control, you can access the File menu and click Source Control, then uncheck Exclude from Source Control.

http://msdn.microsoft.com/en-us/library/66tw9ezk(VS.90).aspx

Annat är det med Web sites, här känns det som att källkodshanteringen itne riktigt fungerar på samma sätt, men det går att göra "undo pending changes" på dom filer man inte vill ska läggas till:

Delete files that you want to exclude, add them to were they were again, but do not checkin yet. Then on source control undo pending changes. After that these files would not be source controled items.


http://social.msdn.microsoft.com/Forums/en-US/tfspowertools/thread/f4595ff1-059c-4a33-a3c6-2f22961a73c7

Friday, June 11, 2010

Debugga fel på beroenden mellan olika assemblys.

När man jobbar med stora .Net-projekt eller .Net-projekt som laddar assemblies via t.ex. CAB, så kan det vara svårt att se vad som går fel, när man får ett felmeddelande som säger att följande assenbly inte kan laddas. Hittade en bra beskrivning av ett verktyg som heter fuslogvw.exe Se MSDN: http://msdn.microsoft.com/en-us/library/e74a18c4(VS.71).aspx som man kan använda för att spåra den har typen av fel.

Outlook via HTTP frånkopplad hela tiden i Windows 7.

Har haft problem med att få Outlook att koppla sig till Exchange servern via HTTP enda sen jag installerade om min XP maskin med windows 7. Frågade en kollega och han sa att det var något problem i Vista med RPC och att det var en registernyckel som man skulle ändra. Så jag googlade lite på det och hittade lösningen:
Error messages when you try to connect Outlook 2007 to Exchange Server: "The action cannot be completed" or "Your Microsoft Exchange Server is unavailable" or "Cannot start Microsoft Office Outlook"

Outlook 2007
Click Start, click Run, type regedit in the Open box, and then click OK.
Locate and then click the following subkey:
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Outlook\RPC
On the Edit menu, point to New, and then click DWORD Value.
Type DefConnectOpts, and then press ENTER.
Right-click DefConnectOpts, and then click Modify.
In the Value data box, type 0, and then click OK.
Exit Registry Editor.
http://support.microsoft.com/kb/913843/en-us

Monday, May 31, 2010

ArcGIS Engine 10.0, platform target x86.

Nytt i ArcGIS 10.0 är att ESRIs assemblies är kompilerade mot x86 plattformen. Detta innebär att alla projekt som refererar ESRIs DLL:er måste sättas till x86. Annars får man ett felmeddelande i stil med:
Could not load file or assembly 'ESRI.ArcGIS.Version, Version=10.0.0.0, Culture=neutral, PublicKeyToken=8fc3cc631e44ad86' or one of its dependencies. Det går inte att hitta filen.

Så vid uppgradering av ArcGIS 9.3 applikationer till 10.0, så får man hålla koll på hur plattformen är satt.


Läs mera här: How to migrate ArcGIS 9.3 Desktop and Engine stand-alone applications to ArcGIS 10, Platform CPU target change

Thursday, May 27, 2010

ArcGIS Engine 10.0, RuntimeManager

Nytt i ArcGIS 10 är att ArcGIS desktop och ArcGIS Engine distribueras till var sin katalogstruktur (What's new for developers at 10), detta för att det oberoende av varandra ska gå att lägga in service packar. Detta innebär också att när man bygger standalone applikationer, så måste man välja vilken runtime man vill köra sin applikation under. När man väljer att skapa en ny MapControl Application project så läggs automatiskt kod in i Program.cs för att hantera detta:

 if  (!RuntimeManager .Bind(ProductCode .Engine))

 {

      if  (!RuntimeManager .Bind(ProductCode .Desktop))

      {

          MessageBox .Show("Unable to bind to ArcGIS runtime. Application will be shut down." );

          return ;

      }

 }

 



Värt att notera det nya RuntimeManager objektet som ESRI använder för att göra bind mot runtime versionen. Detta måste göras i koden innan några ArcObjects objekt anropas.

Run VS as administrator.

När man kör Visual Studio (VS) i Windows 7 (Win7), så är det bra att ställa in så att man kör den som administratör eftersom man i annat fall kan få fel i VS. Detta pga att processen körs med för hög säkerhet. Istället för att varje gång komma ihåg att högerklicka och välja "run as administrator" så kan man välja "egenskaper"


och "Advanced" och klicka i "run as admininstrator"




så startas VS alltid med administrator rättigheter.

Wednesday, May 05, 2010

Slå ihop PDF filer med iTextSharp.

Fick en fråga om jag kunde lägga till en sida med text i en rapport som vi genererar via reporting services. Och visst kan man det men då kommer man bli tvungen att underhålla en sida med text via rapporten vilket inte känns så bra. Ett annat alternativ som kändes mer lockande var att kombinera ihop PDF:en som skapas från reporting services med text sidan som en PDF. Så att dom kan underhållas var för sig.

Testade att skapa en applikation för att slå ihop två PDF:er och använde iText# som vi använder i andra projekt och utnyttjade ett exempel som jag hittade på nätet: http://khsw.blogspot.com/2006/04/merge-pdf-files-using-itextsharp.html gjorde enklast möjliga kod:

Dim destination As String = "c:\\testPDF.pdf"

Dim source As List(Of String) = New List(Of String)

source.Add("c:\\1.pdf")
source.Add("c:\\2.pdf")

PdfMerge.MergeFiles(destination, source.ToArray())

Fungerar hur bra som helst!

Saturday, April 24, 2010

ESRI DevSummit tech sessions. Developing .NET Applications for ArcGIS Engine

Kollat på tech-session-videos som ESRI lagt ut.

I presentationen "Developing .NET Applications for ArcGIS Engine" så går man igenom nyheterna i ArcGIS Engine. Några nyheter är:
  • VS2008, .Net 3.5 SP1.
  • Engine och Desktop är uppdelade som två runtimes.
  • Nytt att man måste aanvända RuntimeManager för att bind mot rätt runtime.
  • Ikonerna skickas med som PNG bilder.
  • GrahicsTracker, ett objekt som hjälper till med realtidsuppdateringar av objekt i kartan.
  • Background GeoProcessing, GeoProcesing kan köras som en separat process.
  • För licenser så har "Concurrent use" och "Borrow/Return" tillkommit.

Saturday, April 17, 2010

Public Resource.resx

Lade till en Resource.resx fil i ett av mina projekt och försökte komma åt ResoureManager objektet från en annat projekt, men fick ett kompileringsfel. :( Det visade sig att VS standardmässigt skapar resursfiler som Internal/Friend isf Public, vilket gör att klasserna bara går att komma åt internt i samma assembly. Detta går att lösa genom att hacka i den automatgenererade koden men det är ajjabajja , det vill man inte göra. Visar sig att det går att byta custom tool som skapar koden, vilket är en bättre lösning:

Byt från ResXCodeFileGenerator till PublicResXFileCodeGenerator så får man en resurs klass som är public.

Hantera ohanterade fel i .Net och CAB.

Hittade en bra artikel om hur man ska hantera ohanterade fel:

Tanken är att man i sin egen kod bara hanterar fel som man vet ska inträffa:

Try
Throw New InvalidAttributeException("Fel på in argumentet!!!")
Catch ex As InvalidAttributeException
'Hanterar felet
End Try


Alla andra fel som man inte vet vad det är låter man propagera hela vägen upp till applikationen som hanterar dom ohanterade felen:

<STAThread()> _
Public Shared Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf AppDomainUnhandledException
AddHandler Application.ThreadException, AddressOf ThreadException
app = New Program()
app.Run()
End Sub

Private Shared Sub AppDomainUnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
HandleException(CType(e.ExceptionObject, Exception))
End Sub

Private Shared Sub ThreadException(ByVal sender As Object, ByVal ex As System.Threading.ThreadExceptionEventArgs)
HandleException(ex.Exception)
End Sub


Private Shared Sub HandleException(ByVal e As Exception)
'MessageBox.Show("Ohanterat fel har inträffat!!")
End Sub


Fördelarna som jag ser med detta är att man slipper risken att någon att fångar och sväljer fel bara för att dom inte vet vad man ska göra med felet. Samtidigt tycker jag att man alltid ska fånga alla fel som inträffar i sin kod för att kunna logga felen där dom inträffar. Detta står inte i konflikt med varandra eftersom man alltid kan kasta felet vidare efter man fångat ett exception. Dock bör man ha veta hur man gör för att behålla den fulla stacktracen när man gör det se t.ex:

VB.Net och Shared Sub Main

Som standard så startas VB.Net applikatioenr via en Main Formulär men ibland vill man lägga in loggning eller liknande direkt när en appliation startar isf att lägga det i Form_Load. Hade problem med att få en VB.Net applikation att starta via Sub Main:

<STAThread()> _
Public Shared Sub Main()

End Sub


Förväntade mig att se den som ett val under properties på appliaktionen men icke:


Visade sig att det krävs att man klickar ur "Enable application framework" för att Sub Main ska komma upp som val i VB.Net.

Saturday, April 10, 2010

The ArcGIS API for Microsoft Silverlight™/WPF™ hostad i CAB.

Suttit och testat ifall det går att lägga in ESRIs ArcGIS API for Microsoft Silverlight™/WPF™ i en CAB applikation. Skulle vara en grym kombination för kartvisning i CAB baserade applikationer. Har gjort en relativt enkel appliaktion en shell appliaktion som innehåller meny och verktygsfält samt ett workspace för kartan. Gjort en Modul som innehåller en WPF-vy som hostar kart kontrollen samt ett kommando för att sätta om kartan till full utbredning.


Detta visar på att man kan integrera en WPF-vy i ett befintligt system och att det inte blir någon stor skillnad mot att bygga WinForms vyer.

Databinding mot ITable i ArcGIS Engine

Har jobbat med databinding i CAB mot objektstrukturer för att testa hur CAB och MVC patternet fungerar tillsammans med EventBrokern, då frågan kom upp hur gör vi om vi vill kunna göra databinding direkt mot en ITable i ArcObjects? Hittade ett bra exempel http://edndoc.esri.com/arcobjects/9.2/NET/a6eb84fb-93db-4bc3-82a9-874d8890a8ca.htm på ESRIs EDN site som jag modifierat lite och byggt in i ett CAB projekt. Lösningen som dom gjort bygger på att man wrappar ITable i en BindingList.


Applikationen läser in en shapefil som läggs in i kartan och samma kartlager läggs som en ITable in via databinding in i tabellen. Detta gör att förändringar i tabellen slår igenom i kartan.


Bugg i WPF implementationen av CAB ElementHostWorkspace

Hjälpte en kollega igår med ett problem som han brottats med i nästan en vecka. När WPF smartparten stängdes och en Winform smartpart skulle laddas så fick han ett exception InvalidCastException. Eftersom två par ögon ser mer en ett par så gick vi igenom felmeddelandet och stegade fram oss i koden till vi hittade raden som spökade. Vi hittade ett fel i klassen Microsoft.Practices.CompositeUI.WPF.ElementHostWorkspace:

///
/// Raises the event.
///

/// The smart part that is being closed.
protected WorkspaceCancelEventArgs RaiseSmartPartClosing(object smartPart)
{
if (smartPart is ElementHost)
{
smartPart = elementHosts.Unwrap((ElementHost)activeSmartPart);
}
WorkspaceCancelEventArgs cancelArgs = new WorkspaceCancelEventArgs(smartPart);
RaiseSmartPartClosing(cancelArgs);

return cancelArgs;
}



Felet var att variablen activeSmartPart skulle vara smartPart. Såg det genom att man kontrollerar smartPart innan man gör cast och eftersom activeSmartPart är WinForm SmartParten så smäller koden ur vid casten. Vilket innebär att koden ska se ut så här för att fungera:


///
/// Raises the event.
///

/// The smart part that is being closed.
protected WorkspaceCancelEventArgs RaiseSmartPartClosing(object smartPart)
{
if (smartPart is ElementHost)
{
smartPart = elementHosts.Unwrap((ElementHost)smartPart);
}
WorkspaceCancelEventArgs cancelArgs = new WorkspaceCancelEventArgs(smartPart);
RaiseSmartPartClosing(cancelArgs);

return cancelArgs;
}

Sunday, March 28, 2010

CAB och ArcGIS Engine.

Har varit lite dålig på att blogga på ett tag och det beror på att jag har senaste veckorna förkovrat mig och jobbat åt en kund med att testa Microsoft Pattern&Practicies Composite UI Application Block CAB med ESRIs ArcGIS Engine AGE. Mest för att verifiera hur en tänkbar design skulle kunna se ut, samt när olika delar av CAB vi behöver användas för att lösa så att vi kan skapa en applikation som blir Composite med fristående moduler. Under processens gång så har jag hittat många bra resurser för CAB. Den bästa resursen från Microsoft är en PDF som Designing Applications using CAB & the Smart Client Software Factory som ingående beskriver delarna i CAB, det är lätt att det blir begrepps förvirring med så många nya begrepp. Samma typ av information finns även på MSDN library Composite UI Application Block. När det gäller att ingående beskriva hur man använder CAB så tycker jag att man ska läsa Rich Newman men även Jeremy Miller som beskriver grundläggande vilka design patterns CAB gänget använt och varför man vill använda vissa patterns när man skapar composite applikationer. Vid skapandet av designprototypen så har vi kunnat identifiera att det kommer att gå att isolera karthanteringen i specifika moduler vilket gör att bara vissa utvecklare kommer vara tvungen att ha utvecklarlicener för AGE samt att man enkelt kommer kunna byta ut ArcGIS Engine mot något annat om man skulle vilja det. Känner mig taggad att testa att byta ut Engine mot ESRI WPF API:er mot REST, bara för att visa att det går.

Saturday, February 27, 2010

ArcGIS Engine i CAB.

Har byggt en applikation i Composite Applikation Block (CAB) för att testa hur man kan integrera den med ArcGIS Engine.

Det var inga större konstigheter skapade en Shell applikation som laddade en Modul som hade en Smartpart med Kartan.

Saturday, February 20, 2010

Combobox i verktygsfält i ArcGIS Engine eller implementera IToolControl.

När man bygger verktyg för ArcGIS Engines verktygsfält, så kan man utgå från dom templates som installeras i visual studio enligt konceptet som finns beskrivet här: http://resources.esri.com/help/9.3/ArcGISEngine/dotnet/0bf044f6-dbcd-4d04-836e-3b5e47204818.htm.
Men ibland så vill man ju ibland göra lite mer avancerade saker. T.ex så kan man vara i behov av att lägga in en combobox i verktygsfältet. För att få det att fungera så krävs det lite mer kodning, man måste implementerar interfacet ICommand eller ITool (ifall man vill ha ett verktyg med tillgång till displayen) istället för basklasserna. Samt ärva från en System.Windows.Form.Combobox. Utöver detta så krävs det även att man implementerar interfacet IToolControl se http://resources.esri.com/help/9.3/ArcGISEngine/arcobjects/esrisystemui/itoolcontrol.htm. Esri beskriver här hur man måste göra för att knyta kontrollen till verktygsfältet. Handle referensen till comboboxen måste exponeras vid implemenation av interfacet.

Friday, February 19, 2010

Installera SSRS BIDS 2005 efter 2005 SP1.

Haft problem med att jag efter datorbyte av min stationära maskin på kontoret att jag bara har kunnat redigera mina rapporter på min bärbara dator. Problemet har varit att en senare version som standard är installerad på maskinen (SP1) och vid installation av Business Intelligence komponenterna, så har installation gett ett felmeddelande att den inte kan installera några komponenter. Kändes som att ett sätt att lösa detta hade kunnat vara att avinstallera allt som har med SQL Server 2005 att göra och sen installera på nytt i rätt ordning men det kändes inte speciellt lockande.

Löste detta i vanlig ordning genom att googla lite, hittade till sist ett sätt att lösa detta på som finns beskrivet här: http://social.msdn.microsoft.com/Forums/en-US/sqlsetupandupgrade/thread/117454be-67c5-4458-8429-08eccd6f82f6
  1. Add/Remove Programs Uninstall Microsoft SQL Server 2005
  2. Select to only remove the client tools (unchecked remove existing instance)
  3. Start installation (I ran it fine without the SKUUPGRADE switch)

Detta fungerade klockrent!

Wednesday, February 17, 2010

Compress av ArcSDE.

Misslyckad prodläggning igår som berode på att compress jobbet inte flyttade över alla förändringar i delta (add och delete) tabellerna till bas-tabellerna. En bra beskrivning av Compress av ArcSDE geodatabaser finns här: http://resources.esri.com/help/9.3/geodatabase/Blog/GDB_Rep_Compress.pdf det visade sig att vi hade missat att göra reconcile och post på versionerna, så att en version blev hängande med state som inte pekade på samma som den andra vilket gjorde att compressen inte flyttade in dess förändringar. Versionerna ska postas till default ifall man vill vara säker på att delta tabellerna ska tömmas. ESRI har även Batch jobb som kan hjälpa till med detta http://webhelp.esri.com/arcgisdesktop/9.3/body.cfm?tocVisable=1&ID=2579&TopicName=Automating%20reconcile%20and%20post