Posts

Posts uit 2010 tonen

Hoofdstuk 6 - Les 3

Tekst kan aan een afbeelding worden toegevoegd d.m.v. d Graphics class: Maak een Graphics object Maak een Font object (Optioneel) Maak een Brush object Roep Graphics.DrawString aan Een eenvoudige manier om een Font object aan te maken is als volgt: FontFamily ff = new FontFamily("Arial"); Font f = new Font(ff, 12); Om een font in te lezen vanuit een string, maak dan gebruik van de FontConverter class. Op de volgende manier kan tekst worden 'getekend' Graphics g = this.CreateGraphics(); Font f = new Font("Arial", 40, FontStyle.Bold); g.DrawString("Hello, world!", f, Brushes.Blue, 10, 10); Hiervoor kan het beste een label gebruikt worden, maar met deze methode kan er ook in afbeeldingen worden geschreven. Handig voor bijvoorbeeld copyrights e.d.. Met de StringFormat class kan de richting en uitlijning van de tekst bepaald worden. Een object hiervan kan vervolgens meegegeven worden aan de DrawString methode.

Hoofdstuk 6 - Les 2

De System.Drawing.Image class is abstract en geeft de mogelijkheid om een afbeelding te maken, te laden, aan te passen of op te slaan. Er kunnen instanties van de Image class gemaakt worden door Image.FromFile of Image.FromStream aan te roepen. Daarnaast kan ook gebruik gemaakt worden classes die erven van Image: System.Drawing.Bitmap en System.Drawing.Imaging.Metafile (voor geanimeerde afbeeldingen). Bitmap heeft onder andere 2 methode die Image niet heeft: GetPixel: Geeft de Color object van een bepaalde pixel in de afbeelding. SetPixel: Geeft een pixel een bepaalde kleur. Om een afbeelding te tonen van de harde schijf kan een PictureBox gebruikt worden. De afbeelding kan worden geladen met Image.FromFile om vervolgens de BackgroundImage te zetten van de PictureBox. De achtergrond van een form kan gezet worden door een Graphics object van de form aan te maken en vervolgens de methode DrawImage aan te roepen. Om een nieuwe afbeelding te maken, maak je een nieuwe Bitmap aan zonder een

Hoofdstuk 6 - Les 1

De System.Drawing namespace maakt het mogelijk om afbeeldingen te bewerken of om nieuwe afbeeldingen te maken. Het graphics object is het meest gebruikte object. De Pen class wordt gebruikt om de lijnen en vormen te tekenen en de Brush classes die erven van de abstract Brush class worden gebruikt om de vormen te vullen. De PictureBox class kan gebruikt worden om de afbeeldingen te tonen. Met Location (type Point) property van een control kan de locatie bepaalt worden. Ditzelfde geldt voor de properties Left en Top. Met de properties ForeColor en BackColor kan de kleur van de control bepaalt worden. De properties zijn van het type Color, uit de namespace System.Drawing.Color. De volgende stappen zijn nodig om een lijn te tekenen op een form of control: Maak een Graphics object aan door System.Windows.Forms.Controls.CreateGraphics aan te roepen. Maak een Pen object Roep een methode van de Graphics aan om te tekenen op het form of control De Graphics class bevat vele methoden waarmee vorm

Hoofdstuk 5 - Les 3

Met customserialisatie kan ervoor worden gezorgd dat het serialiseren en deserialiseren tussen verschillende applicatie versies goed verloopt. Dit houdt in dat als er bijvoorbeeld een veld is bijgekomen in een class die wordt geserialiseerd, de oude versie hier niet op stuk loopt. Bij custom serialisatie moet de interface ISerilizable worden geimplementeerd en moet het attribuut [Serializable] worden toegevoegd aan de class. Bij het implementeren van deze interface moet de methode GetObjectData worden geimplementeerd, maar ook een constructor die wordt aangeroepen bij het deserialiseren. Tijdens het serialiseren wordt de methode GetObjectData aangeroepen en moet het SerializationInfo object handmatig worden gevuld. Dit kan door middel van de AddValue methode met name/value paren. Tijdens het deserialiseren kunnen de waarden weer opgehaald worden d.m.v. de meegegeven name. .NET ondersteunt binary serialisatie events als de BinaryFormatter class wordt gebruikt. De SoapFormatter kent deze

Hoofdstuk 5 - Les 2

System.Xml.Serialization bevat methoden voor het converteren van objecten, van en naar xml bestanden. Gebruik XML serialisatie als objecten moeten worden uitgewisseld met applicaties die het .NET framework niet ondersteunen. XML Serialisatie bevat de volgende voordelen ten opzichte van normale serialisatie. Grotere samenwerking: XML is een text bestand en dus kan er door elke taal mee worden gewerkt. Meer administrator vriendelijk: Geserialiseerde xml bestanden kunnen gelezen worden door administrators. Daarbij kunnen deze bestanden aangepast worden. Betere forward-compatability: Als een nieuwe versie van een applicatie uitkomt kunnen de XML bestanden makkelijker worden verwerkt. Nadelen van XML serialisatie: XML serialisatie kan geen private velden bevatten, enkel public velden. Er kunnen geen object graphs geserialiseerd worden, alleen objecten. Globaal ziet XML serialisatie er als volgt uit: Maak een stream, TextWriter of XmlWriter om de geserialiseerde output vast te houden Maak ee

Hoodsstuk 5 - Les 1

Serealisatie, zoals geimplementeerd in de System.Runtime.Serialization namespace, is het process van serialiseren en deserialiseren van objecten zodat deze kunnen worden opgeslagen of vervoerd en later opnieuw aangemaakt kunnen worden. Serialiseren is het converteren van een object in een lineaire volgorde van bytes die kunnen worden opgeslagen of worden vervoerd. Globaar gezien werkt het serialisatie process als volgt: Maak een stream object die de serialisatie output bevat Maak een BinaryFormatter object (te vinden in System.Runtime.Serialization.Formatters.Binary) Roep de BinaryFormatter.Serialize() methode aan om het object te serialiseren en de output op te slaan in de stream string data = "Dit moet worden opgeslagen in een bestand"; // Maak een bestand aan om de data op te slaan FileStream fs = new FileStream("Serialize.data", FileMode.Create); // Maak een binary formatter object BinaryFormatter bf = new BinaryFormatter(); // Serialiseer de data m.b.v. de bina

Constructor, Load event en override OnLoad

Constructor In de constructor geen database aanroepen verwerken. Een constructor is er om een object te 'constructen' en deze zo snel mogelijk terug te geven. Voor het vullen van controls met data uit een database wordt aangeraden dit als volgt te doen. Voer in de OnLoad methode de volgende stappen uit: Maak alle controls en bereid deze voor voor het vullen van data. Als er veel data gevuld opgehaald moet worden, disable dan het form. Haal de data op. Als het veel data betreft via een thread. Enable het form weer als alle data is geladen. Override de OnLoad method van een form in plaats van gebruik te maken van de form_load event. Dit in verband met overerving. Tevens is het zo dat de OnLoad method het Load event triggert. Daarnaast adviseert Microsoft om de method te overriden dan gebruik te maken van het event ( http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onload.aspx ). Vergeet bij het overriden van de OnLoad method niet de base.OnLoad(e) aan te roepen.

IIS 5 op XP verbindingen limiet verhogen

Standaard staat IIS 5 op Windows XP maximaal 10 verbindingen toe. Dit kan verhoogd worden tot maximaal 40, dit is hardcoded bepaald. Het aantal verbindingen is enkel te verhogen door middel van het uitvoeren van een script. Voer hiervoor de volgende stappen uit: Open de command prompt en blader naar de inetpub\AdminScripts map waar het bestand 'adsutil.vbs' zich bevindt. Typ de volgende regel gevolgd door enter: CScript.exe adsutil.vbs set w3svc\MaxConnections 40 Als bovenstaande regel niet werkt voer hem dan op de volgende wijze uit: adsutil set w3svc\MaxConnections 40 Het aantal verbindingen is nu ingesteld op het maximum, 40. Tevens zou ook de keep-alives verminderd kunnen worden of uitgeschakeld worden. Standaard staat de kee-alive op 5 minuten. Deze kan uiteraard naar eigen inzien verlaagd worden in IIS. bron: http://weblogs.asp.net/cazzu/archive/2003/10/10/31476.aspx

C# Invoke, BeginInvoke, InvokeRequired

Afbeelding
Controls kunnen op twee manieren worden gemanipuleerd vanuit een andere thread, namelijk: Invoke() BeginInvoke() Waarom is het niet mogelijk om direct controls te manipuleren vanuit een andere thread? Dat is de vraag die centraal staat voor dit blog. Message queue en message pumping Elke Windows applicatie die wordt gemaakt is bij het opstarten voorzien van een thread. Deze thread roept de main method aan van de applicatie. GUI applicaties zijn event gebaseerd, wat inhoud dat er een entiteit moet bestaan om events af te vuren en te verwerken. Windows doet dit door een message queue aan te maken voor de applicatie. Alle UI gerelateerde acties worden vertaald naar messages die worden doorgestuurd naar de message queue. Nu is er nog iets nodig die deze messages van de queue leest en de geschikte event handlers aanroept. Dit gebeurt door de message pump. De message pump is in principe een loop die wacht totdat iemand een message op de queue plaatst. Zodra iemand dit doet, haalt de pump de

Aantekeningen DevDays 2010 Den Haag (World Forum)

C# 4.0 - default parameter value: public void Method(string bar, string foo="defaultValue") Wanneer de default parameter veranderd, dient de assembly opnieuw te worden gecompileerd. - named parameter: Method(foo="newValue") -Default en named parameters hoofdzakelijk gebruiken voor COM interop (Word, Excel, etc.) - In command prompt dir van Visual Studio, ildasm starten met exe van applicatie = disassembler -nieuw keyword: dynamic. Doet compiler niets mee. Ook voor COM interop. - Dynamic object class overriden (geen linq) Dynamisch classes maken extension methods niet mogelijk lamba expressies niet mogelijk -CoVariance IList list = new List IEnumerable -> read only object - Generic CoVariance Linq Advanced "All ceremony, no essence" - chain extension methods - lambda = anonieme methods, delegate - Func<int,int, int> square = x => x * x Laatst int in Func lijst is return parameter - Action <int> Action heeft geen return parameter (void) -

Task schedlar openen vanuit code en CLSID

Om de task schedlaur te openen vanuit code moet je een zogenaamde CLSID aanroepen. Een CLSID is een Windows Class IDentifier. Er zijn verschillende identifiers: ::{d20ea4e1-3957-11d2-a40b-0c5020524153} Administrative Tools ::{85bbd92o-42a0-1o69-a2e4-08002b30309d} Briefcase ::{21ec2o2o-3aea-1o69-a2dd-08002b30309d} Control Panel ::{d20ea4e1-3957-11d2-a40b-0c5020524152} Fonts ::{ff393560-c2a7-11cf-bff4-444553540000} History ::{00020d75-0000-0000-c000-000000000046} Inbox ::{00028b00-0000-0000-c000-000000000046} Microsoft Network ::{20d04fe0-3aea-1069-a2d8-08002b30309d} My Computer ::{450d8fba-ad25-11d0-98a8-0800361b1103} My Documents ::{208d2c60-3aea-1069-a2d7-08002b30309d} My Network Places ::{1f4de370-d627-11d1-ba4f-00a0c91eedba} Network Computers ::{7007acc7-3202-11d1-aad2-00805fc1270e} Network Connections ::{2227a280-3aea-1069-a2de-08002b30309d} Printers and Faxes ::{7be9d83c-a729-4d97-b5a7-1b7313c39e0a} Programs Folder ::{645ff040-5081-101b-9f08-00aa002f954e} Recycle B

Hoofdstuk 4 - Les 2

Door gebruik te maken van Generic lists wordt performance gewonnen omdat niks hoeft te worden gecast. Van de in les 1 besproken collections zijn er ook generic classes beschikbaar: ArrayList, StringCollection -> List<T> Hashtable, ListDictionary, HybridDictionary, OrderedDictionary, NameValueCollection, StringDictionary -> Dictionary<T, U> Queue -> Queue<T> Stack -> Stack<T> SortedList -> SortedList<T, U> CollectionBase -> Collection<T> SortedList<string, int> sl = new SortedList<string, int>(); sl.Add("waarde 1", 1); sl.Add("waarde 2", 2); sl.Add("waarde 3", 3); foreach(int i in sl.Values) Console.WriteLine(i.toString()); Om een custom class te kunnen laten sorteren moet deze de interface IComparable implementeren en vervolgens de method CompareTo(object obj) implementeren.

Hoofdstuk 4 - Les 1

Het .NET Framework kent de volgende collectie classes: ArrayList - Eenvoudige collectie dat elk type object kan opslaan. Ze breiden zichzelf naar de juiste grootte. Queue - Een First-in first-out (FIFO) collectie. Stack - Last-in first-out collectie (LIFO) StringCollection - Strongly typed en alleen voor strings. Ondersteunt geen sorting. BitArray - Een verzameling van boolean waarden. Omdat ArrayList de IComparabe interface implementeerd kan gebruik worden gemaakt van de Sort method. Tevens kan gebruik worden gemaakt van de methods Remove(), Insert() en Reverse(). De Queue class maak gebruik van de methoden Enqueue en Dequeue om objecten toe te voegen om te verwijderen. De Stack class maak gebruik van de methoden Push en Pop om objecten toe te voegen en te verwijderen. Gebruik Queue.Peek en Stack.Peek om een object te benaderen zonder deze te verwijderen. Dictionaries verbinden keys met values. Het .NET Framework kent de volgende dictionary classes: Hashtable - Een dictionary met name

Hoofdstuk 3 - Les 2

American Standard Code for Information Interchange (ASCII) is de organisatie voor encoding types.ASCII is 7 bits en gebruikt dus nummers van 0 - 127. Hierin is ons alfabet in opgeslagen, zowel hoofd als kleine letters en alle cijfers en nog een aantal bijzondere tekens, zoals bijv de plus en min tekens. Vele (Oosterse) talen kunnen hun karakters niet kwijt in ASCII. Om deze reden heeft het American National Standars Institute (ANSI) code pagina's gedefinieerd die de standaard ASCII karakters bevat plus taal specifieke karakters toegevoegd in de range van 128 - 255. Een code pagina is een lijst met geselecteerde karakter codes. Als een website wordt bekeken en er worden ? getoond in de tekst wat eigenlijk tekst had moeten zijn, dan is een verkeerd encoding type gebruikt. In e-mails wordt aangegeven wat het encoding type is: Content-type: text/plain; charset=ISO-8859-1 Content-type: text/plain; charset="Windows-1251" ISO-8859-1 corrospendeert met code pagina 28591, West Eur

Hoofdstuk 3 - Les 1

Afbeelding
Gaat over Regular Expressions. De basis moet worden begrepen:

Hoofdstuk 2 - Les 2

Om naar een tekstbestand te schrijven maak dan gebruik van TestReader of StreamReader: TextReader tr = File.Open(@"C:\myfile.txt"); Console.WriteLine(tr.ReadToEnd()); tr.Close(); Om met binaire bestanden te werken maak dan gebruik van BinaryWriter en BinaryReader: FileStream fs = new FileStream("data.txt", FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); for(int i = 0; i <= 10; i++) { bw.Write((int)i); } bw.Close(); fs.Close(); fs = new FileStream("data.txt", FileMode.Read); BinaryReader br = new BinaryReader(fs); for(int i = 0; i <= 10; i++) { Console.WriteLine(r.ReadInt32()); } br.Close(); fs.Close(); Met de MemoryStream wordt niet naar een bestand geschreven, maar naar het geheugen, waarna het vervolgens naar een bestand oid kan worden geschreven. Ook kan gebruik gemaakt worden van de compressed streams, zoals GZipStream. Isolated storage is een prive bestandssysteem dat wordt beheerd door het .NET Framework. Om hier naar toe te schri

Hoofdstuk 2 - Les 1

Om alle drives weer te geven die op een computer zijn aangesloten kan je gebruik maken van: foreach(DriveInfo di in DriveInfo.GetDrives()) { Console.WriteLine("{0} ({1})", di.Name, di.DriveType); } Gebruik de DirectoryInfo class om door bestanden mappen te bladeren. Maak hiervoor eerst een instantie van deze class en roep dan de methodes GetDirectories() of GetFiles() aan: DirectoryInfo dir = new DirectoryInfo(@"C:\Windows"); Console.WriteLine("Mappen:"); foreach(DirectoryInfo map in dir.GetDirectories()) { Console.WriteLine(map.Name); Console.WriteLine("\\nFiles"); foreach(FileInfo bestand in dir.GetFiles()) { Console.WriteLine(bestand.Name); } } Maak voor het aanmaken van mappen gebruik van de Create method. Voor het nagaan of de map bestaat maak gebruik van de Exists methode. Beide methods zijn niet static. Om bestanden te maken, te verwijder, te kopieëren en te verplaatsen maak dan gebruik van de static methods File.Create()

Hoofdstuk 1 - Les 4

Implicit conversion is als de doel variabele de complete inhoud kan bevatten van de variabele waarvan gecast wordt: int i = 20; double d = i; Dit wordt ook widening conversion genoemd. Als de doel variabele de inhoud van de variabele niet geheel kan bevatten wordt dit narrowing conversion genoemd: double d = 100.50; int i = d; Deze manier van converteren kan worden opgelost met behulp van de volgende manieren: System.Convert() type.ToString() type.Parse type.TryParse() Boxing en unboxing Boxing converteert een value type naar een reference type en unboxing converteert een reference type naar een value type. Boxing: int = 123; object 0 = (object)i; Unboxing: object o = 123; i = (int)o; Boxing en unboxing zorgen voor overhead dus probeer het te vermijden. Boxing treedt ook op wanneer virtual methods worden aangeroepen van value types, zoals ToString(). Tips om boxing te voorkomen: Implementeer type specifieke versies (overloads) voor een method die meerdere verschillende value types acc

Hoofdstuk 1 - Les 3

Interfaces bepalen hoe een class eruit komt te zijn. Er kan worden vastgelegd welke methods en properties de class minimaal moet bevatten. Veelgebruikte interfaces zijn: IComparable Wordt geïmplementeerd bij types waarvan de waarden kunnen worden geordend IDisposable Definieert methods voor disposing handmatig. Deze interface is belangrijk voor grote objecten die veel resources (geheugen) in gebruik nemen. IConvertible Maakt het mogelijk om een class te converteren naar een basis type, zoals boolean, byte, double of string ICloneable Ondersteunt het kopiëren van een object IEquatable Voor het vergelijken van een class op gelijkheid. Als je deze interface zou implementeren kan je zeggen if (a == c) IFormattable Staat het toe om de waarde van een object te converteren naar een specifiek geformatteerde string Attributen Attributen beschrijven de wijze waarop een type, method of property behandeld moet worden. Zo kun je bijvoorbeeld [Serializable] boven aan class zetten om aan te geven dat

Hoofdstuk 1 - Les 2

Reference types Reference types slaan het adres (de referentie) van de data op in de stack. De data waar het adres naar refereert is opgeslagen in een gebied in het geheugen, genaamd de heap. Runtime wordt het geheugen beheert door de garabage collector. Alles wat niet erft van System.ValueType is een reference type. Het .NET Framwork kent zo'n 2500 ingebouwde reference types. Zowel reference types als value types erven van object. Strings Strings van het type System.String zijn niet aan te passen. Dat wil zeggen dat met onderstaande code 3 strings worden aangemaakt, waarvan de eerste twee worden opgeruimd door de garbage collector en de derde een referentie bevat naar de inhoud. string s = "hello"; s += " world"; s+= "!"; Voor performance doeleinden wordt aangeraden om gebruikte maken van de volgende manieren: Gebruik de methoden Concat, Join of Format van de String class om meerdere elementen samen te voegen in een statement. Gebruik de StringBuilder

Hoofdstuk 1 - Les 1

Int en boolean types zijn value types en worden opgeslagen op de stack. Er zijn drie soorten value types: Built-in types (int, boolean) User-defined types (structs) Enumerations Value types erven van Syste.ValueType. Een value type kan ook null bevatten. Gebruik hiervoor een van de volgende declaraties: Nullable<bool > b = null; bool? b = null; Beide declaraties geven hetzelfde resultaat.

SQL Veld updaten direct na een ALTER commando

Als een veld moet worden toegevoegd aan een tabel wordt het ALTER statement gebruikt: ALTER tabel ADD veldnaam type voorbeeld: ALTER tbl_Persoon ADD leeftijd int Soms is het nodig om direct na het aanmaken van het veld een waarde in te voegen. Je zou dan denken, voeg een UPDATE statement uit na de ALTER: ALTER tbl_Persoon ADD leeftijd int UPDATE tbl_Persoon SET leeftijd = 18 Maar helaas, dit werkt niet. Waarom dit niet werkt weet ik niet precies (nu geen tijd om het verder uit te zoeken). Wat ik wel weet is de oplossing. Deze zijn er eigenlijk in twee vormen. De eerste manier is door het UPDATE statement uit te voeren in het Execute statement: ALTER tbl_Persoon ADD leeftijd int EXECUTE('UPDATE tbl_Persoon SET leeftijd = 18') De tweede manier (welke in mijn ogen netter is) is de volgende: ALTER tbl_Persoon ADD leeftijd int NOT NULL default 18 Deze manier kan je dus enkel gebruiken als je een veld toevoegt waarvan de waarden niet NULL mogen zijn.

[SQL] Tabel opnieuw laten tellen met autonummering

Omdat tijdens het testen veel dummy data in de database komt te zitten, is het wel eens lekker om die tabel te legen en dan opnieuw te beginnen met autonummering. Dit kan eenvoudig met een SQL statement: DELETE FROM naam_tabel DBCC CHECKIDENT ("naam_tabel", reseed, 0) Bij het DBCC commando kan je van de 0 ook een ander willekeurig getal plaatsen. Dit is de start vanaf welk getal hij opnieuw moet beginnen te tellen. bron: http://blog.sqlauthority.com/2007/03/15/sql-server-dbcc-reseed-table-identity-value-reset-table-identity/

Binair tellen

Hoe zat dat ook alweer. Binair tellen. Even om het geheugen op te frissen. Het binaire talstelsel bestaan uit twee getallen, namelijk 0 en 1. Een bit is een 0 of 1. 8 bits wordt een byte genoemd. Om een binair getal om te zetten naar het decimale talstelsel kan van de volgende manier gebruik gemaakt worden. Je telt hier van rechts naar links. Stel je heb het volgende binaire getal: 0011. Dit is in het decimale talstelsel het getal 3. Hoe kom je hier nu aan? Wel als volgt. Met de nullen wordt niks gedaan. Je begint met het zoeken naar de positie van de eerste 1. In het voorbeeld 0011 staat de eerste 1 op de eerste positie (je begint rechts met tellen). Vervolgens zoek je naar de volgende positite van een 1. In dit geval is dat de tweede positie. Nu bereken je 2 tot de macht positie-1. Vervolgens tel je alle decimale getallen bij elkaar op en je heb de waarde in het decimale talstelsel. Let wel op: als er op de eerste positie een 1 staat, is dat ook een 1 in het decimale talstelsel. Voor

[HTML] favicon gebruiken

Voor mijn project wilde ik graag zo'n mooi icoontje in de adresbalk. Om dit te bewerkstelligen hoef je enkel 1 regeltje in de head-tag te plaatsen van je site: <HTML> <HEAD> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/> </HEAD> <BODY> Hier de inhoud van de site </BODY> </HTML> Punt waar wel rekening mee moet worden gehouden is dat het .ico bestand de afmetingen 16x16 moet hebben en 8bit. Een site waar je handig favicons kunt creeeren is: http://www.favicon.cc/